blob: 3525d2e2054cf500786329090a46e5686c90c6bb [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
Arpith Chacko Jacob44a87c92017-01-18 19:35:00 +000011// Check that the execution mode of all 6 target regions is set to Generic Mode.
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000012// CHECK-DAG: {{@__omp_offloading_.+l103}}_exec_mode = weak constant i8 1
13// CHECK-DAG: {{@__omp_offloading_.+l180}}_exec_mode = weak constant i8 1
14// CHECK-DAG: {{@__omp_offloading_.+l290}}_exec_mode = weak constant i8 1
15// CHECK-DAG: {{@__omp_offloading_.+l328}}_exec_mode = weak constant i8 1
16// CHECK-DAG: {{@__omp_offloading_.+l346}}_exec_mode = weak constant i8 1
17// CHECK-DAG: {{@__omp_offloading_.+l311}}_exec_mode = weak constant i8 1
Alexey Bataev979966f2017-05-24 16:00:02 +000018
19__thread int id;
Arpith Chacko Jacob44a87c92017-01-18 19:35:00 +000020
Alexey Bataev2a3320a2018-05-15 18:01:01 +000021int baz(int f, double &a);
Alexey Bataevd7ff6d62018-05-07 14:50:05 +000022
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000023template<typename tx, typename ty>
24struct TT{
25 tx X;
26 ty Y;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000027 tx &operator[](int i) { return X; }
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000028};
29
30int foo(int n) {
31 int a = 0;
32 short aa = 0;
33 float b[10];
34 float bn[n];
35 double c[5][10];
36 double cn[5][n];
37 TT<long long, char> d;
38
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000039 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l103}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000040 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
41 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
42 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
43 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000044 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
45 //
46 // CHECK: [[AWAIT_WORK]]
47 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000048 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
49 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000050 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
51 //
52 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000053 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
54 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000055 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
56 //
57 // CHECK: [[EXEC_PARALLEL]]
58 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
59 //
60 // CHECK: [[TERM_PARALLEL]]
61 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
62 //
63 // CHECK: [[BAR_PARALLEL]]
64 // CHECK: call void @llvm.nvvm.barrier0()
65 // CHECK: br label {{%?}}[[AWAIT_WORK]]
66 //
67 // CHECK: [[EXIT]]
68 // CHECK: ret void
69
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000070 // CHECK: define {{.*}}void [[T1:@__omp_offloading_.+foo.+l103]]()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000071 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
72 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
73 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +000074 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000075 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
76 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000077 //
78 // CHECK: [[WORKER]]
Alexey Bataev5e87c342016-12-22 19:44:05 +000079 // CHECK: {{call|invoke}} void [[T1]]_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000080 // CHECK: br label {{%?}}[[EXIT:.+]]
81 //
82 // CHECK: [[CHECK_MASTER]]
83 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
84 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
85 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
86 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
87 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000088 //
89 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000090 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
91 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +000092 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000093 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
94 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000095 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000096 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +000097 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000098 // CHECK: call void @llvm.nvvm.barrier0()
99 // CHECK: br label {{%?}}[[EXIT]]
100 //
101 // CHECK: [[EXIT]]
102 // CHECK: ret void
103 #pragma omp target
104 {
105 }
106
107 // CHECK-NOT: define {{.*}}void [[T2:@__omp_offloading_.+foo.+]]_worker()
108 #pragma omp target if(0)
109 {
110 }
111
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000112 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l180}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000113 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
114 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
115 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
116 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000117 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
118 //
119 // CHECK: [[AWAIT_WORK]]
120 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000121 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
122 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000123 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
124 //
125 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000126 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
127 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000128 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
129 //
130 // CHECK: [[EXEC_PARALLEL]]
131 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
132 //
133 // CHECK: [[TERM_PARALLEL]]
134 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
135 //
136 // CHECK: [[BAR_PARALLEL]]
137 // CHECK: call void @llvm.nvvm.barrier0()
138 // CHECK: br label {{%?}}[[AWAIT_WORK]]
139 //
140 // CHECK: [[EXIT]]
141 // CHECK: ret void
142
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000143 // CHECK: define {{.*}}void [[T2:@__omp_offloading_.+foo.+l180]](i[[SZ:32|64]] [[ARG1:%[a-zA-Z_]+]], i[[SZ:32|64]] [[ID:%[a-zA-Z_]+]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000144 // CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]],
145 // CHECK: store i[[SZ]] [[ARG1]], i[[SZ]]* [[AA_ADDR]],
146 // CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000147 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
148 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
149 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000150 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000151 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
152 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000153 //
154 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000155 // CHECK: {{call|invoke}} void [[T2]]_worker()
156 // CHECK: br label {{%?}}[[EXIT:.+]]
157 //
158 // CHECK: [[CHECK_MASTER]]
159 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
160 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
161 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
162 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
163 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000164 //
165 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000166 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
167 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000168 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000169 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000170 // CHECK: load i16, i16* [[AA_CADDR]],
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000171 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000172 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000173 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000174 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000175 // CHECK: call void @llvm.nvvm.barrier0()
176 // CHECK: br label {{%?}}[[EXIT]]
177 //
178 // CHECK: [[EXIT]]
179 // CHECK: ret void
180 #pragma omp target if(1)
181 {
182 aa += 1;
Alexey Bataev979966f2017-05-24 16:00:02 +0000183 id = aa;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000184 }
185
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000186 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l290}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000187 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
188 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
189 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
190 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000191 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
192 //
193 // CHECK: [[AWAIT_WORK]]
194 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000195 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
196 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000197 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
198 //
199 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000200 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
201 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000202 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
203 //
204 // CHECK: [[EXEC_PARALLEL]]
205 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
206 //
207 // CHECK: [[TERM_PARALLEL]]
208 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
209 //
210 // CHECK: [[BAR_PARALLEL]]
211 // CHECK: call void @llvm.nvvm.barrier0()
212 // CHECK: br label {{%?}}[[AWAIT_WORK]]
213 //
214 // CHECK: [[EXIT]]
215 // CHECK: ret void
216
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000217 // CHECK: define {{.*}}void [[T3:@__omp_offloading_.+foo.+l290]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000218 // Create local storage for each capture.
219 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
220 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x float]*
221 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
222 // CHECK: [[LOCAL_BN:%.+]] = alloca float*
223 // CHECK: [[LOCAL_C:%.+]] = alloca [5 x [10 x double]]*
224 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
225 // CHECK: [[LOCAL_VLA3:%.+]] = alloca i[[SZ]]
226 // CHECK: [[LOCAL_CN:%.+]] = alloca double*
227 // CHECK: [[LOCAL_D:%.+]] = alloca [[TT:%.+]]*
228 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
229 // CHECK-DAG: store [10 x float]* [[ARG_B:%.+]], [10 x float]** [[LOCAL_B]]
230 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
231 // CHECK-DAG: store float* [[ARG_BN:%.+]], float** [[LOCAL_BN]]
232 // CHECK-DAG: store [5 x [10 x double]]* [[ARG_C:%.+]], [5 x [10 x double]]** [[LOCAL_C]]
233 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
234 // CHECK-DAG: store i[[SZ]] [[ARG_VLA3:%.+]], i[[SZ]]* [[LOCAL_VLA3]]
235 // CHECK-DAG: store double* [[ARG_CN:%.+]], double** [[LOCAL_CN]]
236 // CHECK-DAG: store [[TT]]* [[ARG_D:%.+]], [[TT]]** [[LOCAL_D]]
237 //
238 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i64* [[LOCAL_A]] to i32*
239 // CHECK-DAG: [[REF_B:%.+]] = load [10 x float]*, [10 x float]** [[LOCAL_B]],
240 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
241 // CHECK-DAG: [[REF_BN:%.+]] = load float*, float** [[LOCAL_BN]],
242 // CHECK-DAG: [[REF_C:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[LOCAL_C]],
243 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
244 // CHECK-DAG: [[VAL_VLA3:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA3]],
245 // CHECK-DAG: [[REF_CN:%.+]] = load double*, double** [[LOCAL_CN]],
246 // CHECK-DAG: [[REF_D:%.+]] = load [[TT]]*, [[TT]]** [[LOCAL_D]],
247 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000248 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
249 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
250 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000251 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000252 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
253 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000254 //
255 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000256 // CHECK: {{call|invoke}} void [[T3]]_worker()
257 // CHECK: br label {{%?}}[[EXIT:.+]]
258 //
259 // CHECK: [[CHECK_MASTER]]
260 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
261 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
262 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
263 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
264 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000265 //
266 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000267 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
268 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000269 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000270 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000271 //
272 // Use captures.
273 // CHECK-64-DAG: load i32, i32* [[REF_A]]
274 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
275 // CHECK-DAG: getelementptr inbounds [10 x float], [10 x float]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
276 // CHECK-DAG: getelementptr inbounds float, float* [[REF_BN]], i[[SZ]] 3
277 // CHECK-DAG: getelementptr inbounds [5 x [10 x double]], [5 x [10 x double]]* [[REF_C]], i[[SZ]] 0, i[[SZ]] 1
278 // CHECK-DAG: getelementptr inbounds double, double* [[REF_CN]], i[[SZ]] %{{.+}}
279 // CHECK-DAG: getelementptr inbounds [[TT]], [[TT]]* [[REF_D]], i32 0, i32 0
280 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000281 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000282 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000283 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000284 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000285 // CHECK: call void @llvm.nvvm.barrier0()
286 // CHECK: br label {{%?}}[[EXIT]]
287 //
288 // CHECK: [[EXIT]]
289 // CHECK: ret void
290 #pragma omp target if(n>20)
291 {
292 a += 1;
293 b[2] += 1.0;
294 bn[3] += 1.0;
295 c[1][2] += 1.0;
296 cn[1][3] += 1.0;
297 d.X += 1;
298 d.Y += 1;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000299 d[0] += 1;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000300 }
301
302 return a;
303}
304
305template<typename tx>
306tx ftemplate(int n) {
307 tx a = 0;
308 short aa = 0;
309 tx b[10];
310
311 #pragma omp target if(n>40)
312 {
313 a += 1;
314 aa += 1;
315 b[2] += 1;
316 }
317
318 return a;
319}
320
321static
322int fstatic(int n) {
323 int a = 0;
324 short aa = 0;
325 char aaa = 0;
326 int b[10];
327
328 #pragma omp target if(n>50)
329 {
330 a += 1;
331 aa += 1;
332 aaa += 1;
333 b[2] += 1;
334 }
335
336 return a;
337}
338
339struct S1 {
340 double a;
341
342 int r1(int n){
343 int b = n+1;
344 short int c[2][n];
345
346 #pragma omp target if(n>60)
347 {
348 this->a = (double)b + 1.5;
349 c[1][1] = ++a;
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000350 baz(a, a);
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000351 }
352
353 return c[1][1] + (int)b;
354 }
355};
356
357int bar(int n){
358 int a = 0;
359
360 a += foo(n);
361
362 S1 S;
363 a += S.r1(n);
364
365 a += fstatic(n);
366
367 a += ftemplate<int>(n);
368
369 return a;
370}
371
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000372int baz(int f, double &a) {
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000373#pragma omp parallel
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000374 f = 2 + a;
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000375 return f;
376}
377
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000378 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+static.+328}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000379 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
380 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
381 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
382 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000383 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
384 //
385 // CHECK: [[AWAIT_WORK]]
386 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000387 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
388 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000389 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
390 //
391 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000392 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
393 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000394 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
395 //
396 // CHECK: [[EXEC_PARALLEL]]
397 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
398 //
399 // CHECK: [[TERM_PARALLEL]]
400 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
401 //
402 // CHECK: [[BAR_PARALLEL]]
403 // CHECK: call void @llvm.nvvm.barrier0()
404 // CHECK: br label {{%?}}[[AWAIT_WORK]]
405 //
406 // CHECK: [[EXIT]]
407 // CHECK: ret void
408
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000409 // CHECK: define {{.*}}void [[T4:@__omp_offloading_.+static.+l328]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000410 // Create local storage for each capture.
411 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
412 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
413 // CHECK: [[LOCAL_AAA:%.+]] = alloca i[[SZ]]
414 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
415 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
416 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
417 // CHECK-DAG: store i[[SZ]] [[ARG_AAA:%.+]], i[[SZ]]* [[LOCAL_AAA]]
418 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
419 // Store captures in the context.
420 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
421 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
422 // CHECK-DAG: [[REF_AAA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA]] to i8*
423 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
424 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000425 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
426 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
427 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000428 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000429 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
430 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000431 //
432 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000433 // CHECK: {{call|invoke}} void [[T4]]_worker()
434 // CHECK: br label {{%?}}[[EXIT:.+]]
435 //
436 // CHECK: [[CHECK_MASTER]]
437 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
438 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
439 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
440 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
441 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000442 //
443 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000444 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
445 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000446 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000447 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000448 // CHECK-64-DAG: load i32, i32* [[REF_A]]
449 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
450 // CHECK-DAG: load i16, i16* [[REF_AA]]
451 // 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 +0000452 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000453 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000454 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000455 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000456 // CHECK: call void @llvm.nvvm.barrier0()
457 // CHECK: br label {{%?}}[[EXIT]]
458 //
459 // CHECK: [[EXIT]]
460 // CHECK: ret void
461
462
463
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000464 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+S1.+l346}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000465 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
466 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000467 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t*
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000468 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
469 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000470 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
471 //
472 // CHECK: [[AWAIT_WORK]]
473 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000474 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
475 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000476 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
477 //
478 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000479 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
480 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000481 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
482 //
483 // CHECK: [[EXEC_PARALLEL]]
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000484 // CHECK: [[WORK_FN:%.+]] = bitcast i8* [[WORK]] to void (i16, i32)*
485 // CHECK: call void [[WORK_FN]](i16 0, i32 [[GTID]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000486 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
487 //
488 // CHECK: [[TERM_PARALLEL]]
489 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
490 //
491 // CHECK: [[BAR_PARALLEL]]
492 // CHECK: call void @llvm.nvvm.barrier0()
493 // CHECK: br label {{%?}}[[AWAIT_WORK]]
494 //
495 // CHECK: [[EXIT]]
496 // CHECK: ret void
497
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000498 // CHECK: define {{.*}}void [[T5:@__omp_offloading_.+S1.+l346]](
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000499 // Create local storage for each capture.
500 // CHECK: [[LOCAL_THIS:%.+]] = alloca [[S1:%struct.*]]*
501 // CHECK: [[LOCAL_B:%.+]] = alloca i[[SZ]]
502 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
503 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
504 // CHECK: [[LOCAL_C:%.+]] = alloca i16*
505 // CHECK-DAG: store [[S1]]* [[ARG_THIS:%.+]], [[S1]]** [[LOCAL_THIS]]
506 // CHECK-DAG: store i[[SZ]] [[ARG_B:%.+]], i[[SZ]]* [[LOCAL_B]]
507 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
508 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
509 // CHECK-DAG: store i16* [[ARG_C:%.+]], i16** [[LOCAL_C]]
510 // Store captures in the context.
511 // CHECK-DAG: [[REF_THIS:%.+]] = load [[S1]]*, [[S1]]** [[LOCAL_THIS]],
512 // CHECK-64-DAG:[[REF_B:%.+]] = bitcast i[[SZ]]* [[LOCAL_B]] to i32*
513 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
514 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
515 // CHECK-DAG: [[REF_C:%.+]] = load i16*, i16** [[LOCAL_C]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000516 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000517 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
518 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
519 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000520 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000521 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
522 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000523 //
524 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000525 // CHECK: {{call|invoke}} void [[T5]]_worker()
526 // CHECK: br label {{%?}}[[EXIT:.+]]
527 //
528 // CHECK: [[CHECK_MASTER]]
529 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
530 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
531 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
532 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
533 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000534 //
535 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000536 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
537 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000538 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000539 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000540 // Use captures.
541 // CHECK-DAG: getelementptr inbounds [[S1]], [[S1]]* [[REF_THIS]], i32 0, i32 0
542 // CHECK-64-DAG:load i32, i32* [[REF_B]]
543 // CHECK-32-DAG:load i32, i32* [[LOCAL_B]]
544 // CHECK-DAG: getelementptr inbounds i16, i16* [[REF_C]], i[[SZ]] %{{.+}}
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000545 // CHECK: call i32 [[BAZ:@.*baz.*]](i32 %
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000546 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000547 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000548 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000549 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000550 // CHECK: call void @llvm.nvvm.barrier0()
551 // CHECK: br label {{%?}}[[EXIT]]
552 //
553 // CHECK: [[EXIT]]
554 // CHECK: ret void
555
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000556 // CHECK: define i32 [[BAZ]](i32 [[F:%.*]], double* dereferenceable{{.*}})
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000557 // CHECK: alloca i32,
558 // CHECK: [[LOCAL_F_PTR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000559 // CHECK: [[ZERO_ADDR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000560 // CHECK: store i32 0, i32* [[ZERO_ADDR]]
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000561 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t*
562 // CHECK: [[PAR_LEVEL:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* @0, i32 [[GTID]])
563 // CHECK: [[IS_TTD:%.+]] = icmp eq i16 %1, 0
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000564 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
565 // CHECK: [[IS_SPMD:%.+]] = icmp ne i8 [[RES]], 0
566 // CHECK: br i1 [[IS_SPMD]], label
567 // CHECK: br label
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000568 // CHECK: [[SIZE:%.+]] = select i1 [[IS_TTD]], i{{64|32}} 4, i{{64|32}} 128
569 // CHECK: [[PTR:%.+]] = call i8* @__kmpc_data_sharing_push_stack(i{{64|32}} [[SIZE]], i16 0)
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000570 // CHECK: [[REC_ADDR:%.+]] = bitcast i8* [[PTR]] to [[GLOBAL_ST:%.+]]*
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000571 // CHECK: br label
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000572 // CHECK: [[ITEMS:%.+]] = phi [[GLOBAL_ST]]* [ null, {{.+}} ], [ [[REC_ADDR]], {{.+}} ]
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000573 // CHECK: [[TTD_ITEMS:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to [[SEC_GLOBAL_ST:%.+]]*
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000574 // CHECK: [[F_PTR_ARR:%.+]] = getelementptr inbounds [[GLOBAL_ST]], [[GLOBAL_ST]]* [[ITEMS]], i32 0, i32 0
575 // CHECK: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
576 // CHECK: [[LID:%.+]] = and i32 [[TID]], 31
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000577 // CHECK: [[GLOBAL_F_PTR_PAR:%.+]] = getelementptr inbounds [32 x i32], [32 x i32]* [[F_PTR_ARR]], i32 0, i32 [[LID]]
578 // CHECK: [[GLOBAL_F_PTR_TTD:%.+]] = getelementptr inbounds [[SEC_GLOBAL_ST]], [[SEC_GLOBAL_ST]]* [[TTD_ITEMS]], i32 0, i32 0
579 // 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 +0000580 // CHECK: [[F_PTR:%.+]] = select i1 [[IS_SPMD]], i32* [[LOCAL_F_PTR]], i32* [[GLOBAL_F_PTR]]
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000581 // CHECK: store i32 %{{.+}}, i32* [[F_PTR]],
Alexey Bataev673110d2018-05-16 13:36:30 +0000582
583 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
584 // CHECK: icmp ne i8 [[RES]], 0
585 // CHECK: br i1
586
Alexey Bataev0baba9e2018-05-25 20:16:03 +0000587 // CHECK: [[RES:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* @{{.+}}, i32 [[GTID]])
588 // CHECK: icmp ne i16 [[RES]], 0
589 // CHECK: br i1
590
Alexey Bataev673110d2018-05-16 13:36:30 +0000591 // CHECK: call void @__kmpc_serialized_parallel(%struct.ident_t* @{{.+}}, i32 [[GTID]])
Alexey Bataev8521ff62018-07-25 20:03:01 +0000592 // CHECK: call void [[OUTLINED:@.+]](i32* [[ZERO_ADDR]], i32* [[ZERO_ADDR]], i32* [[F_PTR]], double* %{{.+}})
Alexey Bataev673110d2018-05-16 13:36:30 +0000593 // CHECK: call void @__kmpc_end_serialized_parallel(%struct.ident_t* @{{.+}}, i32 [[GTID]])
594 // CHECK: br label
595
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000596 // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i16, i32)* @{{.+}} to i8*), i16 1)
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000597 // CHECK: call void @__kmpc_begin_sharing_variables(i8*** [[SHARED_PTR:%.+]], i{{64|32}} 2)
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000598 // CHECK: [[SHARED:%.+]] = load i8**, i8*** [[SHARED_PTR]],
599 // CHECK: [[REF:%.+]] = getelementptr inbounds i8*, i8** [[SHARED]], i{{64|32}} 0
600 // CHECK: [[F_REF:%.+]] = bitcast i32* [[F_PTR]] to i8*
601 // CHECK: store i8* [[F_REF]], i8** [[REF]],
602 // CHECK: call void @llvm.nvvm.barrier0()
603 // CHECK: call void @llvm.nvvm.barrier0()
604 // CHECK: call void @__kmpc_end_sharing_variables()
605 // CHECK: br label
606
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000607 // CHECK: [[RES:%.+]] = load i32, i32* [[F_PTR]],
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000608 // CHECK: store i32 [[RES]], i32* [[RET:%.+]],
609 // CHECK: br i1 [[IS_SPMD]], label
610 // CHECK: [[BC:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to i8*
611 // CHECK: call void @__kmpc_data_sharing_pop_stack(i8* [[BC]])
612 // CHECK: br label
613 // CHECK: [[RES:%.+]] = load i32, i32* [[RET]],
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000614 // CHECK: ret i32 [[RES]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000615
616
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000617 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l311}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000618 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
619 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
620 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
621 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000622 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
623 //
624 // CHECK: [[AWAIT_WORK]]
625 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000626 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
627 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000628 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
629 //
630 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000631 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
632 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000633 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
634 //
635 // CHECK: [[EXEC_PARALLEL]]
636 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
637 //
638 // CHECK: [[TERM_PARALLEL]]
639 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
640 //
641 // CHECK: [[BAR_PARALLEL]]
642 // CHECK: call void @llvm.nvvm.barrier0()
643 // CHECK: br label {{%?}}[[AWAIT_WORK]]
644 //
645 // CHECK: [[EXIT]]
646 // CHECK: ret void
647
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000648 // CHECK: define {{.*}}void [[T6:@__omp_offloading_.+template.+l311]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000649 // Create local storage for each capture.
650 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
651 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
652 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
653 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
654 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
655 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
656 // Store captures in the context.
657 // CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
658 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
659 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
660 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000661 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
662 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
663 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000664 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000665 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
666 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000667 //
668 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000669 // CHECK: {{call|invoke}} void [[T6]]_worker()
670 // CHECK: br label {{%?}}[[EXIT:.+]]
671 //
672 // CHECK: [[CHECK_MASTER]]
673 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
674 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
675 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
676 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
677 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000678 //
679 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000680 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
681 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000682 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000683 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000684 //
685 // CHECK-64-DAG: load i32, i32* [[REF_A]]
686 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
687 // CHECK-DAG: load i16, i16* [[REF_AA]]
688 // CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
689 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000690 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000691 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000692 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000693 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000694 // CHECK: call void @llvm.nvvm.barrier0()
695 // CHECK: br label {{%?}}[[EXIT]]
696 //
697 // CHECK: [[EXIT]]
698 // CHECK: ret void
699#endif