xref: /aosp_15_r20/external/clang/test/PCH/pragma-loop.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-pch -o %t.a %s
2*67e74705SXin Li // RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
3*67e74705SXin Li 
4*67e74705SXin Li // FIXME: A bug in ParsedAttributes causes the order of the attributes to be
5*67e74705SXin Li // reversed. The checks are consequently in the reverse order below.
6*67e74705SXin Li 
7*67e74705SXin Li // CHECK: #pragma clang loop unroll_count(16)
8*67e74705SXin Li // CHECK: #pragma clang loop interleave_count(8)
9*67e74705SXin Li // CHECK: #pragma clang loop vectorize_width(4)
10*67e74705SXin Li // CHECK: #pragma clang loop distribute(enable)
11*67e74705SXin Li // CHECK: #pragma clang loop unroll(disable)
12*67e74705SXin Li // CHECK: #pragma clang loop interleave(disable)
13*67e74705SXin Li // CHECK: #pragma clang loop vectorize(enable)
14*67e74705SXin Li // CHECK: #pragma clang loop distribute(disable)
15*67e74705SXin Li // CHECK: #pragma clang loop unroll(full)
16*67e74705SXin Li // CHECK: #pragma clang loop interleave(enable)
17*67e74705SXin Li // CHECK: #pragma clang loop vectorize(disable)
18*67e74705SXin Li // CHECK: #pragma unroll
19*67e74705SXin Li // CHECK: #pragma unroll (32)
20*67e74705SXin Li // CHECK: #pragma nounroll
21*67e74705SXin Li // CHECK: #pragma clang loop interleave_count(I)
22*67e74705SXin Li // CHECK: #pragma clang loop vectorize_width(V)
23*67e74705SXin Li 
24*67e74705SXin Li #ifndef HEADER
25*67e74705SXin Li #define HEADER
26*67e74705SXin Li 
27*67e74705SXin Li class pragma_test {
28*67e74705SXin Li public:
run1(int * List,int Length)29*67e74705SXin Li   inline void run1(int *List, int Length) {
30*67e74705SXin Li     int i = 0;
31*67e74705SXin Li #pragma clang loop vectorize_width(4)
32*67e74705SXin Li #pragma clang loop interleave_count(8)
33*67e74705SXin Li #pragma clang loop unroll_count(16)
34*67e74705SXin Li     while (i < Length) {
35*67e74705SXin Li       List[i] = i;
36*67e74705SXin Li       i++;
37*67e74705SXin Li     }
38*67e74705SXin Li   }
39*67e74705SXin Li 
run2(int * List,int Length)40*67e74705SXin Li   inline void run2(int *List, int Length) {
41*67e74705SXin Li     int i = 0;
42*67e74705SXin Li #pragma clang loop vectorize(enable)
43*67e74705SXin Li #pragma clang loop interleave(disable)
44*67e74705SXin Li #pragma clang loop unroll(disable)
45*67e74705SXin Li #pragma clang loop distribute(enable)
46*67e74705SXin Li     while (i - 1 < Length) {
47*67e74705SXin Li       List[i] = i;
48*67e74705SXin Li       i++;
49*67e74705SXin Li     }
50*67e74705SXin Li   }
51*67e74705SXin Li 
run3(int * List,int Length)52*67e74705SXin Li   inline void run3(int *List, int Length) {
53*67e74705SXin Li     int i = 0;
54*67e74705SXin Li #pragma clang loop vectorize(disable)
55*67e74705SXin Li #pragma clang loop interleave(enable)
56*67e74705SXin Li #pragma clang loop unroll(full)
57*67e74705SXin Li #pragma clang loop distribute(disable)
58*67e74705SXin Li     while (i - 3 < Length) {
59*67e74705SXin Li       List[i] = i;
60*67e74705SXin Li       i++;
61*67e74705SXin Li     }
62*67e74705SXin Li   }
63*67e74705SXin Li 
run4(int * List,int Length)64*67e74705SXin Li   inline void run4(int *List, int Length) {
65*67e74705SXin Li     int i = 0;
66*67e74705SXin Li #pragma unroll
67*67e74705SXin Li     while (i - 3 < Length) {
68*67e74705SXin Li       List[i] = i;
69*67e74705SXin Li       i++;
70*67e74705SXin Li     }
71*67e74705SXin Li   }
72*67e74705SXin Li 
run5(int * List,int Length)73*67e74705SXin Li   inline void run5(int *List, int Length) {
74*67e74705SXin Li     int i = 0;
75*67e74705SXin Li #pragma unroll 32
76*67e74705SXin Li     while (i - 3 < Length) {
77*67e74705SXin Li       List[i] = i;
78*67e74705SXin Li       i++;
79*67e74705SXin Li     }
80*67e74705SXin Li   }
81*67e74705SXin Li 
run6(int * List,int Length)82*67e74705SXin Li   inline void run6(int *List, int Length) {
83*67e74705SXin Li     int i = 0;
84*67e74705SXin Li #pragma nounroll
85*67e74705SXin Li     while (i - 3 < Length) {
86*67e74705SXin Li       List[i] = i;
87*67e74705SXin Li       i++;
88*67e74705SXin Li     }
89*67e74705SXin Li   }
90*67e74705SXin Li 
91*67e74705SXin Li   template <int V, int I>
run7(int * List,int Length)92*67e74705SXin Li   inline void run7(int *List, int Length) {
93*67e74705SXin Li #pragma clang loop vectorize_width(V)
94*67e74705SXin Li #pragma clang loop interleave_count(I)
95*67e74705SXin Li     for (int i = 0; i < Length; i++) {
96*67e74705SXin Li       List[i] = i;
97*67e74705SXin Li     }
98*67e74705SXin Li   }
99*67e74705SXin Li };
100*67e74705SXin Li #else
101*67e74705SXin Li 
test()102*67e74705SXin Li void test() {
103*67e74705SXin Li   int List[100];
104*67e74705SXin Li 
105*67e74705SXin Li   pragma_test pt;
106*67e74705SXin Li 
107*67e74705SXin Li   pt.run1(List, 100);
108*67e74705SXin Li   pt.run2(List, 100);
109*67e74705SXin Li   pt.run3(List, 100);
110*67e74705SXin Li   pt.run4(List, 100);
111*67e74705SXin Li   pt.run5(List, 100);
112*67e74705SXin Li   pt.run6(List, 100);
113*67e74705SXin Li   pt.run7<2, 4>(List, 100);
114*67e74705SXin Li }
115*67e74705SXin Li 
116*67e74705SXin Li #endif
117