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 // CHECK: #pragma clang loop vectorize_width(4)
5 // CHECK: #pragma clang loop interleave_count(8)
6 // CHECK: #pragma clang loop unroll_count(16){{$}}
7 // CHECK: #pragma clang loop vectorize(enable)
8 // CHECK: #pragma clang loop interleave(disable)
9 // CHECK: #pragma clang loop unroll(disable)
10 // CHECK: #pragma clang loop distribute(enable)
11 // CHECK: #pragma clang loop vectorize(disable)
12 // CHECK: #pragma clang loop interleave(enable)
13 // CHECK: #pragma clang loop unroll(full)
14 // CHECK: #pragma clang loop distribute(disable)
15 // FIXME: "#pragma unroll (enable)" is invalid and is not the input source.
16 // CHECK: #pragma unroll (enable){{$}}
17 // CHECK: #pragma unroll (32){{$}}
18 // CHECK: #pragma nounroll{{$}}
19 // CHECK: #pragma clang loop vectorize_width(V)
20 // CHECK: #pragma clang loop interleave_count(I)
21 
22 #ifndef HEADER
23 #define HEADER
24 
25 class pragma_test {
26 public:
run1(int * List,int Length)27   inline void run1(int *List, int Length) {
28     int i = 0;
29 #pragma clang loop vectorize_width(4)
30 #pragma clang loop interleave_count(8)
31 #pragma clang loop unroll_count(16)
32     while (i < Length) {
33       List[i] = i;
34       i++;
35     }
36   }
37 
run2(int * List,int Length)38   inline void run2(int *List, int Length) {
39     int i = 0;
40 #pragma clang loop vectorize(enable)
41 #pragma clang loop interleave(disable)
42 #pragma clang loop unroll(disable)
43 #pragma clang loop distribute(enable)
44     while (i - 1 < Length) {
45       List[i] = i;
46       i++;
47     }
48   }
49 
run3(int * List,int Length)50   inline void run3(int *List, int Length) {
51     int i = 0;
52 #pragma clang loop vectorize(disable)
53 #pragma clang loop interleave(enable)
54 #pragma clang loop unroll(full)
55 #pragma clang loop distribute(disable)
56     while (i - 3 < Length) {
57       List[i] = i;
58       i++;
59     }
60   }
61 
run4(int * List,int Length)62   inline void run4(int *List, int Length) {
63     int i = 0;
64 #pragma unroll
65     while (i - 3 < Length) {
66       List[i] = i;
67       i++;
68     }
69   }
70 
run5(int * List,int Length)71   inline void run5(int *List, int Length) {
72     int i = 0;
73 #pragma unroll 32
74     while (i - 3 < Length) {
75       List[i] = i;
76       i++;
77     }
78   }
79 
run6(int * List,int Length)80   inline void run6(int *List, int Length) {
81     int i = 0;
82 #pragma nounroll
83     while (i - 3 < Length) {
84       List[i] = i;
85       i++;
86     }
87   }
88 
89   template <int V, int I>
run7(int * List,int Length)90   inline void run7(int *List, int Length) {
91 #pragma clang loop vectorize_width(V)
92 #pragma clang loop interleave_count(I)
93     for (int i = 0; i < Length; i++) {
94       List[i] = i;
95     }
96   }
97 };
98 #else
99 
test()100 void test() {
101   int List[100];
102 
103   pragma_test pt;
104 
105   pt.run1(List, 100);
106   pt.run2(List, 100);
107   pt.run3(List, 100);
108   pt.run4(List, 100);
109   pt.run5(List, 100);
110   pt.run6(List, 100);
111   pt.run7<2, 4>(List, 100);
112 }
113 
114 #endif
115