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
25class pragma_test {
26public:
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
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
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
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
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
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>
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
98void 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