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 unroll(disable)
11 // CHECK: #pragma clang loop interleave(disable)
12 // CHECK: #pragma clang loop vectorize(enable)
13 // CHECK: #pragma clang loop unroll(full)
14 // CHECK: #pragma clang loop interleave(enable)
15 // CHECK: #pragma clang loop vectorize(disable)
16 // CHECK: #pragma unroll
17 // CHECK: #pragma unroll (32)
18 // CHECK: #pragma nounroll
19 // CHECK: #pragma clang loop interleave_count(I)
20 // CHECK: #pragma clang loop vectorize_width(V)
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     while (i - 1 < Length) {
44       List[i] = i;
45       i++;
46     }
47   }
48 
run3(int * List,int Length)49   inline void run3(int *List, int Length) {
50     int i = 0;
51 #pragma clang loop vectorize(disable)
52 #pragma clang loop interleave(enable)
53 #pragma clang loop unroll(full)
54     while (i - 3 < Length) {
55       List[i] = i;
56       i++;
57     }
58   }
59 
run4(int * List,int Length)60   inline void run4(int *List, int Length) {
61     int i = 0;
62 #pragma unroll
63     while (i - 3 < Length) {
64       List[i] = i;
65       i++;
66     }
67   }
68 
run5(int * List,int Length)69   inline void run5(int *List, int Length) {
70     int i = 0;
71 #pragma unroll 32
72     while (i - 3 < Length) {
73       List[i] = i;
74       i++;
75     }
76   }
77 
run6(int * List,int Length)78   inline void run6(int *List, int Length) {
79     int i = 0;
80 #pragma nounroll
81     while (i - 3 < Length) {
82       List[i] = i;
83       i++;
84     }
85   }
86 
87   template <int V, int I>
run7(int * List,int Length)88   inline void run7(int *List, int Length) {
89 #pragma clang loop vectorize_width(V)
90 #pragma clang loop interleave_count(I)
91     for (int i = 0; i < Length; i++) {
92       List[i] = i;
93     }
94   }
95 };
96 #else
97 
test()98 void test() {
99   int List[100];
100 
101   pragma_test pt;
102 
103   pt.run1(List, 100);
104   pt.run2(List, 100);
105   pt.run3(List, 100);
106   pt.run4(List, 100);
107   pt.run5(List, 100);
108   pt.run6(List, 100);
109   pt.run7<2, 4>(List, 100);
110 }
111 
112 #endif
113