blob: 4c17361e44b9907a40dafd9e28e3af8a5f89f946 [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 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
14// CHECK-DAG: {{@__omp_offloading_.+l105}}_exec_mode = weak constant i8 1
15// CHECK-DAG: {{@__omp_offloading_.+l182}}_exec_mode = weak constant i8 1
16// CHECK-DAG: {{@__omp_offloading_.+l292}}_exec_mode = weak constant i8 1
17// CHECK-DAG: {{@__omp_offloading_.+l330}}_exec_mode = weak constant i8 1
18// CHECK-DAG: {{@__omp_offloading_.+l348}}_exec_mode = weak constant i8 1
19// CHECK-DAG: {{@__omp_offloading_.+l313}}_exec_mode = weak constant i8 1
Alexey Bataev979966f2017-05-24 16:00:02 +000020
21__thread int id;
Arpith Chacko Jacob44a87c92017-01-18 19:35:00 +000022
Alexey Bataev2a3320a2018-05-15 18:01:01 +000023int baz(int f, double &a);
Alexey Bataevd7ff6d62018-05-07 14:50:05 +000024
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000025template<typename tx, typename ty>
26struct TT{
27 tx X;
28 ty Y;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +000029 tx &operator[](int i) { return X; }
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000030};
31
32int foo(int n) {
33 int a = 0;
34 short aa = 0;
35 float b[10];
36 float bn[n];
37 double c[5][10];
38 double cn[5][n];
39 TT<long long, char> d;
40
Alexey Bataeve8ad4b72018-11-26 18:37:09 +000041 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l105}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000042 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
43 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
44 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
45 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000046 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
47 //
48 // CHECK: [[AWAIT_WORK]]
49 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000050 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
51 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000052 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
53 //
54 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000055 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
56 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000057 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
58 //
59 // CHECK: [[EXEC_PARALLEL]]
60 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
61 //
62 // CHECK: [[TERM_PARALLEL]]
63 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
64 //
65 // CHECK: [[BAR_PARALLEL]]
66 // CHECK: call void @llvm.nvvm.barrier0()
67 // CHECK: br label {{%?}}[[AWAIT_WORK]]
68 //
69 // CHECK: [[EXIT]]
70 // CHECK: ret void
71
Alexey Bataeve8ad4b72018-11-26 18:37:09 +000072 // CHECK: define {{.*}}void [[T1:@__omp_offloading_.+foo.+l105]]()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000073 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
74 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
75 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +000076 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000077 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
78 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000079 //
80 // CHECK: [[WORKER]]
Alexey Bataev5e87c342016-12-22 19:44:05 +000081 // CHECK: {{call|invoke}} void [[T1]]_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000082 // CHECK: br label {{%?}}[[EXIT:.+]]
83 //
84 // CHECK: [[CHECK_MASTER]]
85 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
86 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
87 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
88 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
89 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000090 //
91 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000092 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
93 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +000094 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000095 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
96 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +000097 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +000098 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +000099 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000100 // CHECK: call void @llvm.nvvm.barrier0()
101 // CHECK: br label {{%?}}[[EXIT]]
102 //
103 // CHECK: [[EXIT]]
104 // CHECK: ret void
105 #pragma omp target
106 {
107 }
108
109 // CHECK-NOT: define {{.*}}void [[T2:@__omp_offloading_.+foo.+]]_worker()
110 #pragma omp target if(0)
111 {
112 }
113
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000114 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l182}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000115 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
116 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
117 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
118 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000119 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
120 //
121 // CHECK: [[AWAIT_WORK]]
122 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000123 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
124 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000125 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
126 //
127 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000128 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
129 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000130 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
131 //
132 // CHECK: [[EXEC_PARALLEL]]
133 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
134 //
135 // CHECK: [[TERM_PARALLEL]]
136 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
137 //
138 // CHECK: [[BAR_PARALLEL]]
139 // CHECK: call void @llvm.nvvm.barrier0()
140 // CHECK: br label {{%?}}[[AWAIT_WORK]]
141 //
142 // CHECK: [[EXIT]]
143 // CHECK: ret void
144
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000145 // CHECK: define {{.*}}void [[T2:@__omp_offloading_.+foo.+l182]](i[[SZ:32|64]] [[ARG1:%[a-zA-Z_]+]], i[[SZ:32|64]] [[ID:%[a-zA-Z_]+]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000146 // CHECK: [[AA_ADDR:%.+]] = alloca i[[SZ]],
147 // CHECK: store i[[SZ]] [[ARG1]], i[[SZ]]* [[AA_ADDR]],
148 // CHECK: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i16*
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000149 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
150 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
151 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000152 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000153 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
154 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000155 //
156 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000157 // CHECK: {{call|invoke}} void [[T2]]_worker()
158 // CHECK: br label {{%?}}[[EXIT:.+]]
159 //
160 // CHECK: [[CHECK_MASTER]]
161 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
162 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
163 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
164 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
165 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000166 //
167 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000168 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
169 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000170 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000171 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000172 // CHECK: load i16, i16* [[AA_CADDR]],
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000173 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000174 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000175 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000176 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000177 // CHECK: call void @llvm.nvvm.barrier0()
178 // CHECK: br label {{%?}}[[EXIT]]
179 //
180 // CHECK: [[EXIT]]
181 // CHECK: ret void
182 #pragma omp target if(1)
183 {
184 aa += 1;
Alexey Bataev979966f2017-05-24 16:00:02 +0000185 id = aa;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000186 }
187
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000188 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+foo.+l292}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000189 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
190 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
191 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
192 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000193 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
194 //
195 // CHECK: [[AWAIT_WORK]]
196 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000197 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
198 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000199 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
200 //
201 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000202 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
203 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000204 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
205 //
206 // CHECK: [[EXEC_PARALLEL]]
207 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
208 //
209 // CHECK: [[TERM_PARALLEL]]
210 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
211 //
212 // CHECK: [[BAR_PARALLEL]]
213 // CHECK: call void @llvm.nvvm.barrier0()
214 // CHECK: br label {{%?}}[[AWAIT_WORK]]
215 //
216 // CHECK: [[EXIT]]
217 // CHECK: ret void
218
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000219 // CHECK: define {{.*}}void [[T3:@__omp_offloading_.+foo.+l292]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000220 // Create local storage for each capture.
221 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
222 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x float]*
223 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
224 // CHECK: [[LOCAL_BN:%.+]] = alloca float*
225 // CHECK: [[LOCAL_C:%.+]] = alloca [5 x [10 x double]]*
226 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
227 // CHECK: [[LOCAL_VLA3:%.+]] = alloca i[[SZ]]
228 // CHECK: [[LOCAL_CN:%.+]] = alloca double*
229 // CHECK: [[LOCAL_D:%.+]] = alloca [[TT:%.+]]*
230 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
231 // CHECK-DAG: store [10 x float]* [[ARG_B:%.+]], [10 x float]** [[LOCAL_B]]
232 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
233 // CHECK-DAG: store float* [[ARG_BN:%.+]], float** [[LOCAL_BN]]
234 // CHECK-DAG: store [5 x [10 x double]]* [[ARG_C:%.+]], [5 x [10 x double]]** [[LOCAL_C]]
235 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
236 // CHECK-DAG: store i[[SZ]] [[ARG_VLA3:%.+]], i[[SZ]]* [[LOCAL_VLA3]]
237 // CHECK-DAG: store double* [[ARG_CN:%.+]], double** [[LOCAL_CN]]
238 // CHECK-DAG: store [[TT]]* [[ARG_D:%.+]], [[TT]]** [[LOCAL_D]]
239 //
240 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i64* [[LOCAL_A]] to i32*
241 // CHECK-DAG: [[REF_B:%.+]] = load [10 x float]*, [10 x float]** [[LOCAL_B]],
242 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
243 // CHECK-DAG: [[REF_BN:%.+]] = load float*, float** [[LOCAL_BN]],
244 // CHECK-DAG: [[REF_C:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[LOCAL_C]],
245 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
246 // CHECK-DAG: [[VAL_VLA3:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA3]],
247 // CHECK-DAG: [[REF_CN:%.+]] = load double*, double** [[LOCAL_CN]],
248 // CHECK-DAG: [[REF_D:%.+]] = load [[TT]]*, [[TT]]** [[LOCAL_D]],
249 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000250 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
251 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
252 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000253 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000254 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
255 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000256 //
257 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000258 // CHECK: {{call|invoke}} void [[T3]]_worker()
259 // CHECK: br label {{%?}}[[EXIT:.+]]
260 //
261 // CHECK: [[CHECK_MASTER]]
262 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
263 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
264 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
265 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
266 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000267 //
268 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000269 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
270 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000271 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000272 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000273 //
274 // Use captures.
275 // CHECK-64-DAG: load i32, i32* [[REF_A]]
276 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
277 // CHECK-DAG: getelementptr inbounds [10 x float], [10 x float]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
278 // CHECK-DAG: getelementptr inbounds float, float* [[REF_BN]], i[[SZ]] 3
279 // CHECK-DAG: getelementptr inbounds [5 x [10 x double]], [5 x [10 x double]]* [[REF_C]], i[[SZ]] 0, i[[SZ]] 1
280 // CHECK-DAG: getelementptr inbounds double, double* [[REF_CN]], i[[SZ]] %{{.+}}
281 // CHECK-DAG: getelementptr inbounds [[TT]], [[TT]]* [[REF_D]], i32 0, i32 0
282 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000283 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000284 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000285 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000286 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000287 // CHECK: call void @llvm.nvvm.barrier0()
288 // CHECK: br label {{%?}}[[EXIT]]
289 //
290 // CHECK: [[EXIT]]
291 // CHECK: ret void
292 #pragma omp target if(n>20)
293 {
294 a += 1;
295 b[2] += 1.0;
296 bn[3] += 1.0;
297 c[1][2] += 1.0;
298 cn[1][3] += 1.0;
299 d.X += 1;
300 d.Y += 1;
Alexey Bataev3dd1f9d2018-07-16 16:49:20 +0000301 d[0] += 1;
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000302 }
303
304 return a;
305}
306
307template<typename tx>
308tx ftemplate(int n) {
309 tx a = 0;
310 short aa = 0;
311 tx b[10];
312
313 #pragma omp target if(n>40)
314 {
315 a += 1;
316 aa += 1;
317 b[2] += 1;
318 }
319
320 return a;
321}
322
323static
324int fstatic(int n) {
325 int a = 0;
326 short aa = 0;
327 char aaa = 0;
328 int b[10];
329
330 #pragma omp target if(n>50)
331 {
332 a += 1;
333 aa += 1;
334 aaa += 1;
335 b[2] += 1;
336 }
337
338 return a;
339}
340
341struct S1 {
342 double a;
343
344 int r1(int n){
345 int b = n+1;
346 short int c[2][n];
347
348 #pragma omp target if(n>60)
349 {
350 this->a = (double)b + 1.5;
351 c[1][1] = ++a;
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000352 baz(a, a);
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000353 }
354
355 return c[1][1] + (int)b;
356 }
357};
358
359int bar(int n){
360 int a = 0;
361
362 a += foo(n);
363
364 S1 S;
365 a += S.r1(n);
366
367 a += fstatic(n);
368
369 a += ftemplate<int>(n);
370
371 return a;
372}
373
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000374int baz(int f, double &a) {
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000375#pragma omp parallel
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000376 f = 2 + a;
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000377 return f;
378}
379
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000380 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+static.+330}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000381 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
382 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
383 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
384 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000385 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
386 //
387 // CHECK: [[AWAIT_WORK]]
388 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000389 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
390 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000391 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
392 //
393 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000394 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
395 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000396 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
397 //
398 // CHECK: [[EXEC_PARALLEL]]
399 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
400 //
401 // CHECK: [[TERM_PARALLEL]]
402 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
403 //
404 // CHECK: [[BAR_PARALLEL]]
405 // CHECK: call void @llvm.nvvm.barrier0()
406 // CHECK: br label {{%?}}[[AWAIT_WORK]]
407 //
408 // CHECK: [[EXIT]]
409 // CHECK: ret void
410
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000411 // CHECK: define {{.*}}void [[T4:@__omp_offloading_.+static.+l330]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000412 // Create local storage for each capture.
413 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
414 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
415 // CHECK: [[LOCAL_AAA:%.+]] = alloca i[[SZ]]
416 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
417 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
418 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
419 // CHECK-DAG: store i[[SZ]] [[ARG_AAA:%.+]], i[[SZ]]* [[LOCAL_AAA]]
420 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
421 // Store captures in the context.
422 // CHECK-64-DAG: [[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
423 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
424 // CHECK-DAG: [[REF_AAA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AAA]] to i8*
425 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
426 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000427 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
428 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
429 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000430 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000431 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
432 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000433 //
434 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000435 // CHECK: {{call|invoke}} void [[T4]]_worker()
436 // CHECK: br label {{%?}}[[EXIT:.+]]
437 //
438 // CHECK: [[CHECK_MASTER]]
439 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
440 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
441 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
442 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
443 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000444 //
445 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000446 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
447 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000448 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000449 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000450 // CHECK-64-DAG: load i32, i32* [[REF_A]]
451 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
452 // CHECK-DAG: load i16, i16* [[REF_AA]]
453 // 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 +0000454 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000455 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000456 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000457 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000458 // CHECK: call void @llvm.nvvm.barrier0()
459 // CHECK: br label {{%?}}[[EXIT]]
460 //
461 // CHECK: [[EXIT]]
462 // CHECK: ret void
463
464
465
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000466 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+S1.+l348}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000467 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
468 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000469 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[NONSPMD]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000470 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
471 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000472 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
473 //
474 // CHECK: [[AWAIT_WORK]]
475 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000476 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
477 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000478 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
479 //
480 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000481 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
482 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000483 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
484 //
485 // CHECK: [[EXEC_PARALLEL]]
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000486 // CHECK: [[WORK_FN:%.+]] = bitcast i8* [[WORK]] to void (i16, i32)*
487 // CHECK: call void [[WORK_FN]](i16 0, i32 [[GTID]])
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000488 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
489 //
490 // CHECK: [[TERM_PARALLEL]]
491 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
492 //
493 // CHECK: [[BAR_PARALLEL]]
494 // CHECK: call void @llvm.nvvm.barrier0()
495 // CHECK: br label {{%?}}[[AWAIT_WORK]]
496 //
497 // CHECK: [[EXIT]]
498 // CHECK: ret void
499
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000500 // CHECK: define {{.*}}void [[T5:@__omp_offloading_.+S1.+l348]](
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000501 // Create local storage for each capture.
502 // CHECK: [[LOCAL_THIS:%.+]] = alloca [[S1:%struct.*]]*
503 // CHECK: [[LOCAL_B:%.+]] = alloca i[[SZ]]
504 // CHECK: [[LOCAL_VLA1:%.+]] = alloca i[[SZ]]
505 // CHECK: [[LOCAL_VLA2:%.+]] = alloca i[[SZ]]
506 // CHECK: [[LOCAL_C:%.+]] = alloca i16*
507 // CHECK-DAG: store [[S1]]* [[ARG_THIS:%.+]], [[S1]]** [[LOCAL_THIS]]
508 // CHECK-DAG: store i[[SZ]] [[ARG_B:%.+]], i[[SZ]]* [[LOCAL_B]]
509 // CHECK-DAG: store i[[SZ]] [[ARG_VLA1:%.+]], i[[SZ]]* [[LOCAL_VLA1]]
510 // CHECK-DAG: store i[[SZ]] [[ARG_VLA2:%.+]], i[[SZ]]* [[LOCAL_VLA2]]
511 // CHECK-DAG: store i16* [[ARG_C:%.+]], i16** [[LOCAL_C]]
512 // Store captures in the context.
513 // CHECK-DAG: [[REF_THIS:%.+]] = load [[S1]]*, [[S1]]** [[LOCAL_THIS]],
514 // CHECK-64-DAG:[[REF_B:%.+]] = bitcast i[[SZ]]* [[LOCAL_B]] to i32*
515 // CHECK-DAG: [[VAL_VLA1:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA1]],
516 // CHECK-DAG: [[VAL_VLA2:%.+]] = load i[[SZ]], i[[SZ]]* [[LOCAL_VLA2]],
517 // CHECK-DAG: [[REF_C:%.+]] = load i16*, i16** [[LOCAL_C]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000518 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000519 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
520 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
521 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000522 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000523 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
524 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000525 //
526 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000527 // CHECK: {{call|invoke}} void [[T5]]_worker()
528 // CHECK: br label {{%?}}[[EXIT:.+]]
529 //
530 // CHECK: [[CHECK_MASTER]]
531 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
532 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
533 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
534 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
535 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000536 //
537 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000538 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
539 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000540 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000541 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000542 // Use captures.
543 // CHECK-DAG: getelementptr inbounds [[S1]], [[S1]]* [[REF_THIS]], i32 0, i32 0
544 // CHECK-64-DAG:load i32, i32* [[REF_B]]
545 // CHECK-32-DAG:load i32, i32* [[LOCAL_B]]
546 // CHECK-DAG: getelementptr inbounds i16, i16* [[REF_C]], i[[SZ]] %{{.+}}
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000547 // CHECK: call i32 [[BAZ:@.*baz.*]](i32 %
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000548 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000549 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000550 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000551 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000552 // CHECK: call void @llvm.nvvm.barrier0()
553 // CHECK: br label {{%?}}[[EXIT]]
554 //
555 // CHECK: [[EXIT]]
556 // CHECK: ret void
557
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000558 // CHECK: define i32 [[BAZ]](i32 [[F:%.*]], double* dereferenceable{{.*}})
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000559 // CHECK: alloca i32,
560 // CHECK: [[LOCAL_F_PTR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000561 // CHECK: [[ZERO_ADDR:%.+]] = alloca i32,
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000562 // CHECK: store i32 0, i32* [[ZERO_ADDR]]
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000563 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[UNKNOWN]]
564 // CHECK: [[PAR_LEVEL:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000565 // CHECK: [[IS_TTD:%.+]] = icmp eq i16 %1, 0
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000566 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
567 // CHECK: [[IS_SPMD:%.+]] = icmp ne i8 [[RES]], 0
568 // CHECK: br i1 [[IS_SPMD]], label
569 // CHECK: br label
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000570 // CHECK: [[SIZE:%.+]] = select i1 [[IS_TTD]], i{{64|32}} 4, i{{64|32}} 128
Alexey Bataev1fc1f8e2018-11-02 16:08:31 +0000571 // CHECK: [[PTR:%.+]] = call i8* @__kmpc_data_sharing_coalesced_push_stack(i{{64|32}} [[SIZE]], i16 0)
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000572 // CHECK: [[REC_ADDR:%.+]] = bitcast i8* [[PTR]] to [[GLOBAL_ST:%.+]]*
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000573 // CHECK: br label
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000574 // CHECK: [[ITEMS:%.+]] = phi [[GLOBAL_ST]]* [ null, {{.+}} ], [ [[REC_ADDR]], {{.+}} ]
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000575 // CHECK: [[TTD_ITEMS:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to [[SEC_GLOBAL_ST:%.+]]*
Alexey Bataev9ea3c382018-10-09 14:49:00 +0000576 // CHECK: [[F_PTR_ARR:%.+]] = getelementptr inbounds [[GLOBAL_ST]], [[GLOBAL_ST]]* [[ITEMS]], i32 0, i32 0
577 // CHECK: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
578 // CHECK: [[LID:%.+]] = and i32 [[TID]], 31
Alexey Bataev9bfe91d2018-10-12 16:04:20 +0000579 // CHECK: [[GLOBAL_F_PTR_PAR:%.+]] = getelementptr inbounds [32 x i32], [32 x i32]* [[F_PTR_ARR]], i32 0, i32 [[LID]]
580 // CHECK: [[GLOBAL_F_PTR_TTD:%.+]] = getelementptr inbounds [[SEC_GLOBAL_ST]], [[SEC_GLOBAL_ST]]* [[TTD_ITEMS]], i32 0, i32 0
581 // 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 +0000582 // CHECK: [[F_PTR:%.+]] = select i1 [[IS_SPMD]], i32* [[LOCAL_F_PTR]], i32* [[GLOBAL_F_PTR]]
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000583 // CHECK: store i32 %{{.+}}, i32* [[F_PTR]],
Alexey Bataev673110d2018-05-16 13:36:30 +0000584
585 // CHECK: [[RES:%.+]] = call i8 @__kmpc_is_spmd_exec_mode()
586 // CHECK: icmp ne i8 [[RES]], 0
587 // CHECK: br i1
588
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000589 // CHECK: [[RES:%.+]] = call i16 @__kmpc_parallel_level(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev0baba9e2018-05-25 20:16:03 +0000590 // CHECK: icmp ne i16 [[RES]], 0
591 // CHECK: br i1
592
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000593 // CHECK: call void @__kmpc_serialized_parallel(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev8521ff62018-07-25 20:03:01 +0000594 // CHECK: call void [[OUTLINED:@.+]](i32* [[ZERO_ADDR]], i32* [[ZERO_ADDR]], i32* [[F_PTR]], double* %{{.+}})
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000595 // CHECK: call void @__kmpc_end_serialized_parallel(%struct.ident_t* [[UNKNOWN]], i32 [[GTID]])
Alexey Bataev673110d2018-05-16 13:36:30 +0000596 // CHECK: br label
597
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000598 // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i16, i32)* @{{.+}} to i8*), i16 1)
Alexey Bataev2a3320a2018-05-15 18:01:01 +0000599 // CHECK: call void @__kmpc_begin_sharing_variables(i8*** [[SHARED_PTR:%.+]], i{{64|32}} 2)
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000600 // CHECK: [[SHARED:%.+]] = load i8**, i8*** [[SHARED_PTR]],
601 // CHECK: [[REF:%.+]] = getelementptr inbounds i8*, i8** [[SHARED]], i{{64|32}} 0
602 // CHECK: [[F_REF:%.+]] = bitcast i32* [[F_PTR]] to i8*
603 // CHECK: store i8* [[F_REF]], i8** [[REF]],
604 // CHECK: call void @llvm.nvvm.barrier0()
605 // CHECK: call void @llvm.nvvm.barrier0()
606 // CHECK: call void @__kmpc_end_sharing_variables()
607 // CHECK: br label
608
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000609 // CHECK: [[RES:%.+]] = load i32, i32* [[F_PTR]],
Alexey Bataev8d8e1232018-08-29 18:32:21 +0000610 // CHECK: store i32 [[RES]], i32* [[RET:%.+]],
611 // CHECK: br i1 [[IS_SPMD]], label
612 // CHECK: [[BC:%.+]] = bitcast [[GLOBAL_ST]]* [[ITEMS]] to i8*
613 // CHECK: call void @__kmpc_data_sharing_pop_stack(i8* [[BC]])
614 // CHECK: br label
615 // CHECK: [[RES:%.+]] = load i32, i32* [[RET]],
Alexey Bataevd7ff6d62018-05-07 14:50:05 +0000616 // CHECK: ret i32 [[RES]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000617
618
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000619 // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l313}}_worker()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000620 // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8,
621 // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*,
622 // CHECK: store i8* null, i8** [[OMP_WORK_FN]],
623 // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]],
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000624 // CHECK: br label {{%?}}[[AWAIT_WORK:.+]]
625 //
626 // CHECK: [[AWAIT_WORK]]
627 // CHECK: call void @llvm.nvvm.barrier0()
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000628 // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]],
629 // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000630 // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]]
631 //
632 // CHECK: [[SEL_WORKERS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000633 // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]],
634 // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000635 // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]]
636 //
637 // CHECK: [[EXEC_PARALLEL]]
638 // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]]
639 //
640 // CHECK: [[TERM_PARALLEL]]
641 // CHECK: br label {{%?}}[[BAR_PARALLEL]]
642 //
643 // CHECK: [[BAR_PARALLEL]]
644 // CHECK: call void @llvm.nvvm.barrier0()
645 // CHECK: br label {{%?}}[[AWAIT_WORK]]
646 //
647 // CHECK: [[EXIT]]
648 // CHECK: ret void
649
Alexey Bataeve8ad4b72018-11-26 18:37:09 +0000650 // CHECK: define {{.*}}void [[T6:@__omp_offloading_.+template.+l313]](i[[SZ]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000651 // Create local storage for each capture.
652 // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]]
653 // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]]
654 // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]*
655 // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]]
656 // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]]
657 // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]]
658 // Store captures in the context.
659 // CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32*
660 // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16*
661 // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]],
662 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000663 // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
664 // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
665 // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000666 // CHECK-DAG: [[TH_LIMIT:%.+]] = sub nuw i32 [[NTH]], [[WS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000667 // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]]
668 // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000669 //
670 // CHECK: [[WORKER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000671 // CHECK: {{call|invoke}} void [[T6]]_worker()
672 // CHECK: br label {{%?}}[[EXIT:.+]]
673 //
674 // CHECK: [[CHECK_MASTER]]
675 // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
676 // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
677 // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
678 // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]],
679 // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000680 //
681 // CHECK: [[MASTER]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000682 // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
683 // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize()
Alexey Bataeve290ec02018-04-06 16:03:36 +0000684 // CHECK: [[MTMP1:%.+]] = sub nuw i32 [[MNTH]], [[MWS]]
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000685 // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000686 //
687 // CHECK-64-DAG: load i32, i32* [[REF_A]]
688 // CHECK-32-DAG: load i32, i32* [[LOCAL_A]]
689 // CHECK-DAG: load i16, i16* [[REF_AA]]
690 // CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2
691 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000692 // CHECK: br label {{%?}}[[TERMINATE:.+]]
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000693 //
Arpith Chacko Jacob406acdb2017-01-05 15:24:05 +0000694 // CHECK: [[TERMINATE]]
Jonas Hahnfeld891c7fb2017-11-22 14:46:49 +0000695 // CHECK: call void @__kmpc_kernel_deinit(
Arpith Chacko Jacob5c309e42016-03-22 01:48:56 +0000696 // CHECK: call void @llvm.nvvm.barrier0()
697 // CHECK: br label {{%?}}[[EXIT]]
698 //
699 // CHECK: [[EXIT]]
700 // CHECK: ret void
701#endif