Home | History | Annotate | Download | only in PCH
      1 // RUN: %clang_cc1 -emit-pch -o %t.a %s
      2 // RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
      3 
      4 // FIXME: A bug in ParsedAttributes causes the order of the attributes to be
      5 // reversed. The checks are consequently in the reverse order below.
      6 
      7 // CHECK: #pragma clang loop unroll_count(16)
      8 // CHECK: #pragma clang loop interleave_count(8)
      9 // CHECK: #pragma clang loop vectorize_width(4)
     10 // CHECK: #pragma clang loop distribute(enable)
     11 // CHECK: #pragma clang loop unroll(disable)
     12 // CHECK: #pragma clang loop interleave(disable)
     13 // CHECK: #pragma clang loop vectorize(enable)
     14 // CHECK: #pragma clang loop distribute(disable)
     15 // CHECK: #pragma clang loop unroll(full)
     16 // CHECK: #pragma clang loop interleave(enable)
     17 // CHECK: #pragma clang loop vectorize(disable)
     18 // CHECK: #pragma unroll
     19 // CHECK: #pragma unroll (32)
     20 // CHECK: #pragma nounroll
     21 // CHECK: #pragma clang loop interleave_count(I)
     22 // CHECK: #pragma clang loop vectorize_width(V)
     23 
     24 #ifndef HEADER
     25 #define HEADER
     26 
     27 class pragma_test {
     28 public:
     29   inline void run1(int *List, int Length) {
     30     int i = 0;
     31 #pragma clang loop vectorize_width(4)
     32 #pragma clang loop interleave_count(8)
     33 #pragma clang loop unroll_count(16)
     34     while (i < Length) {
     35       List[i] = i;
     36       i++;
     37     }
     38   }
     39 
     40   inline void run2(int *List, int Length) {
     41     int i = 0;
     42 #pragma clang loop vectorize(enable)
     43 #pragma clang loop interleave(disable)
     44 #pragma clang loop unroll(disable)
     45 #pragma clang loop distribute(enable)
     46     while (i - 1 < Length) {
     47       List[i] = i;
     48       i++;
     49     }
     50   }
     51 
     52   inline void run3(int *List, int Length) {
     53     int i = 0;
     54 #pragma clang loop vectorize(disable)
     55 #pragma clang loop interleave(enable)
     56 #pragma clang loop unroll(full)
     57 #pragma clang loop distribute(disable)
     58     while (i - 3 < Length) {
     59       List[i] = i;
     60       i++;
     61     }
     62   }
     63 
     64   inline void run4(int *List, int Length) {
     65     int i = 0;
     66 #pragma unroll
     67     while (i - 3 < Length) {
     68       List[i] = i;
     69       i++;
     70     }
     71   }
     72 
     73   inline void run5(int *List, int Length) {
     74     int i = 0;
     75 #pragma unroll 32
     76     while (i - 3 < Length) {
     77       List[i] = i;
     78       i++;
     79     }
     80   }
     81 
     82   inline void run6(int *List, int Length) {
     83     int i = 0;
     84 #pragma nounroll
     85     while (i - 3 < Length) {
     86       List[i] = i;
     87       i++;
     88     }
     89   }
     90 
     91   template <int V, int I>
     92   inline void run7(int *List, int Length) {
     93 #pragma clang loop vectorize_width(V)
     94 #pragma clang loop interleave_count(I)
     95     for (int i = 0; i < Length; i++) {
     96       List[i] = i;
     97     }
     98   }
     99 };
    100 #else
    101 
    102 void test() {
    103   int List[100];
    104 
    105   pragma_test pt;
    106 
    107   pt.run1(List, 100);
    108   pt.run2(List, 100);
    109   pt.run3(List, 100);
    110   pt.run4(List, 100);
    111   pt.run5(List, 100);
    112   pt.run6(List, 100);
    113   pt.run7<2, 4>(List, 100);
    114 }
    115 
    116 #endif
    117