blob: 14f064358d8db3e1d3fae1be3e3576168d6ea4ad [file] [log] [blame]
Michael Kruse6c050052021-02-12 11:26:59 -08001// Check no warnings/errors
2// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s
3// expected-no-diagnostics
4
5// Check AST and unparsing
6// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-dump %s | FileCheck %s --check-prefix=DUMP
7// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix=PRINT
8
9// Check same results after serialization round-trip
10// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -emit-pch -o %t %s
11// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
13
14#ifndef HEADER
15#define HEADER
16
17// placeholder for loop body code.
18extern "C" void body(...);
19
20
21// PRINT-LABEL: void foo1(
22// DUMP-LABEL: FunctionDecl {{.*}} foo1
23void foo1() {
24 // PRINT: #pragma omp tile sizes(5, 5)
25 // DUMP: OMPTileDirective
26 // DUMP-NEXT: OMPSizesClause
27 // DUMP-NEXT: IntegerLiteral {{.*}} 5
28 // DUMP-NEXT: IntegerLiteral {{.*}} 5
29 #pragma omp tile sizes(5,5)
30 // PRINT: for (int i = 7; i < 17; i += 3)
31 // DUMP-NEXT: ForStmt
32 for (int i = 7; i < 17; i += 3)
33 // PRINT: for (int j = 7; j < 17; j += 3)
34 // DUMP: ForStmt
35 for (int j = 7; j < 17; j += 3)
36 // PRINT: body(i, j);
37 // DUMP: CallExpr
38 body(i, j);
39}
40
41
42// PRINT-LABEL: void foo2(
43// DUMP-LABEL: FunctionDecl {{.*}} foo2
44void foo2(int start1, int start2, int end1, int end2) {
45 // PRINT: #pragma omp tile sizes(5, 5)
46 // DUMP: OMPTileDirective
47 // DUMP-NEXT: OMPSizesClause
48 // DUMP-NEXT: IntegerLiteral {{.*}} 5
49 // DUMP-NEXT: IntegerLiteral {{.*}} 5
50 #pragma omp tile sizes(5,5)
51 // PRINT: for (int i = start1; i < end1; i += 1)
52 // DUMP-NEXT: ForStmt
53 for (int i = start1; i < end1; i += 1)
54 // PRINT: for (int j = start2; j < end2; j += 1)
55 // DUMP: ForStmt
56 for (int j = start2; j < end2; j += 1)
57 // PRINT: body(i, j);
58 // DUMP: CallExpr
59 body(i, j);
60}
61
62
63// PRINT-LABEL: void foo3(
64// DUMP-LABEL: FunctionDecl {{.*}} foo3
65void foo3() {
66 // PRINT: #pragma omp for
67 // DUMP: OMPForDirective
68 // DUMP-NEXT: CapturedStmt
69 // DUMP-NEXT: CapturedDecl
70 #pragma omp for
71 // PRINT: #pragma omp tile sizes(5)
72 // DUMP-NEXT: OMPTileDirective
73 // DUMP-NEXT: OMPSizesClause
74 // DUMP-NEXT: IntegerLiteral {{.*}} 5
75 #pragma omp tile sizes(5)
76 for (int i = 7; i < 17; i += 3)
77 // PRINT: body(i);
78 // DUMP: CallExpr
79 body(i);
80}
81
82
83// PRINT-LABEL: void foo4(
84// DUMP-LABEL: FunctionDecl {{.*}} foo4
85void foo4() {
86 // PRINT: #pragma omp for collapse(3)
87 // DUMP: OMPForDirective
88 // DUMP-NEXT: OMPCollapseClause
89 // DUMP-NEXT: ConstantExpr
90 // DUMP-NEXT: value: Int 3
91 // DUMP-NEXT: IntegerLiteral {{.*}} 3
92 // DUMP-NEXT: CapturedStmt
93 // DUMP-NEXT: CapturedDecl
94 #pragma omp for collapse(3)
95 // PRINT: #pragma omp tile sizes(5, 5)
96 // DUMP: OMPTileDirective
97 // DUMP-NEXT: OMPSizesClause
98 // DUMP-NEXT: IntegerLiteral {{.*}} 5
99 // DUMP-NEXT: IntegerLiteral {{.*}} 5
100 #pragma omp tile sizes(5, 5)
101 // PRINT: for (int i = 7; i < 17; i += 1)
102 // DUMP-NEXT: ForStmt
103 for (int i = 7; i < 17; i += 1)
104 // PRINT: for (int j = 7; j < 17; j += 1)
105 // DUMP: ForStmt
106 for (int j = 7; j < 17; j += 1)
107 // PRINT: body(i, j);
108 // DUMP: CallExpr
109 body(i, j);
110}
111
112
113// PRINT-LABEL: void foo5(
114// DUMP-LABEL: FunctionDecl {{.*}} foo5
115void foo5(int start, int end, int step) {
116 // PRINT: #pragma omp for collapse(2)
117 // DUMP: OMPForDirective
118 // DUMP-NEXT: OMPCollapseClause
119 // DUMP-NEXT: ConstantExpr
120 // DUMP-NEXT: value: Int 2
121 // DUMP-NEXT: IntegerLiteral {{.*}} 2
122 // DUMP-NEXT: CapturedStmt
123 // DUMP-NEXT: CapturedDecl
124 #pragma omp for collapse(2)
125 // PRINT: for (int i = 7; i < 17; i += 1)
126 // DUMP-NEXT: ForStmt
127 for (int i = 7; i < 17; i += 1)
128 // PRINT: #pragma omp tile sizes(5)
129 // DUMP: OMPTileDirective
130 // DUMP-NEXT: OMPSizesClause
131 // DUMP-NEXT: IntegerLiteral {{.*}} 5
132 #pragma omp tile sizes(5)
133 // PRINT: for (int j = 7; j < 17; j += 1)
134 // DUMP-NEXT: ForStmt
135 for (int j = 7; j < 17; j += 1)
136 // PRINT: body(i, j);
137 // DUMP: CallExpr
138 body(i, j);
139}
140
141
142// PRINT-LABEL: void foo6(
143// DUMP-LABEL: FunctionTemplateDecl {{.*}} foo6
144template<typename T, T Step, T Tile>
145void foo6(T start, T end) {
146 // PRINT: #pragma omp tile sizes(Tile)
147 // DUMP: OMPTileDirective
148 // DUMP-NEXT: OMPSizesClause
149 // DUMP-NEXT: DeclRefExpr {{.*}} 'Tile' 'T'
150 #pragma omp tile sizes(Tile)
151 // PRINT-NEXT: for (T i = start; i < end; i += Step)
152 // DUMP-NEXT: ForStmt
153 for (T i = start; i < end; i += Step)
154 // PRINT-NEXT: body(i);
155 // DUMP: CallExpr
156 body(i);
157}
158
159// Also test instantiating the template.
160void tfoo6() {
161 foo6<int,3,5>(0, 42);
162}
163
164
Michael Kruse21301172021-10-06 11:43:29 -0500165// PRINT-LABEL: template <int Tile> void foo7(int start, int stop, int step) {
166// DUMP-LABEL: FunctionTemplateDecl {{.*}} foo7
167template <int Tile>
168void foo7(int start, int stop, int step) {
169 // PRINT: #pragma omp tile sizes(Tile)
170 // DUMP: OMPTileDirective
171 // DUMP-NEXT: OMPSizesClause
172 // DUMP-NEXT: DeclRefExpr {{.*}} 'Tile' 'int'
173 #pragma omp tile sizes(Tile)
174 // PRINT-NEXT: for (int i = start; i < stop; i += step)
175 // DUMP-NEXT: ForStmt
176 for (int i = start; i < stop; i += step)
177 // PRINT-NEXT: body(i);
178 // DUMP: CallExpr
179 body(i);
180}
181void tfoo7() {
182 foo7<5>(0, 42, 2);
183}
184
185
Michael Kruse6c050052021-02-12 11:26:59 -0800186#endif