1b06b15aaSAaron Ballman // RUN: %clang_cc1 -emit-pch -o %t.a %s
2b06b15aaSAaron Ballman // RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
3b06b15aaSAaron Ballman 
441dd6cedSMichael Kruse // CHECK: #pragma clang loop vectorize_width(4)
5*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop interleave_count(8)
6*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop unroll_count(16){{$}}
741dd6cedSMichael Kruse // CHECK: #pragma clang loop vectorize(enable)
8*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop interleave(disable)
9*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop unroll(disable)
10*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop distribute(enable)
1141dd6cedSMichael Kruse // CHECK: #pragma clang loop vectorize(disable)
12*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop interleave(enable)
13*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop unroll(full)
14*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop distribute(disable)
15cbecfdfeSAlexey Bataev // FIXME: "#pragma unroll (enable)" is invalid and is not the input source.
16cbecfdfeSAlexey Bataev // CHECK: #pragma unroll (enable){{$}}
17cbecfdfeSAlexey Bataev // CHECK: #pragma unroll (32){{$}}
18cbecfdfeSAlexey Bataev // CHECK: #pragma nounroll{{$}}
1941dd6cedSMichael Kruse // CHECK: #pragma clang loop vectorize_width(V)
20*dc5ce72aSMichael Kruse // CHECK: #pragma clang loop interleave_count(I)
21b06b15aaSAaron Ballman 
22b06b15aaSAaron Ballman #ifndef HEADER
23b06b15aaSAaron Ballman #define HEADER
24b06b15aaSAaron Ballman 
25b06b15aaSAaron Ballman class pragma_test {
26b06b15aaSAaron Ballman public:
run1(int * List,int Length)27b06b15aaSAaron Ballman   inline void run1(int *List, int Length) {
28b06b15aaSAaron Ballman     int i = 0;
29b06b15aaSAaron Ballman #pragma clang loop vectorize_width(4)
30b06b15aaSAaron Ballman #pragma clang loop interleave_count(8)
3186483b3aSEli Bendersky #pragma clang loop unroll_count(16)
32b06b15aaSAaron Ballman     while (i < Length) {
33b06b15aaSAaron Ballman       List[i] = i;
34b06b15aaSAaron Ballman       i++;
35b06b15aaSAaron Ballman     }
36b06b15aaSAaron Ballman   }
37b06b15aaSAaron Ballman 
run2(int * List,int Length)38b06b15aaSAaron Ballman   inline void run2(int *List, int Length) {
39b06b15aaSAaron Ballman     int i = 0;
40b06b15aaSAaron Ballman #pragma clang loop vectorize(enable)
41b06b15aaSAaron Ballman #pragma clang loop interleave(disable)
4286483b3aSEli Bendersky #pragma clang loop unroll(disable)
432de463ecSAdam Nemet #pragma clang loop distribute(enable)
44b06b15aaSAaron Ballman     while (i - 1 < Length) {
45b06b15aaSAaron Ballman       List[i] = i;
46b06b15aaSAaron Ballman       i++;
47b06b15aaSAaron Ballman     }
48b06b15aaSAaron Ballman   }
49b06b15aaSAaron Ballman 
run3(int * List,int Length)50b06b15aaSAaron Ballman   inline void run3(int *List, int Length) {
51b06b15aaSAaron Ballman     int i = 0;
52b06b15aaSAaron Ballman #pragma clang loop vectorize(disable)
53b06b15aaSAaron Ballman #pragma clang loop interleave(enable)
54450c2384SMark Heffernan #pragma clang loop unroll(full)
552de463ecSAdam Nemet #pragma clang loop distribute(disable)
56b06b15aaSAaron Ballman     while (i - 3 < Length) {
57b06b15aaSAaron Ballman       List[i] = i;
58b06b15aaSAaron Ballman       i++;
59b06b15aaSAaron Ballman     }
60b06b15aaSAaron Ballman   }
61bd26f5eaSMark Heffernan 
run4(int * List,int Length)62bd26f5eaSMark Heffernan   inline void run4(int *List, int Length) {
63bd26f5eaSMark Heffernan     int i = 0;
64bd26f5eaSMark Heffernan #pragma unroll
65bd26f5eaSMark Heffernan     while (i - 3 < Length) {
66bd26f5eaSMark Heffernan       List[i] = i;
67bd26f5eaSMark Heffernan       i++;
68bd26f5eaSMark Heffernan     }
69bd26f5eaSMark Heffernan   }
70bd26f5eaSMark Heffernan 
run5(int * List,int Length)71bd26f5eaSMark Heffernan   inline void run5(int *List, int Length) {
72bd26f5eaSMark Heffernan     int i = 0;
73bd26f5eaSMark Heffernan #pragma unroll 32
74bd26f5eaSMark Heffernan     while (i - 3 < Length) {
75bd26f5eaSMark Heffernan       List[i] = i;
76bd26f5eaSMark Heffernan       i++;
77bd26f5eaSMark Heffernan     }
78bd26f5eaSMark Heffernan   }
79b06b15aaSAaron Ballman 
run6(int * List,int Length)80c888e41cSMark Heffernan   inline void run6(int *List, int Length) {
81c888e41cSMark Heffernan     int i = 0;
82c888e41cSMark Heffernan #pragma nounroll
83c888e41cSMark Heffernan     while (i - 3 < Length) {
84c888e41cSMark Heffernan       List[i] = i;
85c888e41cSMark Heffernan       i++;
86c888e41cSMark Heffernan     }
87c888e41cSMark Heffernan   }
88c724a83eSTyler Nowicki 
89c724a83eSTyler Nowicki   template <int V, int I>
run7(int * List,int Length)90c724a83eSTyler Nowicki   inline void run7(int *List, int Length) {
91c724a83eSTyler Nowicki #pragma clang loop vectorize_width(V)
92c724a83eSTyler Nowicki #pragma clang loop interleave_count(I)
93c724a83eSTyler Nowicki     for (int i = 0; i < Length; i++) {
94c724a83eSTyler Nowicki       List[i] = i;
95c724a83eSTyler Nowicki     }
96c724a83eSTyler Nowicki   }
97c888e41cSMark Heffernan };
98b06b15aaSAaron Ballman #else
99b06b15aaSAaron Ballman 
test()100b06b15aaSAaron Ballman void test() {
101b06b15aaSAaron Ballman   int List[100];
102b06b15aaSAaron Ballman 
103b06b15aaSAaron Ballman   pragma_test pt;
104b06b15aaSAaron Ballman 
105b06b15aaSAaron Ballman   pt.run1(List, 100);
106b06b15aaSAaron Ballman   pt.run2(List, 100);
107b06b15aaSAaron Ballman   pt.run3(List, 100);
108bd26f5eaSMark Heffernan   pt.run4(List, 100);
109bd26f5eaSMark Heffernan   pt.run5(List, 100);
110c888e41cSMark Heffernan   pt.run6(List, 100);
111c724a83eSTyler Nowicki   pt.run7<2, 4>(List, 100);
112b06b15aaSAaron Ballman }
113b06b15aaSAaron Ballman 
114b06b15aaSAaron Ballman #endif
115