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 
20 #ifndef HEADER
21 #define HEADER
22 
23 class pragma_test {
24 public:
25   inline void run1(int *List, int Length) {
26     int i = 0;
27 #pragma clang loop vectorize_width(4)
28 #pragma clang loop interleave_count(8)
29 #pragma clang loop unroll_count(16)
30     while (i < Length) {
31       List[i] = i;
32       i++;
33     }
34   }
35 
36   inline void run2(int *List, int Length) {
37     int i = 0;
38 #pragma clang loop vectorize(enable)
39 #pragma clang loop interleave(disable)
40 #pragma clang loop unroll(disable)
41     while (i - 1 < Length) {
42       List[i] = i;
43       i++;
44     }
45   }
46 
47   inline void run3(int *List, int Length) {
48     int i = 0;
49 #pragma clang loop vectorize(disable)
50 #pragma clang loop interleave(enable)
51 #pragma clang loop unroll(full)
52     while (i - 3 < Length) {
53       List[i] = i;
54       i++;
55     }
56   }
57 
58   inline void run4(int *List, int Length) {
59     int i = 0;
60 #pragma unroll
61     while (i - 3 < Length) {
62       List[i] = i;
63       i++;
64     }
65   }
66 
67   inline void run5(int *List, int Length) {
68     int i = 0;
69 #pragma unroll 32
70     while (i - 3 < Length) {
71       List[i] = i;
72       i++;
73     }
74   }
75 
76   inline void run6(int *List, int Length) {
77     int i = 0;
78 #pragma nounroll
79     while (i - 3 < Length) {
80       List[i] = i;
81       i++;
82     }
83   }
84 };
85 #else
86 
87 void test() {
88   int List[100];
89 
90   pragma_test pt;
91 
92   pt.run1(List, 100);
93   pt.run2(List, 100);
94   pt.run3(List, 100);
95   pt.run4(List, 100);
96   pt.run5(List, 100);
97   pt.run6(List, 100);
98 }
99 
100 #endif
101