[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / OpenMP / interchange_ast_print.cpp
blob4b0818ff6eb7f9a3d0223179f7a28d5f89eb9da2
1 // Check no warnings/errors
2 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -fsyntax-only -verify %s
3 // expected-no-diagnostics
5 // Check AST and unparsing
6 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -ast-dump %s | FileCheck %s --check-prefix=DUMP
7 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix=PRINT
9 // Check same results after serialization round-trip
10 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
12 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++20 -fopenmp -fopenmp-version=60 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
14 #ifndef HEADER
15 #define HEADER
17 // placeholder for loop body code.
18 extern "C" void body(...);
20 // PRINT-LABEL: void foo1(
21 // DUMP-LABEL: FunctionDecl {{.*}} foo1
22 void foo1() {
23 // PRINT: #pragma omp interchange
24 // DUMP: OMPInterchangeDirective
25 #pragma omp interchange
26 // PRINT: for (int i = 7; i < 17; i += 3)
27 // DUMP-NEXT: ForStmt
28 for (int i = 7; i < 17; i += 3)
29 // PRINT: for (int j = 7; j < 17; j += 3)
30 // DUMP: ForStmt
31 for (int j = 7; j < 17; j += 3)
32 // PRINT: body(i, j);
33 // DUMP: CallExpr
34 body(i, j);
38 // PRINT-LABEL: void foo2(
39 // DUMP-LABEL: FunctionDecl {{.*}} foo2
40 void foo2(int start1, int start2, int start3, int end1, int end2, int end3) {
41 // PRINT: #pragma omp interchange permutation(2, 3, 1)
42 // DUMP: OMPInterchangeDirective
43 // DUMP-NEXT: OMPPermutationClause
44 // DUMP-NEXT: ConstantExpr
45 // DUMP-NEXT: value: Int 2
46 // DUMP-NEXT: IntegerLiteral {{.*}} 2
47 // DUMP-NEXT: ConstantExpr
48 // DUMP-NEXT: value: Int 3
49 // DUMP-NEXT: IntegerLiteral {{.*}} 3
50 // DUMP-NEXT: ConstantExpr
51 // DUMP-NEXT: value: Int 1
52 // DUMP-NEXT: IntegerLiteral {{.*}} 1
53 #pragma omp interchange permutation(2,3,1)
54 // PRINT: for (int i = start1; i < end1; i += 1)
55 // DUMP-NEXT: ForStmt
56 for (int i = start1; i < end1; i += 1)
57 // PRINT: for (int j = start2; j < end2; j += 1)
58 // DUMP: ForStmt
59 for (int j = start2; j < end2; j += 1)
60 // PRINT: for (int k = start3; k < end3; k += 1)
61 // DUMP: ForStmt
62 for (int k = start3; k < end3; k += 1)
63 // PRINT: body(i, j, k);
64 // DUMP: CallExpr
65 body(i, j, k);
69 // PRINT-LABEL: void foo3(
70 // DUMP-LABEL: FunctionDecl {{.*}} foo3
71 void foo3() {
72 // PRINT: #pragma omp for collapse(3)
73 // DUMP: OMPForDirective
74 // DUMP-NEXT: OMPCollapseClause
75 // DUMP-NEXT: ConstantExpr
76 // DUMP-NEXT: value: Int 3
77 // DUMP-NEXT: IntegerLiteral {{.*}} 3
78 // DUMP-NEXT: CapturedStmt
79 // DUMP-NEXT: CapturedDecl
80 #pragma omp for collapse(3)
81 // PRINT: #pragma omp interchange
82 // DUMP: OMPInterchangeDirective
83 #pragma omp interchange
84 // PRINT: for (int i = 7; i < 17; i += 1)
85 // DUMP-NEXT: ForStmt
86 for (int i = 7; i < 17; i += 1)
87 // PRINT: for (int j = 7; j < 17; j += 1)
88 // DUMP: ForStmt
89 for (int j = 7; j < 17; j += 1)
90 // PRINT: for (int k = 7; k < 17; k += 1)
91 // DUMP: ForStmt
92 for (int k = 7; k < 17; k += 1)
93 // PRINT: body(i, j, k);
94 // DUMP: CallExpr
95 body(i, j, k);
99 // PRINT-LABEL: void foo4(
100 // DUMP-LABEL: FunctionDecl {{.*}} foo4
101 void foo4(int start, int end, int step) {
102 // PRINT: #pragma omp for collapse(3)
103 // DUMP: OMPForDirective
104 // DUMP-NEXT: OMPCollapseClause
105 // DUMP-NEXT: ConstantExpr
106 // DUMP-NEXT: value: Int 3
107 // DUMP-NEXT: IntegerLiteral {{.*}} 3
108 // DUMP-NEXT: CapturedStmt
109 // DUMP-NEXT: CapturedDecl
110 #pragma omp for collapse(3)
111 // PRINT: for (int i = 7; i < 17; i += 1)
112 // DUMP-NEXT: ForStmt
113 for (int i = 7; i < 17; i += 1)
114 // PRINT: #pragma omp interchange permutation(1)
115 // DUMP: OMPInterchangeDirective
116 // DUMP-NEXT: OMPPermutationClause
117 // DUMP-NEXT: ConstantExpr
118 // DUMP-NEXT: value: Int 1
119 // DUMP-NEXT: IntegerLiteral {{.*}} 1
120 #pragma omp interchange permutation(1)
121 // PRINT: for (int j = 7; j < 17; j += 1)
122 // DUMP-NEXT: ForStmt
123 for (int j = 7; j < 17; j += 1)
124 // PRINT: for (int k = 7; k < 17; k += 1)
125 // DUMP: ForStmt
126 for (int k = 7; k < 17; k += 1)
127 // PRINT: body(i, j, k);
128 // DUMP: CallExpr
129 body(i, j, k);
133 // PRINT-LABEL: void foo5(
134 // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo5
135 template<typename T, T P>
136 void foo5(T start, T end) {
137 // PRINT: #pragma omp for
138 // DUMP: OMPForDirective
139 #pragma omp for
140 // PRINT: #pragma omp interchange permutation(P + 1, 2 - P)
141 // DUMP: OMPInterchangeDirective
142 // DUMP-NEXT: OMPPermutationClause
143 // DUMP-NEXT: BinaryOperator {{.*}} '+'
144 // DUMP-NEXT: DeclRefExpr {{.*}} 'P' 'T'
145 // DUMP-NEXT: IntegerLiteral {{.*}} 'int' 1
146 // DUMP-NEXT: BinaryOperator {{.*}} '-'
147 // DUMP-NEXT: IntegerLiteral {{.*}} 'int' 2
148 // DUMP-NEXT: DeclRefExpr {{.*}} 'P' 'T'
149 #pragma omp interchange permutation(P + 1, 2 - P)
150 // PRINT-NEXT: for (T i = start; i < end; i += 2)
151 // DUMP-NEXT: ForStmt
152 for (T i = start; i < end; i += 2)
153 // PRINT-NEXT: for (T j = start; j < end; j += 2)
154 // DUMP: ForStmt
155 for (T j = start; j < end; j += 2)
156 // PRINT-NEXT: body(i, j);
157 // DUMP: CallExpr
158 body(i,j);
161 // Also test instantiating the template.
162 void tfoo5() {
163 foo5<int,0>(0, 42);
164 foo5<int,1>(0, 42);
168 // PRINT-LABEL: void foo6(
169 // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo6
170 template<int Tile>
171 void foo6() {
172 // PRINT: #pragma omp interchange
173 // DUMP: OMPInterchangeDirective
174 #pragma omp interchange
175 // PRINT-NEXT: for (int i = 0; i < 11; i += 2)
176 // DUMP-NEXT: ForStmt
177 for (int i = 0; i < 11; i += 2)
178 // PRINT-NEXT: #pragma omp tile sizes(Tile)
179 // DUMP: OMPTileDirective
180 #pragma omp tile sizes(Tile)
181 // PRINT-NEXT: for (int j = 0; j < 13; j += 2)
182 // DUMP: ForStmt
183 for (int j = 0; j < 13; j += 2)
184 // PRINT-NEXT: body(i, j);
185 // DUMP: CallExpr
186 body(i, j);
189 // Also test instantiating the template.
190 void tfoo6() {
191 foo6<32>();
195 // PRINT-LABEL: void foo7(
196 // DUMP-LABEL: FunctionDecl {{.*}} foo7
197 void foo7() {
198 double arr[128];
199 // PRINT: #pragma omp interchange
200 // DUMP: OMPInterchangeDirective
201 #pragma omp interchange
202 // PRINT-NEXT: for (double c = 42; auto &&v : arr)
203 // DUMP-NEXT: CXXForRangeStmt
204 for (double c = 42; auto &&v : arr)
205 // PRINT-NEXT: for (int i = 0; i < 42; i += 2)
206 // DUMP: ForStmt
207 for (int i = 0; i < 42; i += 2)
208 // PRINT-NEXT: body(c, v, i);
209 // DUMP: CallExpr
210 body(c, v, i);
214 // PRINT-LABEL: void foo8(
215 // DUMP-LABEL: FunctionDecl {{.*}} foo8
216 void foo8() {
217 double arr[128];
218 // PRINT: #pragma omp interchange
219 // DUMP: OMPInterchangeDirective
220 #pragma omp interchange
221 // PRINT-NEXT: for (int i = 0; i < 42; i += 2)
222 // DUMP-NEXT: ForStmt
223 for (int i = 0; i < 42; i += 2)
224 // PRINT-NEXT: for (double c = 42; auto &&v : arr)
225 // DUMP: CXXForRangeStmt
226 for (double c = 42; auto &&v : arr)
227 // PRINT-NEXT: body(i, c, v);
228 // DUMP: CallExpr
229 body(i, c, v);
232 #endif