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