1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -emit-pch -o %t.a %s
2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
3ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// FIXME: A bug in ParsedAttributes causes the order of the attributes to be
5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// reversed. The checks are consequently in the reverse order below.
6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
7ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop unroll_count(16)
8ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop interleave_count(8)
9ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop vectorize_width(4)
10ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop unroll(disable)
11ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop interleave(disable)
12ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop vectorize(enable)
13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop unroll(enable)
14ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop interleave(enable)
15ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: #pragma clang loop vectorize(disable)
16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
17ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#ifndef HEADER
18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define HEADER
19ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
20ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass pragma_test {
21ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  inline void run1(int *List, int Length) {
23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int i = 0;
24ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop vectorize_width(4)
25ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop interleave_count(8)
26ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop unroll_count(16)
27ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    while (i < Length) {
28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      List[i] = i;
29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      i++;
30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
31ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  inline void run2(int *List, int Length) {
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int i = 0;
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop vectorize(enable)
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop interleave(disable)
37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop unroll(disable)
38ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    while (i - 1 < Length) {
39ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      List[i] = i;
40ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      i++;
41ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  inline void run3(int *List, int Length) {
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int i = 0;
46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop vectorize(disable)
47ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop interleave(enable)
48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma clang loop unroll(enable)
49ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    while (i - 3 < Length) {
50ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      List[i] = i;
51ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      i++;
52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
56ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#else
57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
58ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test() {
59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int List[100];
60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  pragma_test pt;
62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  pt.run1(List, 100);
64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  pt.run2(List, 100);
65ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  pt.run3(List, 100);
66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#endif
69