1976d474bScchen // expected-no-diagnostics
2976d474bScchen
3976d474bScchen #ifndef HEADER
4976d474bScchen #define HEADER
5976d474bScchen
6ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -verify -fopenmp -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --check-prefix=CK1
7ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
8ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --check-prefix=CK1
9*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --check-prefix=CK1
10*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --check-prefix=CK1
11*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
12*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CK1
13976d474bScchen
14ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
15ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
16ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
17*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
18*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
19*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
20*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
21976d474bScchen
22976d474bScchen #ifdef CK1
23976d474bScchen
24976d474bScchen #define N 100
25976d474bScchen
26976d474bScchen void p_vxv(int *v1, int *v2, int *v3, int n);
27976d474bScchen void t_vxv(int *v1, int *v2, int *v3, int n);
28976d474bScchen
29976d474bScchen #pragma omp declare variant(t_vxv) match(construct={target})
30976d474bScchen #pragma omp declare variant(p_vxv) match(construct={parallel})
vxv(int * v1,int * v2,int * v3,int n)31976d474bScchen void vxv(int *v1, int *v2, int *v3, int n) {
32976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i];
33976d474bScchen }
34976d474bScchen // CK1: define dso_local void @vxv
35976d474bScchen
p_vxv(int * v1,int * v2,int * v3,int n)36976d474bScchen void p_vxv(int *v1, int *v2, int *v3, int n) {
37976d474bScchen #pragma omp for
38976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i] * 3;
39976d474bScchen }
40976d474bScchen // CK1: define dso_local void @p_vxv
41976d474bScchen
42976d474bScchen #pragma omp declare target
t_vxv(int * v1,int * v2,int * v3,int n)43976d474bScchen void t_vxv(int *v1, int *v2, int *v3, int n) {
44976d474bScchen #pragma distribute simd
45976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i] * 2;
46976d474bScchen }
47976d474bScchen #pragma omp end declare target
48976d474bScchen // CK1: define dso_local void @t_vxv
49976d474bScchen
50976d474bScchen
51976d474bScchen // CK1-LABEL: define {{[^@]+}}@test
test(void)52e9e55acdSAaron Ballman int test(void) {
53976d474bScchen int v1[N], v2[N], v3[N];
54976d474bScchen
55976d474bScchen // init
56976d474bScchen for (int i = 0; i < N; i++) {
57976d474bScchen v1[i] = (i + 1);
58976d474bScchen v2[i] = -(i + 1);
59976d474bScchen v3[i] = 0;
60976d474bScchen }
61976d474bScchen
62976d474bScchen #pragma omp target teams map(to: v1[:N],v2[:N]) map(from: v3[:N])
63976d474bScchen {
64976d474bScchen vxv(v1, v2, v3, N);
65976d474bScchen }
66976d474bScchen // CK1: call void @__omp_offloading_[[OFFLOAD:.+]]({{.+}})
67976d474bScchen
68976d474bScchen vxv(v1, v2, v3, N);
69976d474bScchen // CK1: call void @vxv
70976d474bScchen
71976d474bScchen #pragma omp parallel
72976d474bScchen {
73976d474bScchen vxv(v1, v2, v3, N);
74976d474bScchen }
75ef2a823aSSergei Barannikov // CK1: call void ({{.+}}) @__kmpc_fork_call(ptr {{.+}}, i32 3, ptr [[PARALLEL_REGION:@[^,]+]]
76976d474bScchen
77976d474bScchen return 0;
78976d474bScchen }
79976d474bScchen
80976d474bScchen // CK1: define internal void @__omp_offloading_[[OFFLOAD]]({{.+}})
81ef2a823aSSergei Barannikov // CK1: call void ({{.+}}) @__kmpc_fork_teams(ptr {{.+}}, i32 3, ptr [[TARGET_REGION:@[^,]+]]
82976d474bScchen // CK1: define internal void [[TARGET_REGION]](
83976d474bScchen // CK1: call void @t_vxv
84976d474bScchen
85976d474bScchen // CK1: define internal void [[PARALLEL_REGION]](
86976d474bScchen // CK1: call void @p_vxv
87976d474bScchen #endif // CK1
88976d474bScchen
89ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -verify -fopenmp -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --check-prefix=CK2
90ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
91ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --check-prefix=CK2
92*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --check-prefix=CK2
93*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --check-prefix=CK2
94*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
95*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CK2
96976d474bScchen
97ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
98ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
99ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
100*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
101*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
102*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
103*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
104976d474bScchen
105976d474bScchen #ifdef CK2
106976d474bScchen
107976d474bScchen void test_teams(int ***v1, int ***v2, int ***v3, int n);
108976d474bScchen void test_target(int ***v1, int ***v2, int ***v3, int n);
109976d474bScchen void test_parallel(int ***v1, int ***v2, int ***v3, int n);
110976d474bScchen
111976d474bScchen #pragma omp declare variant(test_teams) match(construct = {teams})
112976d474bScchen #pragma omp declare variant(test_target) match(construct = {target})
113976d474bScchen #pragma omp declare variant(test_parallel) match(construct = {parallel})
test_base(int *** v1,int *** v2,int *** v3,int n)114976d474bScchen void test_base(int ***v1, int ***v2, int ***v3, int n) {
115976d474bScchen for (int i = 0; i < n; i++)
116976d474bScchen for (int j = 0; j < n; ++j)
117976d474bScchen for (int k = 0; k < n; ++k)
118976d474bScchen v3[i][j][k] = v1[i][j][k] * v2[i][j][k];
119976d474bScchen }
120976d474bScchen
121976d474bScchen #pragma omp declare target
test_teams(int *** v1,int *** v2,int *** v3,int n)122976d474bScchen void test_teams(int ***v1, int ***v2, int ***v3, int n) {
123976d474bScchen #pragma omp distribute parallel for simd collapse(2)
124976d474bScchen for (int i = 0; i < n; ++i)
125976d474bScchen for (int j = 0; j < n; ++j)
126976d474bScchen for (int k = 0; k < n; ++k)
127976d474bScchen v3[i][j][k] = v1[i][j][k] * v2[i][j][k];
128976d474bScchen }
129976d474bScchen #pragma omp end declare target
130976d474bScchen
131976d474bScchen #pragma omp declare target
test_target(int *** v1,int *** v2,int *** v3,int n)132976d474bScchen void test_target(int ***v1, int ***v2, int ***v3, int n) {
133976d474bScchen #pragma omp parallel for simd collapse(3)
134976d474bScchen for (int i = 0; i < n; ++i)
135976d474bScchen for (int j = 0; j < n; ++j)
136976d474bScchen for (int k = 0; k < n; ++k)
137976d474bScchen v3[i][j][k] = v1[i][j][k] * v2[i][j][k];
138976d474bScchen }
139976d474bScchen #pragma omp end declare target
140976d474bScchen
test_parallel(int *** v1,int *** v2,int *** v3,int n)141976d474bScchen void test_parallel(int ***v1, int ***v2, int ***v3, int n) {
142976d474bScchen #pragma omp for collapse(3)
143976d474bScchen for (int i = 0; i < n; ++i)
144976d474bScchen for (int j = 0; j < n; ++j)
145976d474bScchen for (int k = 0; k < n; ++k)
146976d474bScchen v3[i][j][k] = v1[i][j][k] * v2[i][j][k];
147976d474bScchen }
148976d474bScchen
149976d474bScchen // CK2-LABEL: define {{[^@]+}}@test
test(int *** v1,int *** v2,int *** v3,int n)150976d474bScchen void test(int ***v1, int ***v2, int ***v3, int n) {
151976d474bScchen int i;
152976d474bScchen
153976d474bScchen #pragma omp target
154976d474bScchen #pragma omp teams
155976d474bScchen {
156976d474bScchen test_base(v1, v2, v3, 0);
157976d474bScchen }
158976d474bScchen // CK2: call void @__omp_offloading_[[OFFLOAD_1:.+]]({{.+}})
159976d474bScchen
160976d474bScchen #pragma omp target
161976d474bScchen {
162976d474bScchen test_base(v1, v2, v3, 0);
163976d474bScchen }
164976d474bScchen // CK2: call void @__omp_offloading_[[OFFLOAD_2:.+]]({{.+}})
165976d474bScchen
166976d474bScchen #pragma omp parallel
167976d474bScchen {
168976d474bScchen test_base(v1, v2, v3, 0);
169976d474bScchen }
170ef2a823aSSergei Barannikov // CK2: call void ({{.+}}) @__kmpc_fork_call(ptr {{.+}}, i32 3, ptr [[PARALLEL_REGION:@[^,]+]]
171976d474bScchen }
172976d474bScchen
173976d474bScchen // CK2: define internal void @__omp_offloading_[[OFFLOAD_1]]({{.+}})
174ef2a823aSSergei Barannikov // CK2: call void ({{.+}}) @__kmpc_fork_teams(ptr {{.+}}, i32 3, ptr [[TARGET_REGION_1:@[^,]+]]
175976d474bScchen // CK2: define internal void [[TARGET_REGION_1]](
176976d474bScchen // CK2: call void @test_teams
177976d474bScchen
178976d474bScchen // CK2: define internal void @__omp_offloading_[[OFFLOAD_2]]({{.+}})
179976d474bScchen // CK2: call void @test_target
180976d474bScchen
181976d474bScchen // CK2: define internal void [[PARALLEL_REGION]](
182976d474bScchen // CK2: call void @test_parallel
183976d474bScchen
184976d474bScchen #endif // CK2
185976d474bScchen
186ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -verify -fopenmp -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --check-prefix=CK3
187ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
188ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --check-prefix=CK3
189*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --check-prefix=CK3
190*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --check-prefix=CK3
191*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
192*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CK3
193976d474bScchen
194ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
195ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
196ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
197*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
198*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
199*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
200*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
201976d474bScchen
202976d474bScchen #ifdef CK3
203976d474bScchen
204976d474bScchen #define N 100
205976d474bScchen
206976d474bScchen int t_for(int *v1, int *v2, int *v3, int n);
207976d474bScchen int t_simd(int *v1, int *v2, int *v3, int n);
208976d474bScchen
209976d474bScchen #pragma omp declare variant(t_simd) match(construct = {simd})
210976d474bScchen #pragma omp declare variant(t_for) match(construct = {for})
t(int * v1,int * v2,int * v3,int idx)211976d474bScchen int t(int *v1, int *v2, int *v3, int idx) {
212976d474bScchen return v1[idx] * v2[idx];
213976d474bScchen }
214976d474bScchen
t_for(int * v1,int * v2,int * v3,int idx)215976d474bScchen int t_for(int *v1, int *v2, int *v3, int idx) {
216976d474bScchen return v1[idx] * v2[idx];
217976d474bScchen }
218976d474bScchen
219976d474bScchen #pragma omp declare simd
t_simd(int * v1,int * v2,int * v3,int idx)220976d474bScchen int t_simd(int *v1, int *v2, int *v3, int idx) {
221976d474bScchen return v1[idx] * v2[idx];
222976d474bScchen }
223976d474bScchen
224976d474bScchen // CK3-LABEL: define {{[^@]+}}@test
test(void)225e9e55acdSAaron Ballman void test(void) {
226976d474bScchen int v1[N], v2[N], v3[N];
227976d474bScchen
228976d474bScchen // init
229976d474bScchen for (int i = 0; i < N; i++) {
230976d474bScchen v1[i] = (i + 1);
231976d474bScchen v2[i] = -(i + 1);
232976d474bScchen v3[i] = 0;
233976d474bScchen }
234976d474bScchen
235976d474bScchen #pragma omp simd
236976d474bScchen for (int i = 0; i < N; i++) {
237976d474bScchen v3[i] = t(v1, v2, v3, i);
238976d474bScchen }
239976d474bScchen // CK3: call = call i32 @t_simd
240976d474bScchen
241976d474bScchen
242976d474bScchen #pragma omp for
243976d474bScchen for (int i = 0; i < N; i++) {
244976d474bScchen v3[i] = t(v1, v2, v3, i);
245976d474bScchen }
246976d474bScchen // CK3: call{{.+}} = call i32 @t_for
247976d474bScchen }
248976d474bScchen
249976d474bScchen #endif // CK3
250976d474bScchen
251ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -verify -fopenmp -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --check-prefix=CK4
252ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
253ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --check-prefix=CK4
254*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --check-prefix=CK4
255*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --check-prefix=CK4
256*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
257*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CK4
258976d474bScchen
259ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
260ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -emit-pch -o %t -fopenmp-version=45 %s
261ef2a823aSSergei Barannikov // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -include-pch %t -verify %s -emit-llvm -o - -fopenmp-version=45 | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
262*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
263*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
264*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -emit-pch -o %t %s
265*0c6f2f62SAnimesh Kumar // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c -triple x86_64-unknown-linux -fopenmp-targets=amdgcn-amd-amdhsa -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
266976d474bScchen
267976d474bScchen #ifdef CK4
268976d474bScchen
269976d474bScchen #define N 100
270976d474bScchen
271976d474bScchen void not_selected_vxv(int *v1, int *v2, int *v3, int n);
272976d474bScchen void combined_vxv(int *v1, int *v2, int *v3, int n);
273976d474bScchen void all_vxv(int *v1, int *v2, int *v3, int n);
274976d474bScchen
275976d474bScchen #pragma omp declare variant(all_vxv) match(construct={target,teams,parallel,for,simd})
276976d474bScchen #pragma omp declare variant(combined_vxv) match(construct={target,teams,parallel,for})
277976d474bScchen #pragma omp declare variant(not_selected_vxv) match(construct={parallel,for})
vxv(int * v1,int * v2,int * v3,int n)278976d474bScchen void vxv(int *v1, int *v2, int *v3, int n) {
279976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i];
280976d474bScchen }
281976d474bScchen
not_selected_vxv(int * v1,int * v2,int * v3,int n)282976d474bScchen void not_selected_vxv(int *v1, int *v2, int *v3, int n) {
283976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i] * 3;
284976d474bScchen }
285976d474bScchen
286976d474bScchen #pragma omp declare target
combined_vxv(int * v1,int * v2,int * v3,int n)287976d474bScchen void combined_vxv(int *v1, int *v2, int *v3, int n) {
288976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i] * 2;
289976d474bScchen }
290976d474bScchen #pragma omp end declare target
291976d474bScchen
292976d474bScchen #pragma omp declare target
all_vxv(int * v1,int * v2,int * v3,int n)293976d474bScchen void all_vxv(int *v1, int *v2, int *v3, int n) {
294976d474bScchen for (int i = 0; i < n; i++) v3[i] = v1[i] * v2[i] * 4;
295976d474bScchen }
296976d474bScchen #pragma omp end declare target
297976d474bScchen
298976d474bScchen // CK4-LABEL: define {{[^@]+}}@test
test(void)299e9e55acdSAaron Ballman void test(void) {
300976d474bScchen int v1[N], v2[N], v3[N];
301976d474bScchen
302976d474bScchen //init
303976d474bScchen for (int i = 0; i < N; i++) {
304976d474bScchen v1[i] = (i + 1);
305976d474bScchen v2[i] = -(i + 1);
306976d474bScchen v3[i] = 0;
307976d474bScchen }
308976d474bScchen
309976d474bScchen #pragma omp target teams map(to: v1[:N],v2[:N]) map(from: v3[:N])
310976d474bScchen {
311976d474bScchen #pragma omp parallel for
312976d474bScchen for (int i = 0; i < N; i++)
313976d474bScchen vxv(v1, v2, v3, N);
314976d474bScchen }
315976d474bScchen // CK4: call void @__omp_offloading_[[OFFLOAD_1:.+]]({{.+}})
316976d474bScchen
317976d474bScchen #pragma omp simd
318976d474bScchen for (int i = 0; i < N; i++)
319976d474bScchen vxv(v1, v2, v3, N);
320976d474bScchen // CK4: call void @vxv
321976d474bScchen
322976d474bScchen #pragma omp target teams distribute parallel for simd map(from: v3[:N])
323976d474bScchen for (int i = 0; i < N; i++)
324976d474bScchen for (int i = 0; i < N; i++)
325976d474bScchen for (int i = 0; i < N; i++)
326976d474bScchen vxv(v1, v2, v3, N);
327976d474bScchen // CK4: call void @__omp_offloading_[[OFFLOAD_2:.+]]({{.+}})
328976d474bScchen }
329976d474bScchen // CK4-DAG: call void @all_vxv
330976d474bScchen // CK4-DAG: call void @combined_vxv
331976d474bScchen
332976d474bScchen #endif // CK4
333976d474bScchen
334976d474bScchen #endif // HEADER
335