Clang Project

clang_source_code/test/PCH/pragma-loop.cpp
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// CHECK: #pragma clang loop vectorize_width(4)
5// CHECK: #pragma clang loop interleave_count(8)
6// CHECK: #pragma clang loop unroll_count(16){{$}}
7// CHECK: #pragma clang loop vectorize(enable)
8// CHECK: #pragma clang loop interleave(disable)
9// CHECK: #pragma clang loop unroll(disable)
10// CHECK: #pragma clang loop distribute(enable)
11// CHECK: #pragma clang loop vectorize(disable)
12// CHECK: #pragma clang loop interleave(enable)
13// CHECK: #pragma clang loop unroll(full)
14// CHECK: #pragma clang loop distribute(disable)
15// FIXME: "#pragma unroll (enable)" is invalid and is not the input source.
16// CHECK: #pragma unroll (enable){{$}}
17// CHECK: #pragma unroll (32){{$}}
18// CHECK: #pragma nounroll{{$}}
19// CHECK: #pragma clang loop vectorize_width(V)
20// CHECK: #pragma clang loop interleave_count(I)
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#pragma clang loop distribute(enable)
44    while (i - 1 < Length) {
45      List[i] = i;
46      i++;
47    }
48  }
49
50  inline void run3(int *List, int Length) {
51    int i = 0;
52#pragma clang loop vectorize(disable)
53#pragma clang loop interleave(enable)
54#pragma clang loop unroll(full)
55#pragma clang loop distribute(disable)
56    while (i - 3 < Length) {
57      List[i] = i;
58      i++;
59    }
60  }
61
62  inline void run4(int *List, int Length) {
63    int i = 0;
64#pragma unroll
65    while (i - 3 < Length) {
66      List[i] = i;
67      i++;
68    }
69  }
70
71  inline void run5(int *List, int Length) {
72    int i = 0;
73#pragma unroll 32
74    while (i - 3 < Length) {
75      List[i] = i;
76      i++;
77    }
78  }
79
80  inline void run6(int *List, int Length) {
81    int i = 0;
82#pragma nounroll
83    while (i - 3 < Length) {
84      List[i] = i;
85      i++;
86    }
87  }
88
89  template <int V, int I>
90  inline void run7(int *List, int Length) {
91#pragma clang loop vectorize_width(V)
92#pragma clang loop interleave_count(I)
93    for (int i = 0; i < Length; i++) {
94      List[i] = i;
95    }
96  }
97};
98#else
99
100void test() {
101  int List[100];
102
103  pragma_test pt;
104
105  pt.run1(List, 100);
106  pt.run2(List, 100);
107  pt.run3(List, 100);
108  pt.run4(List, 100);
109  pt.run5(List, 100);
110  pt.run6(List, 100);
111  pt.run7<2, 4>(List, 100);
112}
113
114#endif
115