1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -emit-pch -o %t.a %s
2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
3c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
4c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// FIXME: A bug in ParsedAttributes causes the order of the attributes to be
5c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// reversed. The checks are consequently in the reverse order below.
6c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
7c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop unroll_count(16)
8c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave_count(8)
9c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize_width(4)
10c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop unroll(disable)
11c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave(disable)
12c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize(enable)
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop unroll(full)
14c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave(enable)
15c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize(disable)
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma unroll
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma unroll (32)
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma nounroll
19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop interleave_count(I)
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop vectorize_width(V)
21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
22c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#ifndef HEADER
23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define HEADER
24c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
25c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass pragma_test {
26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
27c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  inline void run1(int *List, int Length) {
28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    int i = 0;
29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize_width(4)
30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave_count(8)
31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop unroll_count(16)
32c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    while (i < Length) {
33c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      List[i] = i;
34c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      i++;
35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  inline void run2(int *List, int Length) {
39c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    int i = 0;
40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize(enable)
41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave(disable)
42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop unroll(disable)
43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    while (i - 1 < Length) {
44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      List[i] = i;
45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      i++;
46c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  inline void run3(int *List, int Length) {
50c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    int i = 0;
51c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize(disable)
52c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave(enable)
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop unroll(full)
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    while (i - 3 < Length) {
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      List[i] = i;
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      i++;
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inline void run4(int *List, int Length) {
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int i = 0;
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    while (i - 3 < Length) {
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      List[i] = i;
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      i++;
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inline void run5(int *List, int Length) {
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int i = 0;
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll 32
72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    while (i - 3 < Length) {
73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      List[i] = i;
74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      i++;
75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
77c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inline void run6(int *List, int Length) {
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int i = 0;
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    while (i - 3 < Length) {
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      List[i] = i;
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      i++;
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  template <int V, int I>
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inline void run7(int *List, int Length) {
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop vectorize_width(V)
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop interleave_count(I)
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (int i = 0; i < Length; i++) {
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      List[i] = i;
93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
96c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#else
97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test() {
99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int List[100];
100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  pragma_test pt;
102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  pt.run1(List, 100);
104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  pt.run2(List, 100);
105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  pt.run3(List, 100);
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  pt.run4(List, 100);
107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  pt.run5(List, 100);
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  pt.run6(List, 100);
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  pt.run7<2, 4>(List, 100);
110c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
111c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
112c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#endif
113