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