blob: ff44c0e8fb9fada22df700da503216f17b850ecf [file] [log] [blame]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +00001// Test target codegen - host bc file has to be created first.
Samuel Antao1168d63c2016-06-30 21:22:08 +00002// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
3// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
4// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
5// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
Alexey Bataev5e87c342016-12-22 19:44:05 +00006// RUN: %clang_cc1 -verify -fopenmp -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +00007// expected-no-diagnostics
8#ifndef HEADER
9#define HEADER
10
Alexey Bataev6393eb72018-12-06 15:35:13 +000011// Check that the execution mode of all 7 target regions is set to Generic Mode.
Alexey Bataeve8ad4b72018-11-26 18:37:09 +000012// CHECK-DAG: [[NONSPMD:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds
13// CHECK-DAG: [[UNKNOWN:@.+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 2, i32 0, i8* getelementptr inbounds
Alexey Bataev6393eb72018-12-06 15:35:13 +000014// CHECK-DAG: {{@__omp_offloading_.+l59}}_exec_mode = weak constant i8 1
15// CHECK-DAG: {{@__omp_offloading_.+l137}}_exec_mode = weak constant i8 1
16// CHECK-DAG: {{@__omp_offloading_.+l214}}_exec_mode = weak constant i8 1
17// CHECK-DAG: {{@__omp_offloading_.+l324}}_exec_mode = weak constant i8 1
18// CHECK-DAG: {{@__omp_offloading_.+l362}}_exec_mode = weak constant i8 1
19// CHECK-DAG: {{@__omp_offloading_.+l380}}_exec_mode = weak constant i8 1
20// CHECK-DAG: {{@__omp_offloading_.+l345}}_exec_mode = weak constant i8 1
Alexey Bataev6a1b06b2018-12-18 21:01:42 +000021// CHECK-DAG: [[MAP_TY:%.+]] = type { [128 x i8] }
Alexey Bataev6393eb72018-12-06 15:35:13 +000022// CHECK-DAG: [[GLOB_TY:%.+]] = type { i32* }
Alexey Bataev979966f2017-05-24 16:00:02 +000023
24__thread int id;
Arpith Chacko Jacob44a87c92017-01-18 19:35:00 +000025
Alexey Bataev2a3320a2018-05-15 18:01:01 +000026int baz(int f, double &a);
Alexey Bataevd7ff6d62018-05-07 14:50:05 +000027
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000028template<typename tx, typename ty>
29struct TT{
30 tx X;
31 ty Y;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000032 tx &operator[](int i) { return X; }
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000033};
34
Alexey Bataev6393eb72018-12-06 15:35:13 +000035// CHECK: define weak void @__omp_offloading_{{.+}}_{{.+}}targetBar{{.+}}_l59(i32* [[PTR1:%.+]], i32** dereferenceable{{.*}} [[PTR2_REF:%.+]])
36// CHECK: store i32* [[PTR1]], i32** [[PTR1_ADDR:%.+]],
37// CHECK: store i32** [[PTR2_REF]], i32*** [[PTR2_REF_PTR:%.+]],
38// CHECK: [[PTR2_REF:%.+]] = load i32**, i32*** [[PTR2_REF_PTR]],
39// CHECK: call void @__kmpc_kernel_init(
40// CHECK: call void @__kmpc_get_team_static_memory(i8* addrspacecast (i8 addrspace(3)* getelementptr inbounds ([[MAP_TY]], [[MAP_TY]] addrspace(3)* @{{.+}}, i32 0, i32 0, i32 0) to i8*), i{{64|32}} %{{.+}}, i16 %{{.+}}, i8** addrspacecast (i8* addrspace(3)* [[BUF_PTR:@.+]] to i8**))
41// CHECK: [[BUF:%.+]] = load i8*, i8* addrspace(3)* [[BUF_PTR]],
42// CHECK: [[BUF_OFFS:%.+]] = getelementptr inbounds i8, i8* [[BUF]], i{{[0-9]+}} 0
43// CHECK: [[BUF:%.+]] = bitcast i8* [[BUF_OFFS]] to [[GLOB_TY]]*
44// CHECK: [[PTR1:%.+]] = load i32*, i32** [[PTR1_ADDR]],
45// CHECK: [[PTR1_GLOB_REF:%.+]] = getelementptr inbounds [[GLOB_TY]], [[GLOB_TY]]* [[BUF]], i32 0, i32 0
46// CHECK: store i32* [[PTR1]], i32** [[PTR1_GLOB_REF]],
47// CHECK: call void @__kmpc_begin_sharing_variables(i8*** [[ARG_PTRS_REF:%.+]], i{{64|32}} 2)
48// CHECK: [[ARG_PTRS:%.+]] = load i8**, i8*** [[ARG_PTRS_REF]],
49// CHECK: [[ARG_PTR1:%.+]] = getelementptr inbounds i8*, i8** [[ARG_PTRS]], i{{[0-9]+}} 0
50// CHECK: [[BC:%.+]] = bitcast i32** [[PTR1_GLOB_REF]] to i8*
51// CHECK: store i8* [[BC]], i8** [[ARG_PTR1]],
52// CHECK: [[ARG_PTR2:%.+]] = getelementptr inbounds i8*, i8** [[ARG_PTRS]], i{{[0-9]+}} 1
53// CHECK: [[BC:%.+]] = bitcast i32** [[PTR2_REF]] to i8*
54// CHECK: store i8* [[BC]], i8** [[ARG_PTR2]],
Alexey Bataeva3924b52019-01-03 16:25:35 +000055// CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
56// CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Alexey Bataev6393eb72018-12-06 15:35:13 +000057// CHECK: call void @__kmpc_end_sharing_variables()
58void targetBar(int *Ptr1, int *Ptr2) {
59#pragma omp target map(Ptr1[:0], Ptr2)
60#pragma omp parallel num_threads(2)
61 *Ptr1 = *Ptr2;
62}
63
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000064int foo(int n) {
65 int a = 0;
66 short aa = 0;
67 float b[10];
68 float bn[n];
69 double c[5][10];
70 double cn[5][n];
71 TT<long long, char> d;
72
Alexey Bataev6393eb72018-12-06 15:35:13 +000073 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l137}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000074 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
75 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
76 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
77 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000078 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
79 //
80 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +000081 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000082 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
83 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000084 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
85 //
86 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000087 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
88 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000089 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
90 //
91 // CHECK: [[EXEC_PARALLEL]]
92 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
93 //
94 // CHECK: [[TERM_PARALLEL]]
95 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
96 //
97 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +000098 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000099 // CHECK: br label {{%?}}[[AWAIT_WORK]]
100 //
101 // CHECK: [[EXIT]]
102 // CHECK: ret void
103
Alexey Bataev6393eb72018-12-06 15:35:13 +0000104 // CHECK: define {{.*}}void [[T1:@__omp_offloading_.+foo.+l137]]()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000105 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
106 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
107 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000108 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000109 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
110 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000111 //
112 // CHECK: [[WORKER]]
Alexey Bataev5e87c342016-12-22 19:44:05 +0000113 // CHECK: {{call|invoke}} void [[T1]]_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000114 // CHECK: br label {{%?}}[[EXIT:.+]]
115 //
116 // CHECK: [[CHECK_MASTER]]
117 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
118 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
119 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
120 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
121 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000122 //
123 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000124 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
125 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000126 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000127 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
128 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000129 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000130 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000131 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000132 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000133 // CHECK: br label {{%?}}[[EXIT]]
134 //
135 // CHECK: [[EXIT]]
136 // CHECK: ret void
137 #pragma omp target
138 {
139 }
140
141 // CHECK-NOT: define {{.*}}void [[T2:@__omp_offloading_.+foo.+]]_worker()
142 #pragma omp target if(0)
143 {
144 }
145
Alexey Bataev6393eb72018-12-06 15:35:13 +0000146 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l214}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000147 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
148 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
149 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
150 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000151 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
152 //
153 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000154 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000155 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
156 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000157 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
158 //
159 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000160 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
161 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000162 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
163 //
164 // CHECK: [[EXEC_PARALLEL]]
165 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
166 //
167 // CHECK: [[TERM_PARALLEL]]
168 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
169 //
170 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000171 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000172 // CHECK: br label {{%?}}[[AWAIT_WORK]]
173 //
174 // CHECK: [[EXIT]]
175 // CHECK: ret void
176
Alexey Bataev6393eb72018-12-06 15:35:13 +0000177 // CHECK: define {{.*}}void [[T2:@__omp_offloading_.+foo.+l214]](i[[SZ:32|64]] [[ARG1:%[a-zA-Z_]+]], i[[SZ:32|64]] [[ID:%[a-zA-Z_]+]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000178 // CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]],
179 // CHECK: store i[[SZ]] [[ARG1]], i[[SZ]]* [[AA_ADDR]],
180 // CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000181 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
182 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
183 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000184 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000185 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
186 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000187 //
188 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000189 // CHECK: {{call|invoke}} void [[T2]]_worker()
190 // CHECK: br label {{%?}}[[EXIT:.+]]
191 //
192 // CHECK: [[CHECK_MASTER]]
193 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
194 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
195 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
196 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
197 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000198 //
199 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000200 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
201 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000202 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000203 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000204 // CHECK: load i16, i16* [[AA_CADDR]],
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000205 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000206 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000207 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000208 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000209 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000210 // CHECK: br label {{%?}}[[EXIT]]
211 //
212 // CHECK: [[EXIT]]
213 // CHECK: ret void
214 #pragma omp target if(1)
215 {
216 aa += 1;
Alexey Bataev979966f2017-05-24 16:00:02 +0000217 id = aa;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000218 }
219
Alexey Bataev6393eb72018-12-06 15:35:13 +0000220 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l324}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000221 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
222 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
223 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
224 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000225 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
226 //
227 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000228 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000229 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
230 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000231 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
232 //
233 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000234 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
235 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000236 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
237 //
238 // CHECK: [[EXEC_PARALLEL]]
239 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
240 //
241 // CHECK: [[TERM_PARALLEL]]
242 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
243 //
244 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000245 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000246 // CHECK: br label {{%?}}[[AWAIT_WORK]]
247 //
248 // CHECK: [[EXIT]]
249 // CHECK: ret void
250
Alexey Bataev6393eb72018-12-06 15:35:13 +0000251 // CHECK: define {{.*}}void [[T3:@__omp_offloading_.+foo.+l324]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000252 // Create local storage for each capture.
253 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
254 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x float]*
255 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
256 // CHECK: [[LOCAL_BN:%.+]] = alloca float*
257 // CHECK: [[LOCAL_C:%.+]] = alloca [5 x [10 x double]]*
258 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
259 // CHECK: [[LOCAL_VLA3:%.+]] = alloca i[[SZ]]
260 // CHECK: [[LOCAL_CN:%.+]] = alloca double*
261 // CHECK: [[LOCAL_D:%.+]] = alloca [[TT:%.+]]*
262 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
263 // CHECK-DAG: store [10 x float]* [[ARG_B:%.+]], [10 x float]** [[LOCAL_B]]
264 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
265 // CHECK-DAG: store float* [[ARG_BN:%.+]], float** [[LOCAL_BN]]
266 // CHECK-DAG: store [5 x [10 x double]]* [[ARG_C:%.+]], [5 x [10 x double]]** [[LOCAL_C]]
267 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
268 // CHECK-DAG: store i[[SZ]] [[ARG_VLA3:%.+]], i[[SZ]]* [[LOCAL_VLA3]]
269 // CHECK-DAG: store double* [[ARG_CN:%.+]], double** [[LOCAL_CN]]
270 // CHECK-DAG: store [[TT]]* [[ARG_D:%.+]], [[TT]]** [[LOCAL_D]]
271 //
272 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i64* [[LOCAL_A]] to i32*
273 // CHECK-DAG: [[REF_B:%.+]] = load [10 x float]*, [10 x float]** [[LOCAL_B]],
274 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
275 // CHECK-DAG: [[REF_BN:%.+]] = load float*, float** [[LOCAL_BN]],
276 // CHECK-DAG: [[REF_C:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[LOCAL_C]],
277 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
278 // CHECK-DAG: [[VAL_VLA3:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA3]],
279 // CHECK-DAG: [[REF_CN:%.+]] = load double*, double** [[LOCAL_CN]],
280 // CHECK-DAG: [[REF_D:%.+]] = load [[TT]]*, [[TT]]** [[LOCAL_D]],
281 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000282 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
283 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
284 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000285 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000286 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
287 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000288 //
289 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000290 // CHECK: {{call|invoke}} void [[T3]]_worker()
291 // CHECK: br label {{%?}}[[EXIT:.+]]
292 //
293 // CHECK: [[CHECK_MASTER]]
294 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
295 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
296 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
297 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
298 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000299 //
300 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000301 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
302 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000303 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000304 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000305 //
306 // Use captures.
307 // CHECK-64-DAG: load i32, i32* [[REF_A]]
308 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
309 // CHECK-DAG: getelementptr inbounds [10 x float], [10 x float]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
310 // CHECK-DAG: getelementptr inbounds float, float* [[REF_BN]], i[[SZ]] 3
311 // CHECK-DAG: getelementptr inbounds [5 x [10 x double]], [5 x [10 x double]]* [[REF_C]], i[[SZ]] 0, i[[SZ]] 1
312 // CHECK-DAG: getelementptr inbounds double, double* [[REF_CN]], i[[SZ]] %{{.+}}
313 // CHECK-DAG: getelementptr inbounds [[TT]], [[TT]]* [[REF_D]], i32 0, i32 0
314 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000315 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000316 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000317 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000318 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000319 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000320 // CHECK: br label {{%?}}[[EXIT]]
321 //
322 // CHECK: [[EXIT]]
323 // CHECK: ret void
324 #pragma omp target if(n>20)
325 {
326 a += 1;
327 b[2] += 1.0;
328 bn[3] += 1.0;
329 c[1][2] += 1.0;
330 cn[1][3] += 1.0;
331 d.X += 1;
332 d.Y += 1;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000333 d[0] += 1;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000334 }
335
336 return a;
337}
338
339template<typename tx>
340tx ftemplate(int n) {
341 tx a = 0;
342 short aa = 0;
343 tx b[10];
344
345 #pragma omp target if(n>40)
346 {
347 a += 1;
348 aa += 1;
349 b[2] += 1;
350 }
351
352 return a;
353}
354
355static
356int fstatic(int n) {
357 int a = 0;
358 short aa = 0;
359 char aaa = 0;
360 int b[10];
361
362 #pragma omp target if(n>50)
363 {
364 a += 1;
365 aa += 1;
366 aaa += 1;
367 b[2] += 1;
368 }
369
370 return a;
371}
372
373struct S1 {
374 double a;
375
376 int r1(int n){
377 int b = n+1;
378 short int c[2][n];
379
380 #pragma omp target if(n>60)
381 {
382 this->a = (double)b + 1.5;
383 c[1][1] = ++a;
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000384 baz(a, a);
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000385 }
386
387 return c[1][1] + (int)b;
388 }
389};
390
391int bar(int n){
392 int a = 0;
393
394 a += foo(n);
395
396 S1 S;
397 a += S.r1(n);
398
399 a += fstatic(n);
400
401 a += ftemplate<int>(n);
402
403 return a;
404}
405
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000406int baz(int f, double &a) {
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000407#pragma omp parallel
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000408 f = 2 + a;
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000409 return f;
410}
411
Alexey Bataev6393eb72018-12-06 15:35:13 +0000412 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+static.+362}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000413 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
414 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
415 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
416 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000417 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
418 //
419 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000420 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000421 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
422 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000423 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
424 //
425 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000426 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
427 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000428 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
429 //
430 // CHECK: [[EXEC_PARALLEL]]
431 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
432 //
433 // CHECK: [[TERM_PARALLEL]]
434 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
435 //
436 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000437 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000438 // CHECK: br label {{%?}}[[AWAIT_WORK]]
439 //
440 // CHECK: [[EXIT]]
441 // CHECK: ret void
442
Alexey Bataev6393eb72018-12-06 15:35:13 +0000443 // CHECK: define {{.*}}void [[T4:@__omp_offloading_.+static.+l362]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000444 // Create local storage for each capture.
445 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
446 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
447 // CHECK: [[LOCAL_AAA:%.+]] = alloca i[[SZ]]
448 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
449 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
450 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
451 // CHECK-DAG: store i[[SZ]] [[ARG_AAA:%.+]], i[[SZ]]* [[LOCAL_AAA]]
452 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
453 // Store captures in the context.
454 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
455 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
456 // CHECK-DAG: [[REF_AAA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA]] to i8*
457 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
458 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000459 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
460 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
461 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000462 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000463 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
464 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000465 //
466 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000467 // CHECK: {{call|invoke}} void [[T4]]_worker()
468 // CHECK: br label {{%?}}[[EXIT:.+]]
469 //
470 // CHECK: [[CHECK_MASTER]]
471 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
472 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
473 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
474 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
475 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000476 //
477 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000478 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
479 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000480 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000481 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000482 // CHECK-64-DAG: load i32, i32* [[REF_A]]
483 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
484 // CHECK-DAG: load i16, i16* [[REF_AA]]
485 // CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000486 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000487 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000488 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000489 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000490 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000491 // CHECK: br label {{%?}}[[EXIT]]
492 //
493 // CHECK: [[EXIT]]
494 // CHECK: ret void
495
496
497
Alexey Bataev6393eb72018-12-06 15:35:13 +0000498 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+S1.+l380}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000499 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
500 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
501 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
502 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000503 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
504 //
505 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000506 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000507 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
508 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000509 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
510 //
511 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000512 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
513 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000514 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
515 //
516 // CHECK: [[EXEC_PARALLEL]]
Alexey Bataev3ce5d822018-11-29 21:21:32 +0000517 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[NONSPMD]]
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000518 // CHECK: [[WORK_FN:%.+]] = bitcast i8* [[WORK]] to void (i16, i32)*
519 // CHECK: call void [[WORK_FN]](i16 0, i32 [[GTID]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000520 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
521 //
522 // CHECK: [[TERM_PARALLEL]]
523 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
524 //
525 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000526 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000527 // CHECK: br label {{%?}}[[AWAIT_WORK]]
528 //
529 // CHECK: [[EXIT]]
530 // CHECK: ret void
531
Alexey Bataev6393eb72018-12-06 15:35:13 +0000532 // CHECK: define {{.*}}void [[T5:@__omp_offloading_.+S1.+l380]](
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000533 // Create local storage for each capture.
534 // CHECK: [[LOCAL_THIS:%.+]] = alloca [[S1:%struct.*]]*
535 // CHECK: [[LOCAL_B:%.+]] = alloca i[[SZ]]
536 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
537 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
538 // CHECK: [[LOCAL_C:%.+]] = alloca i16*
539 // CHECK-DAG: store [[S1]]* [[ARG_THIS:%.+]], [[S1]]** [[LOCAL_THIS]]
540 // CHECK-DAG: store i[[SZ]] [[ARG_B:%.+]], i[[SZ]]* [[LOCAL_B]]
541 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
542 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
543 // CHECK-DAG: store i16* [[ARG_C:%.+]], i16** [[LOCAL_C]]
544 // Store captures in the context.
545 // CHECK-DAG: [[REF_THIS:%.+]] = load [[S1]]*, [[S1]]** [[LOCAL_THIS]],
546 // CHECK-64-DAG:[[REF_B:%.+]] = bitcast i[[SZ]]* [[LOCAL_B]] to i32*
547 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
548 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
549 // CHECK-DAG: [[REF_C:%.+]] = load i16*, i16** [[LOCAL_C]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000550 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000551 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
552 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
553 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000554 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000555 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
556 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000557 //
558 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000559 // CHECK: {{call|invoke}} void [[T5]]_worker()
560 // CHECK: br label {{%?}}[[EXIT:.+]]
561 //
562 // CHECK: [[CHECK_MASTER]]
563 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
564 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
565 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
566 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
567 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000568 //
569 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000570 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
571 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000572 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000573 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000574 // Use captures.
575 // CHECK-DAG: getelementptr inbounds [[S1]], [[S1]]* [[REF_THIS]], i32 0, i32 0
576 // CHECK-64-DAG:load i32, i32* [[REF_B]]
577 // CHECK-32-DAG:load i32, i32* [[LOCAL_B]]
578 // CHECK-DAG: getelementptr inbounds i16, i16* [[REF_C]], i[[SZ]] %{{.+}}
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000579 // CHECK: call i32 [[BAZ:@.*baz.*]](i32 %
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000580 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000581 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000582 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000583 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000584 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000585 // CHECK: br label {{%?}}[[EXIT]]
586 //
587 // CHECK: [[EXIT]]
588 // CHECK: ret void
589
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000590 // CHECK: define i32 [[BAZ]](i32 [[F:%.*]], double* dereferenceable{{.*}})
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000591 // CHECK: alloca i32,
592 // CHECK: [[LOCAL_F_PTR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000593 // CHECK: [[ZERO_ADDR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000594 // CHECK: store i32 0, i32* [[ZERO_ADDR]]
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000595 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[UNKNOWN]]
596 // CHECK: [[PAR_LEVEL:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000597 // CHECK: [[IS_TTD:%.+]] = icmp eq i16 %1, 0
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000598 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
599 // CHECK: [[IS_SPMD:%.+]] = icmp ne i8 [[RES]], 0
600 // CHECK: br i1 [[IS_SPMD]], label
601 // CHECK: br label
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000602 // CHECK: [[SIZE:%.+]] = select i1 [[IS_TTD]], i{{64|32}} 4, i{{64|32}} 128
Alexey Bataev1fc1f8e2018-11-02 16:08:31 +0000603 // CHECK: [[PTR:%.+]] = call i8* @__kmpc_data_sharing_coalesced_push_stack(i{{64|32}} [[SIZE]], i16 0)
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000604 // CHECK: [[REC_ADDR:%.+]] = bitcast i8* [[PTR]] to [[GLOBAL_ST:%.+]]*
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000605 // CHECK: br label
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000606 // CHECK: [[ITEMS:%.+]] = phi [[GLOBAL_ST]]* [ null, {{.+}} ], [ [[REC_ADDR]], {{.+}} ]
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000607 // CHECK: [[TTD_ITEMS:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to [[SEC_GLOBAL_ST:%.+]]*
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000608 // CHECK: [[F_PTR_ARR:%.+]] = getelementptr inbounds [[GLOBAL_ST]], [[GLOBAL_ST]]* [[ITEMS]], i32 0, i32 0
609 // CHECK: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
610 // CHECK: [[LID:%.+]] = and i32 [[TID]], 31
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000611 // CHECK: [[GLOBAL_F_PTR_PAR:%.+]] = getelementptr inbounds [32 x i32], [32 x i32]* [[F_PTR_ARR]], i32 0, i32 [[LID]]
612 // CHECK: [[GLOBAL_F_PTR_TTD:%.+]] = getelementptr inbounds [[SEC_GLOBAL_ST]], [[SEC_GLOBAL_ST]]* [[TTD_ITEMS]], i32 0, i32 0
613 // CHECK: [[GLOBAL_F_PTR:%.+]] = select i1 [[IS_TTD]], i32* [[GLOBAL_F_PTR_TTD]], i32* [[GLOBAL_F_PTR_PAR]]
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000614 // CHECK: [[F_PTR:%.+]] = select i1 [[IS_SPMD]], i32* [[LOCAL_F_PTR]], i32* [[GLOBAL_F_PTR]]
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000615 // CHECK: store i32 %{{.+}}, i32* [[F_PTR]],
Alexey Bataev673110d2018-05-16 13:36:30 +0000616
617 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
618 // CHECK: icmp ne i8 [[RES]], 0
619 // CHECK: br i1
620
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000621 // CHECK: [[RES:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev0baba9e2018-05-25 20:16:03 +0000622 // CHECK: icmp ne i16 [[RES]], 0
623 // CHECK: br i1
624
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000625 // CHECK: call void @__kmpc_serialized_parallel(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev8521ff62018-07-25 20:03:01 +0000626 // CHECK: call void [[OUTLINED:@.+]](i32* [[ZERO_ADDR]], i32* [[ZERO_ADDR]], i32* [[F_PTR]], double* %{{.+}})
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000627 // CHECK: call void @__kmpc_end_serialized_parallel(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev673110d2018-05-16 13:36:30 +0000628 // CHECK: br label
629
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000630 // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i16, i32)* @{{.+}} to i8*), i16 1)
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000631 // CHECK: call void @__kmpc_begin_sharing_variables(i8*** [[SHARED_PTR:%.+]], i{{64|32}} 2)
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000632 // CHECK: [[SHARED:%.+]] = load i8**, i8*** [[SHARED_PTR]],
633 // CHECK: [[REF:%.+]] = getelementptr inbounds i8*, i8** [[SHARED]], i{{64|32}} 0
634 // CHECK: [[F_REF:%.+]] = bitcast i32* [[F_PTR]] to i8*
635 // CHECK: store i8* [[F_REF]], i8** [[REF]],
Alexey Bataeva3924b52019-01-03 16:25:35 +0000636 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
637 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000638 // CHECK: call void @__kmpc_end_sharing_variables()
639 // CHECK: br label
640
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000641 // CHECK: [[RES:%.+]] = load i32, i32* [[F_PTR]],
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000642 // CHECK: store i32 [[RES]], i32* [[RET:%.+]],
643 // CHECK: br i1 [[IS_SPMD]], label
644 // CHECK: [[BC:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to i8*
645 // CHECK: call void @__kmpc_data_sharing_pop_stack(i8* [[BC]])
646 // CHECK: br label
647 // CHECK: [[RES:%.+]] = load i32, i32* [[RET]],
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000648 // CHECK: ret i32 [[RES]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000649
650
Alexey Bataev6393eb72018-12-06 15:35:13 +0000651 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l345}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000652 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
653 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
654 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
655 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000656 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
657 //
658 // CHECK: [[AWAIT_WORK]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000659 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000660 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
661 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000662 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
663 //
664 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000665 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
666 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000667 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
668 //
669 // CHECK: [[EXEC_PARALLEL]]
670 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
671 //
672 // CHECK: [[TERM_PARALLEL]]
673 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
674 //
675 // CHECK: [[BAR_PARALLEL]]
Alexey Bataeva3924b52019-01-03 16:25:35 +0000676 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000677 // CHECK: br label {{%?}}[[AWAIT_WORK]]
678 //
679 // CHECK: [[EXIT]]
680 // CHECK: ret void
681
Alexey Bataev6393eb72018-12-06 15:35:13 +0000682 // CHECK: define {{.*}}void [[T6:@__omp_offloading_.+template.+l345]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000683 // Create local storage for each capture.
684 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
685 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
686 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
687 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
688 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
689 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
690 // Store captures in the context.
691 // CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
692 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
693 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
694 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000695 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
696 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
697 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000698 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000699 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
700 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000701 //
702 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000703 // CHECK: {{call|invoke}} void [[T6]]_worker()
704 // CHECK: br label {{%?}}[[EXIT:.+]]
705 //
706 // CHECK: [[CHECK_MASTER]]
707 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
708 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
709 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
710 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
711 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000712 //
713 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000714 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
715 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000716 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000717 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000718 //
719 // CHECK-64-DAG: load i32, i32* [[REF_A]]
720 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
721 // CHECK-DAG: load i16, i16* [[REF_AA]]
722 // CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
723 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000724 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000725 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000726 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000727 // CHECK: call void @__kmpc_kernel_deinit(
Alexey Bataeva3924b52019-01-03 16:25:35 +0000728 // CHECK: call void @__kmpc_barrier_simple_spmd(%struct.ident_t* null, i32 0)
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000729 // CHECK: br label {{%?}}[[EXIT]]
730 //
731 // CHECK: [[EXIT]]
732 // CHECK: ret void
Alexey Bataev6393eb72018-12-06 15:35:13 +0000733
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000734#endif