113888870SDoru Bercea // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
213888870SDoru Bercea // REQUIRES: amdgpu-registered-target
313888870SDoru Bercea
413888870SDoru Bercea // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm-bc %s -o %t-ppc-host.bc
563ca93c7SSergio Afonso // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple amdgcn-amd-amdhsa -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s
613888870SDoru Bercea // expected-no-diagnostics
713888870SDoru Bercea #ifndef HEADER
813888870SDoru Bercea #define HEADER
913888870SDoru Bercea
foo1()1013888870SDoru Bercea int foo1() {
1113888870SDoru Bercea int sum = 0.0;
1213888870SDoru Bercea #pragma omp target map(tofrom: sum)
1313888870SDoru Bercea {
1413888870SDoru Bercea int N = 10;
1513888870SDoru Bercea int A[N];
1613888870SDoru Bercea
1713888870SDoru Bercea for (int i = 0; i < N; i++)
1813888870SDoru Bercea A[i] = i;
1913888870SDoru Bercea
2013888870SDoru Bercea for (int i = 0; i < N; i++)
2113888870SDoru Bercea sum += A[i];
2213888870SDoru Bercea }
2313888870SDoru Bercea return sum;
2413888870SDoru Bercea }
2513888870SDoru Bercea
foo2()2613888870SDoru Bercea int foo2() {
2713888870SDoru Bercea int sum = 0.0;
2813888870SDoru Bercea int M = 12;
2913888870SDoru Bercea int result[M];
3013888870SDoru Bercea #pragma omp target teams distribute parallel for map(from: result[:M])
3113888870SDoru Bercea for (int i = 0; i < M; i++) {
3213888870SDoru Bercea int N = 10;
3313888870SDoru Bercea int A[N];
3413888870SDoru Bercea result[i] = i;
3513888870SDoru Bercea
3613888870SDoru Bercea for (int j = 0; j < N; j++)
3713888870SDoru Bercea A[j] = j;
3813888870SDoru Bercea
3913888870SDoru Bercea for (int j = 0; j < N; j++)
4013888870SDoru Bercea result[i] += A[j];
4113888870SDoru Bercea }
4213888870SDoru Bercea
4313888870SDoru Bercea for (int i = 0; i < M; i++)
4413888870SDoru Bercea sum += result[i];
4513888870SDoru Bercea return sum;
4613888870SDoru Bercea }
4713888870SDoru Bercea
foo3()4813888870SDoru Bercea int foo3() {
4913888870SDoru Bercea int sum = 0.0;
5013888870SDoru Bercea int M = 12;
5113888870SDoru Bercea int result[M];
5213888870SDoru Bercea #pragma omp target teams distribute map(from: result[:M])
5313888870SDoru Bercea for (int i = 0; i < M; i++) {
5413888870SDoru Bercea int N = 10;
5513888870SDoru Bercea int A[N];
5613888870SDoru Bercea result[i] = i;
5713888870SDoru Bercea
5813888870SDoru Bercea #pragma omp parallel for
5913888870SDoru Bercea for (int j = 0; j < N; j++)
6013888870SDoru Bercea A[j] = j;
6113888870SDoru Bercea
6213888870SDoru Bercea for (int j = 0; j < N; j++)
6313888870SDoru Bercea result[i] += A[j];
6413888870SDoru Bercea }
6513888870SDoru Bercea
6613888870SDoru Bercea for (int i = 0; i < M; i++)
6713888870SDoru Bercea sum += result[i];
6813888870SDoru Bercea return sum;
6913888870SDoru Bercea }
7013888870SDoru Bercea
foo4()7113888870SDoru Bercea int foo4() {
7213888870SDoru Bercea int sum = 0.0;
7313888870SDoru Bercea int M = 12;
7413888870SDoru Bercea int result[M];
7513888870SDoru Bercea int N = 10;
7613888870SDoru Bercea #pragma omp target teams distribute map(from: result[:M])
7713888870SDoru Bercea for (int i = 0; i < M; i++) {
7813888870SDoru Bercea int A[N];
7913888870SDoru Bercea result[i] = i;
8013888870SDoru Bercea
8113888870SDoru Bercea #pragma omp parallel for
8213888870SDoru Bercea for (int j = 0; j < N; j++)
8313888870SDoru Bercea A[j] = j;
8413888870SDoru Bercea
8513888870SDoru Bercea for (int j = 0; j < N; j++)
8613888870SDoru Bercea result[i] += A[j];
8713888870SDoru Bercea }
8813888870SDoru Bercea
8913888870SDoru Bercea for (int i = 0; i < M; i++)
9013888870SDoru Bercea sum += result[i];
9113888870SDoru Bercea return sum;
9213888870SDoru Bercea }
9313888870SDoru Bercea
main()9413888870SDoru Bercea int main() {
9513888870SDoru Bercea return foo1() + foo2() + foo3() + foo4();
9613888870SDoru Bercea }
9713888870SDoru Bercea
9813888870SDoru Bercea #endif
9913888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo1v_l12
100b8cbc5c0SJohannes Doerfert // CHECK-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SUM:%.*]]) #[[ATTR0:[0-9]+]] {
10113888870SDoru Bercea // CHECK-NEXT: entry:
102b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
10313888870SDoru Bercea // CHECK-NEXT: [[SUM_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
10413888870SDoru Bercea // CHECK-NEXT: [[N:%.*]] = alloca i32, align 4, addrspace(5)
10513888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8, addrspace(5)
10613888870SDoru Bercea // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4, addrspace(5)
10713888870SDoru Bercea // CHECK-NEXT: [[I1:%.*]] = alloca i32, align 4, addrspace(5)
108b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DYN_PTR_ADDR]] to ptr
10913888870SDoru Bercea // CHECK-NEXT: [[SUM_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SUM_ADDR]] to ptr
11013888870SDoru Bercea // CHECK-NEXT: [[N_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N]] to ptr
11113888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[__VLA_EXPR0]] to ptr
11213888870SDoru Bercea // CHECK-NEXT: [[I_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I]] to ptr
11313888870SDoru Bercea // CHECK-NEXT: [[I1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I1]] to ptr
114b8cbc5c0SJohannes Doerfert // CHECK-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR_ASCAST]], align 8
11513888870SDoru Bercea // CHECK-NEXT: store ptr [[SUM]], ptr [[SUM_ADDR_ASCAST]], align 8
11613888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[SUM_ADDR_ASCAST]], align 8
117b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo1v_l12_kernel_environment to ptr), ptr [[DYN_PTR]])
11813888870SDoru Bercea // CHECK-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP1]], -1
11913888870SDoru Bercea // CHECK-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
12013888870SDoru Bercea // CHECK: user_code.entry:
12113888870SDoru Bercea // CHECK-NEXT: store i32 10, ptr [[N_ASCAST]], align 4
12213888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[N_ASCAST]], align 4
12313888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = zext i32 [[TMP2]] to i64
12413888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP3]], 4
12513888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = add nuw i64 [[TMP4]], 3
12613888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = udiv i64 [[TMP5]], 4
12713888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = mul nuw i64 [[TMP6]], 4
12813888870SDoru Bercea // CHECK-NEXT: [[A:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 [[TMP7]])
12913888870SDoru Bercea // CHECK-NEXT: store i64 [[TMP3]], ptr [[__VLA_EXPR0_ASCAST]], align 8
13013888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I_ASCAST]], align 4
13113888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND:%.*]]
13213888870SDoru Bercea // CHECK: for.cond:
13313888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[I_ASCAST]], align 4
13413888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[N_ASCAST]], align 4
13513888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP8]], [[TMP9]]
13613888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
13713888870SDoru Bercea // CHECK: for.body:
13813888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[I_ASCAST]], align 4
13913888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[I_ASCAST]], align 4
14013888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
14113888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM]]
14213888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP10]], ptr [[ARRAYIDX]], align 4
14313888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC:%.*]]
14413888870SDoru Bercea // CHECK: for.inc:
14513888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[I_ASCAST]], align 4
14613888870SDoru Bercea // CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP12]], 1
14713888870SDoru Bercea // CHECK-NEXT: store i32 [[INC]], ptr [[I_ASCAST]], align 4
14813888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
14913888870SDoru Bercea // CHECK: worker.exit:
15013888870SDoru Bercea // CHECK-NEXT: ret void
15113888870SDoru Bercea // CHECK: for.end:
15213888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I1_ASCAST]], align 4
15313888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND2:%.*]]
15413888870SDoru Bercea // CHECK: for.cond2:
15513888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[I1_ASCAST]], align 4
15613888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[N_ASCAST]], align 4
15713888870SDoru Bercea // CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[TMP13]], [[TMP14]]
15813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP3]], label [[FOR_BODY4:%.*]], label [[FOR_END9:%.*]]
15913888870SDoru Bercea // CHECK: for.body4:
16013888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[I1_ASCAST]], align 4
16113888870SDoru Bercea // CHECK-NEXT: [[IDXPROM5:%.*]] = sext i32 [[TMP15]] to i64
16213888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM5]]
16313888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4
16413888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP0]], align 4
16513888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]
16613888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP0]], align 4
16713888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC7:%.*]]
16813888870SDoru Bercea // CHECK: for.inc7:
16913888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[I1_ASCAST]], align 4
17013888870SDoru Bercea // CHECK-NEXT: [[INC8:%.*]] = add nsw i32 [[TMP18]], 1
17113888870SDoru Bercea // CHECK-NEXT: store i32 [[INC8]], ptr [[I1_ASCAST]], align 4
17213888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND2]], !llvm.loop [[LOOP15:![0-9]+]]
17313888870SDoru Bercea // CHECK: for.end9:
17413888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_free_shared(ptr [[A]], i64 [[TMP7]])
17510068cd6SShilei Tian // CHECK-NEXT: call void @__kmpc_target_deinit()
17613888870SDoru Bercea // CHECK-NEXT: ret void
17713888870SDoru Bercea //
17813888870SDoru Bercea //
17913888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30
180b8cbc5c0SJohannes Doerfert // CHECK-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[M:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR0]] {
18113888870SDoru Bercea // CHECK-NEXT: entry:
182b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
18313888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
18413888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
18513888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
18613888870SDoru Bercea // CHECK-NEXT: [[M_CASTED:%.*]] = alloca i64, align 8, addrspace(5)
18713888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
18813888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4, addrspace(5)
189b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DYN_PTR_ADDR]] to ptr
19013888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
19113888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
19213888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
19313888870SDoru Bercea // CHECK-NEXT: [[M_CASTED_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_CASTED]] to ptr
19413888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTZERO_ADDR]] to ptr
19513888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTTHREADID_TEMP_]] to ptr
196b8cbc5c0SJohannes Doerfert // CHECK-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR_ASCAST]], align 8
19713888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
19813888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
19913888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
20013888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
20113888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
202b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30_kernel_environment to ptr), ptr [[DYN_PTR]])
20313888870SDoru Bercea // CHECK-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP2]], -1
20413888870SDoru Bercea // CHECK-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
20513888870SDoru Bercea // CHECK: user_code.entry:
20610068cd6SShilei Tian // CHECK-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr addrspacecast (ptr addrspace(1) @[[GLOB1:[0-9]+]] to ptr))
20713888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
20813888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP4]], ptr [[M_CASTED_ASCAST]], align 4
20913888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i64, ptr [[M_CASTED_ASCAST]], align 8
21013888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTZERO_ADDR_ASCAST]], align 4
21113888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP__ASCAST]], align 4
2125a64ae75SJohannes Doerfert // CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30_omp_outlined(ptr [[DOTTHREADID_TEMP__ASCAST]], ptr [[DOTZERO_ADDR_ASCAST]], i64 [[TMP5]], i64 [[TMP0]], ptr [[TMP1]]) #[[ATTR4:[0-9]+]]
21310068cd6SShilei Tian // CHECK-NEXT: call void @__kmpc_target_deinit()
21413888870SDoru Bercea // CHECK-NEXT: ret void
21513888870SDoru Bercea // CHECK: worker.exit:
21613888870SDoru Bercea // CHECK-NEXT: ret void
21713888870SDoru Bercea //
21813888870SDoru Bercea //
21913888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30_omp_outlined
22013888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[M:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR3:[0-9]+]] {
22113888870SDoru Bercea // CHECK-NEXT: entry:
22213888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
22313888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
22413888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
22513888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
22613888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
22713888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
22813888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
22913888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
23013888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4, addrspace(5)
23113888870SDoru Bercea // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4, addrspace(5)
23213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4, addrspace(5)
23313888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4, addrspace(5)
23413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
23513888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
23613888870SDoru Bercea // CHECK-NEXT: [[I3:%.*]] = alloca i32, align 4, addrspace(5)
23713888870SDoru Bercea // CHECK-NEXT: [[M_CASTED:%.*]] = alloca i64, align 8, addrspace(5)
23813888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [5 x ptr], align 8, addrspace(5)
23913888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
24013888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
24113888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
24213888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
24313888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
24413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
24513888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
24613888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
24713888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_1]] to ptr
24813888870SDoru Bercea // CHECK-NEXT: [[I_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I]] to ptr
24913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_COMB_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_COMB_LB]] to ptr
25013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_COMB_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_COMB_UB]] to ptr
25113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
25213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
25313888870SDoru Bercea // CHECK-NEXT: [[I3_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I3]] to ptr
25413888870SDoru Bercea // CHECK-NEXT: [[M_CASTED_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_CASTED]] to ptr
25513888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[CAPTURED_VARS_ADDRS]] to ptr
25613888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
25713888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
25813888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
25913888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
26013888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
26113888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
26213888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
26313888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
26413888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
26513888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
26613888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
26713888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
26813888870SDoru Bercea // CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
26913888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
27013888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I_ASCAST]], align 4
27113888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
27213888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
27313888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
27413888870SDoru Bercea // CHECK: omp.precond.then:
27513888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
27613888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
27713888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
27813888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
27913888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
28013888870SDoru Bercea // CHECK-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()
28113888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
28213888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4
28313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB2:[0-9]+]] to ptr), i32 [[TMP7]], i32 91, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_COMB_LB_ASCAST]], ptr [[DOTOMP_COMB_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 [[NVPTX_NUM_THREADS]])
28413888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
28513888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
28613888870SDoru Bercea // CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
28713888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
28813888870SDoru Bercea // CHECK: cond.true:
28913888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
29013888870SDoru Bercea // CHECK-NEXT: br label [[COND_END:%.*]]
29113888870SDoru Bercea // CHECK: cond.false:
29213888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
29313888870SDoru Bercea // CHECK-NEXT: br label [[COND_END]]
29413888870SDoru Bercea // CHECK: cond.end:
29513888870SDoru Bercea // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
29613888870SDoru Bercea // CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
29713888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
29813888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV_ASCAST]], align 4
29913888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
30013888870SDoru Bercea // CHECK: omp.inner.for.cond:
30113888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
30213888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
30313888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], 1
30413888870SDoru Bercea // CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[TMP13]], [[ADD]]
30513888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
30613888870SDoru Bercea // CHECK: omp.inner.for.body:
30713888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
30813888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = zext i32 [[TMP15]] to i64
30913888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
31013888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
31113888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
31213888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP19]], ptr [[M_CASTED_ASCAST]], align 4
31313888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = load i64, ptr [[M_CASTED_ASCAST]], align 8
31413888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 0
31513888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP16]] to ptr
31613888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP22]], ptr [[TMP21]], align 8
31713888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 1
31813888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = inttoptr i64 [[TMP18]] to ptr
31913888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP24]], ptr [[TMP23]], align 8
32013888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds [5 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 2
32113888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP20]] to ptr
32213888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP26]], ptr [[TMP25]], align 8
32313888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = getelementptr inbounds [5 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 3
32413888870SDoru Bercea // CHECK-NEXT: [[TMP28:%.*]] = inttoptr i64 [[TMP0]] to ptr
32513888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP28]], ptr [[TMP27]], align 8
32613888870SDoru Bercea // CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds [5 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 4
32713888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP1]], ptr [[TMP29]], align 8
32813888870SDoru Bercea // CHECK-NEXT: [[TMP30:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
32913888870SDoru Bercea // CHECK-NEXT: [[TMP31:%.*]] = load i32, ptr [[TMP30]], align 4
33013888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_parallel_51(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr), i32 [[TMP31]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 5)
33113888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
33213888870SDoru Bercea // CHECK: omp.inner.for.inc:
33313888870SDoru Bercea // CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
33413888870SDoru Bercea // CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
33513888870SDoru Bercea // CHECK-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
33613888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV_ASCAST]], align 4
33713888870SDoru Bercea // CHECK-NEXT: [[TMP34:%.*]] = load i32, ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
33813888870SDoru Bercea // CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
33913888870SDoru Bercea // CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP34]], [[TMP35]]
34013888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
34113888870SDoru Bercea // CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
34213888870SDoru Bercea // CHECK-NEXT: [[TMP37:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
34313888870SDoru Bercea // CHECK-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP36]], [[TMP37]]
34413888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
34513888870SDoru Bercea // CHECK-NEXT: [[TMP38:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
34613888870SDoru Bercea // CHECK-NEXT: [[TMP39:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
34713888870SDoru Bercea // CHECK-NEXT: [[CMP9:%.*]] = icmp sgt i32 [[TMP38]], [[TMP39]]
34813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
34913888870SDoru Bercea // CHECK: cond.true10:
35013888870SDoru Bercea // CHECK-NEXT: [[TMP40:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
35113888870SDoru Bercea // CHECK-NEXT: br label [[COND_END12:%.*]]
35213888870SDoru Bercea // CHECK: cond.false11:
35313888870SDoru Bercea // CHECK-NEXT: [[TMP41:%.*]] = load i32, ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
35413888870SDoru Bercea // CHECK-NEXT: br label [[COND_END12]]
35513888870SDoru Bercea // CHECK: cond.end12:
35613888870SDoru Bercea // CHECK-NEXT: [[COND13:%.*]] = phi i32 [ [[TMP40]], [[COND_TRUE10]] ], [ [[TMP41]], [[COND_FALSE11]] ]
35713888870SDoru Bercea // CHECK-NEXT: store i32 [[COND13]], ptr [[DOTOMP_COMB_UB_ASCAST]], align 4
35813888870SDoru Bercea // CHECK-NEXT: [[TMP42:%.*]] = load i32, ptr [[DOTOMP_COMB_LB_ASCAST]], align 4
35913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP42]], ptr [[DOTOMP_IV_ASCAST]], align 4
36013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
36113888870SDoru Bercea // CHECK: omp.inner.for.end:
36213888870SDoru Bercea // CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
36313888870SDoru Bercea // CHECK: omp.loop.exit:
36413888870SDoru Bercea // CHECK-NEXT: [[TMP43:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
36513888870SDoru Bercea // CHECK-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP43]], align 4
36613888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), i32 [[TMP44]])
36713888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
36813888870SDoru Bercea // CHECK: omp.precond.end:
36913888870SDoru Bercea // CHECK-NEXT: ret void
37013888870SDoru Bercea //
37113888870SDoru Bercea //
37213888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo2v_l30_omp_outlined_omp_outlined
37313888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i64 noundef [[M:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR3]] {
37413888870SDoru Bercea // CHECK-NEXT: entry:
37513888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
37613888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
37713888870SDoru Bercea // CHECK-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8, addrspace(5)
37813888870SDoru Bercea // CHECK-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8, addrspace(5)
37913888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
38013888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
38113888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
38213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
38313888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
38413888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
38513888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4, addrspace(5)
38613888870SDoru Bercea // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4, addrspace(5)
38713888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4, addrspace(5)
38813888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4, addrspace(5)
38913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
39013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
39113888870SDoru Bercea // CHECK-NEXT: [[I4:%.*]] = alloca i32, align 4, addrspace(5)
39213888870SDoru Bercea // CHECK-NEXT: [[N:%.*]] = alloca i32, align 4, addrspace(5)
39325bc999dSMatt Arsenault // CHECK-NEXT: [[SAVED_STACK:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)
39413888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8, addrspace(5)
39513888870SDoru Bercea // CHECK-NEXT: [[J:%.*]] = alloca i32, align 4, addrspace(5)
39613888870SDoru Bercea // CHECK-NEXT: [[J11:%.*]] = alloca i32, align 4, addrspace(5)
39713888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
39813888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
39913888870SDoru Bercea // CHECK-NEXT: [[DOTPREVIOUS_LB__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTPREVIOUS_LB__ADDR]] to ptr
40013888870SDoru Bercea // CHECK-NEXT: [[DOTPREVIOUS_UB__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTPREVIOUS_UB__ADDR]] to ptr
40113888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
40213888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
40313888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
40413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
40513888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
40613888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
40713888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_1]] to ptr
40813888870SDoru Bercea // CHECK-NEXT: [[I_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I]] to ptr
40913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_LB]] to ptr
41013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_UB]] to ptr
41113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
41213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
41313888870SDoru Bercea // CHECK-NEXT: [[I4_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I4]] to ptr
41413888870SDoru Bercea // CHECK-NEXT: [[N_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N]] to ptr
41513888870SDoru Bercea // CHECK-NEXT: [[SAVED_STACK_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SAVED_STACK]] to ptr
41613888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[__VLA_EXPR0]] to ptr
41713888870SDoru Bercea // CHECK-NEXT: [[J_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J]] to ptr
41813888870SDoru Bercea // CHECK-NEXT: [[J11_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J11]] to ptr
41913888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
42013888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
42113888870SDoru Bercea // CHECK-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR_ASCAST]], align 8
42213888870SDoru Bercea // CHECK-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR_ASCAST]], align 8
42313888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
42413888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
42513888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
42613888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
42713888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
42813888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
42913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
43013888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
43113888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
43213888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
43313888870SDoru Bercea // CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
43413888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
43513888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I_ASCAST]], align 4
43613888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
43713888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
43813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
43913888870SDoru Bercea // CHECK: omp.precond.then:
44013888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB_ASCAST]], align 4
44113888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
44213888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB_ASCAST]], align 4
44313888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR_ASCAST]], align 8
44413888870SDoru Bercea // CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[TMP6]] to i32
44513888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR_ASCAST]], align 8
44613888870SDoru Bercea // CHECK-NEXT: [[CONV3:%.*]] = trunc i64 [[TMP7]] to i32
44713888870SDoru Bercea // CHECK-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB_ASCAST]], align 4
44813888870SDoru Bercea // CHECK-NEXT: store i32 [[CONV3]], ptr [[DOTOMP_UB_ASCAST]], align 4
44913888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
45013888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
45113888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
45213888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4
45313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_for_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB3:[0-9]+]] to ptr), i32 [[TMP9]], i32 33, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_LB_ASCAST]], ptr [[DOTOMP_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 1)
45413888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
45513888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV_ASCAST]], align 4
45613888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
45713888870SDoru Bercea // CHECK: omp.inner.for.cond:
45813888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
45913888870SDoru Bercea // CHECK-NEXT: [[CONV5:%.*]] = sext i32 [[TMP11]] to i64
46013888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR_ASCAST]], align 8
46113888870SDoru Bercea // CHECK-NEXT: [[CMP6:%.*]] = icmp ule i64 [[CONV5]], [[TMP12]]
46213888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
46313888870SDoru Bercea // CHECK: omp.inner.for.body:
46413888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
46513888870SDoru Bercea // CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
46613888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
46713888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[I4_ASCAST]], align 4
46813888870SDoru Bercea // CHECK-NEXT: store i32 10, ptr [[N_ASCAST]], align 4
46913888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[N_ASCAST]], align 4
47013888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = zext i32 [[TMP14]] to i64
47125bc999dSMatt Arsenault // CHECK-NEXT: [[TMP16:%.*]] = call ptr addrspace(5) @llvm.stacksave.p5()
47225bc999dSMatt Arsenault // CHECK-NEXT: store ptr addrspace(5) [[TMP16]], ptr [[SAVED_STACK_ASCAST]], align 4
47313888870SDoru Bercea // CHECK-NEXT: [[VLA7:%.*]] = alloca i32, i64 [[TMP15]], align 4, addrspace(5)
47413888870SDoru Bercea // CHECK-NEXT: [[VLA7_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA7]] to ptr
47513888870SDoru Bercea // CHECK-NEXT: store i64 [[TMP15]], ptr [[__VLA_EXPR0_ASCAST]], align 8
47613888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
47713888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
47813888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP18]] to i64
47913888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM]]
48013888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP17]], ptr [[ARRAYIDX]], align 4
48113888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J_ASCAST]], align 4
48213888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND:%.*]]
48313888870SDoru Bercea // CHECK: for.cond:
48413888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[J_ASCAST]], align 4
48513888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[N_ASCAST]], align 4
48613888870SDoru Bercea // CHECK-NEXT: [[CMP8:%.*]] = icmp slt i32 [[TMP19]], [[TMP20]]
48713888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP8]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
48813888870SDoru Bercea // CHECK: for.body:
48913888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[J_ASCAST]], align 4
49013888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[J_ASCAST]], align 4
49113888870SDoru Bercea // CHECK-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP22]] to i64
49213888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[VLA7_ASCAST]], i64 [[IDXPROM9]]
49313888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP21]], ptr [[ARRAYIDX10]], align 4
49413888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC:%.*]]
49513888870SDoru Bercea // CHECK: for.inc:
49613888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[J_ASCAST]], align 4
49713888870SDoru Bercea // CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP23]], 1
49813888870SDoru Bercea // CHECK-NEXT: store i32 [[INC]], ptr [[J_ASCAST]], align 4
49913888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP16:![0-9]+]]
50013888870SDoru Bercea // CHECK: for.end:
50113888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J11_ASCAST]], align 4
50213888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND12:%.*]]
50313888870SDoru Bercea // CHECK: for.cond12:
50413888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[J11_ASCAST]], align 4
50513888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = load i32, ptr [[N_ASCAST]], align 4
50613888870SDoru Bercea // CHECK-NEXT: [[CMP13:%.*]] = icmp slt i32 [[TMP24]], [[TMP25]]
50713888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP13]], label [[FOR_BODY14:%.*]], label [[FOR_END22:%.*]]
50813888870SDoru Bercea // CHECK: for.body14:
50913888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = load i32, ptr [[J11_ASCAST]], align 4
51013888870SDoru Bercea // CHECK-NEXT: [[IDXPROM15:%.*]] = sext i32 [[TMP26]] to i64
51113888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds i32, ptr [[VLA7_ASCAST]], i64 [[IDXPROM15]]
51213888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[ARRAYIDX16]], align 4
51313888870SDoru Bercea // CHECK-NEXT: [[TMP28:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
51413888870SDoru Bercea // CHECK-NEXT: [[IDXPROM17:%.*]] = sext i32 [[TMP28]] to i64
51513888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM17]]
51613888870SDoru Bercea // CHECK-NEXT: [[TMP29:%.*]] = load i32, ptr [[ARRAYIDX18]], align 4
51713888870SDoru Bercea // CHECK-NEXT: [[ADD19:%.*]] = add nsw i32 [[TMP29]], [[TMP27]]
51813888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD19]], ptr [[ARRAYIDX18]], align 4
51913888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC20:%.*]]
52013888870SDoru Bercea // CHECK: for.inc20:
52113888870SDoru Bercea // CHECK-NEXT: [[TMP30:%.*]] = load i32, ptr [[J11_ASCAST]], align 4
52213888870SDoru Bercea // CHECK-NEXT: [[INC21:%.*]] = add nsw i32 [[TMP30]], 1
52313888870SDoru Bercea // CHECK-NEXT: store i32 [[INC21]], ptr [[J11_ASCAST]], align 4
52413888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND12]], !llvm.loop [[LOOP17:![0-9]+]]
52513888870SDoru Bercea // CHECK: for.end22:
52625bc999dSMatt Arsenault // CHECK-NEXT: [[TMP31:%.*]] = load ptr addrspace(5), ptr [[SAVED_STACK_ASCAST]], align 4
52725bc999dSMatt Arsenault // CHECK-NEXT: call void @llvm.stackrestore.p5(ptr addrspace(5) [[TMP31]])
52813888870SDoru Bercea // CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
52913888870SDoru Bercea // CHECK: omp.body.continue:
53013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
53113888870SDoru Bercea // CHECK: omp.inner.for.inc:
53213888870SDoru Bercea // CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
53313888870SDoru Bercea // CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
53413888870SDoru Bercea // CHECK-NEXT: [[ADD23:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
53513888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD23]], ptr [[DOTOMP_IV_ASCAST]], align 4
53613888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
53713888870SDoru Bercea // CHECK: omp.inner.for.end:
53813888870SDoru Bercea // CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
53913888870SDoru Bercea // CHECK: omp.loop.exit:
54013888870SDoru Bercea // CHECK-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
54113888870SDoru Bercea // CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 4
542*4e3310a8SmikaoP // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr), i32 [[TMP35]])
54313888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
54413888870SDoru Bercea // CHECK: omp.precond.end:
54513888870SDoru Bercea // CHECK-NEXT: ret void
54613888870SDoru Bercea //
54713888870SDoru Bercea //
54813888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52
549b8cbc5c0SJohannes Doerfert // CHECK-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[M:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR0]] {
55013888870SDoru Bercea // CHECK-NEXT: entry:
551b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
55213888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
55313888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
55413888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
55513888870SDoru Bercea // CHECK-NEXT: [[M_CASTED:%.*]] = alloca i64, align 8, addrspace(5)
55613888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
55713888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4, addrspace(5)
558b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DYN_PTR_ADDR]] to ptr
55913888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
56013888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
56113888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
56213888870SDoru Bercea // CHECK-NEXT: [[M_CASTED_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_CASTED]] to ptr
56313888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTZERO_ADDR]] to ptr
56413888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTTHREADID_TEMP_]] to ptr
565b8cbc5c0SJohannes Doerfert // CHECK-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR_ASCAST]], align 8
56613888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
56713888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
56813888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
56913888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
57013888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
571b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_kernel_environment to ptr), ptr [[DYN_PTR]])
57213888870SDoru Bercea // CHECK-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP2]], -1
57313888870SDoru Bercea // CHECK-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
57413888870SDoru Bercea // CHECK: user_code.entry:
57513888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr))
57613888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
57713888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP4]], ptr [[M_CASTED_ASCAST]], align 4
57813888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i64, ptr [[M_CASTED_ASCAST]], align 8
57913888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTZERO_ADDR_ASCAST]], align 4
58013888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP__ASCAST]], align 4
5815a64ae75SJohannes Doerfert // CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined(ptr [[DOTTHREADID_TEMP__ASCAST]], ptr [[DOTZERO_ADDR_ASCAST]], i64 [[TMP5]], i64 [[TMP0]], ptr [[TMP1]]) #[[ATTR4]]
58210068cd6SShilei Tian // CHECK-NEXT: call void @__kmpc_target_deinit()
58313888870SDoru Bercea // CHECK-NEXT: ret void
58413888870SDoru Bercea // CHECK: worker.exit:
58513888870SDoru Bercea // CHECK-NEXT: ret void
58613888870SDoru Bercea //
58713888870SDoru Bercea //
58813888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined
58913888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[M:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR3]] {
59013888870SDoru Bercea // CHECK-NEXT: entry:
59113888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
59213888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
59313888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
59413888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
59513888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
59613888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
59713888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
59813888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
59913888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4, addrspace(5)
60013888870SDoru Bercea // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4, addrspace(5)
60113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4, addrspace(5)
60213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4, addrspace(5)
60313888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
60413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
60513888870SDoru Bercea // CHECK-NEXT: [[I3:%.*]] = alloca i32, align 4, addrspace(5)
60613888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8, addrspace(5)
60713888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 8, addrspace(5)
60813888870SDoru Bercea // CHECK-NEXT: [[J:%.*]] = alloca i32, align 4, addrspace(5)
60913888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
61013888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
61113888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
61213888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
61313888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
61413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
61513888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
61613888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
61713888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_1]] to ptr
61813888870SDoru Bercea // CHECK-NEXT: [[I_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I]] to ptr
61913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_LB]] to ptr
62013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_UB]] to ptr
62113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
62213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
62313888870SDoru Bercea // CHECK-NEXT: [[I3_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I3]] to ptr
62413888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[__VLA_EXPR0]] to ptr
62513888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[CAPTURED_VARS_ADDRS]] to ptr
62613888870SDoru Bercea // CHECK-NEXT: [[J_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J]] to ptr
62713888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
62813888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
62913888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
63013888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
63113888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
63213888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
63313888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
63413888870SDoru Bercea // CHECK-NEXT: [[N:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)
63513888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
63613888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
63713888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
63813888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
63913888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
64013888870SDoru Bercea // CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
64113888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
64213888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I_ASCAST]], align 4
64313888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
64413888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
64513888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
64613888870SDoru Bercea // CHECK: omp.precond.then:
64713888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB_ASCAST]], align 4
64813888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
64913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB_ASCAST]], align 4
65013888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
65113888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
65213888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
65313888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4
65413888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_LB_ASCAST]], ptr [[DOTOMP_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 1)
65513888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
65613888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
65713888870SDoru Bercea // CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
65813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
65913888870SDoru Bercea // CHECK: cond.true:
66013888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
66113888870SDoru Bercea // CHECK-NEXT: br label [[COND_END:%.*]]
66213888870SDoru Bercea // CHECK: cond.false:
66313888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
66413888870SDoru Bercea // CHECK-NEXT: br label [[COND_END]]
66513888870SDoru Bercea // CHECK: cond.end:
66613888870SDoru Bercea // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
66713888870SDoru Bercea // CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB_ASCAST]], align 4
66813888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
66913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV_ASCAST]], align 4
67013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
67113888870SDoru Bercea // CHECK: omp.inner.for.cond:
67213888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
67313888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
67413888870SDoru Bercea // CHECK-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
67513888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
67613888870SDoru Bercea // CHECK: omp.inner.for.body:
67713888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
67813888870SDoru Bercea // CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
67913888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
68013888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[I3_ASCAST]], align 4
68113888870SDoru Bercea // CHECK-NEXT: store i32 10, ptr [[N]], align 4
68213888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[N]], align 4
68313888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
68413888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = mul nuw i64 [[TMP17]], 4
68513888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = add nuw i64 [[TMP18]], 3
68613888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = udiv i64 [[TMP19]], 4
68713888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = mul nuw i64 [[TMP20]], 4
68813888870SDoru Bercea // CHECK-NEXT: [[A:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 [[TMP21]])
68913888870SDoru Bercea // CHECK-NEXT: store i64 [[TMP17]], ptr [[__VLA_EXPR0_ASCAST]], align 8
69013888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[I3_ASCAST]], align 4
69113888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[I3_ASCAST]], align 4
69213888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP23]] to i64
69313888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM]]
69413888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP22]], ptr [[ARRAYIDX]], align 4
69513888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 0
69613888870SDoru Bercea // CHECK-NEXT: store ptr [[N]], ptr [[TMP24]], align 8
69713888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 1
69813888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP17]] to ptr
69913888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP26]], ptr [[TMP25]], align 8
70013888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 2
70113888870SDoru Bercea // CHECK-NEXT: store ptr [[A]], ptr [[TMP27]], align 8
70213888870SDoru Bercea // CHECK-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
70313888870SDoru Bercea // CHECK-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
70413888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_parallel_51(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr), i32 [[TMP29]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined_omp_outlined, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined_omp_outlined_wrapper, ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 3)
70513888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J_ASCAST]], align 4
70613888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND:%.*]]
70713888870SDoru Bercea // CHECK: for.cond:
70813888870SDoru Bercea // CHECK-NEXT: [[TMP30:%.*]] = load i32, ptr [[J_ASCAST]], align 4
70913888870SDoru Bercea // CHECK-NEXT: [[TMP31:%.*]] = load i32, ptr [[N]], align 4
71013888870SDoru Bercea // CHECK-NEXT: [[CMP6:%.*]] = icmp slt i32 [[TMP30]], [[TMP31]]
71113888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP6]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
71213888870SDoru Bercea // CHECK: for.body:
71313888870SDoru Bercea // CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[J_ASCAST]], align 4
71413888870SDoru Bercea // CHECK-NEXT: [[IDXPROM7:%.*]] = sext i32 [[TMP32]] to i64
71513888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM7]]
71613888870SDoru Bercea // CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[ARRAYIDX8]], align 4
71713888870SDoru Bercea // CHECK-NEXT: [[TMP34:%.*]] = load i32, ptr [[I3_ASCAST]], align 4
71813888870SDoru Bercea // CHECK-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP34]] to i64
71913888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM9]]
72013888870SDoru Bercea // CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[ARRAYIDX10]], align 4
72113888870SDoru Bercea // CHECK-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP35]], [[TMP33]]
72213888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD11]], ptr [[ARRAYIDX10]], align 4
72313888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC:%.*]]
72413888870SDoru Bercea // CHECK: for.inc:
72513888870SDoru Bercea // CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[J_ASCAST]], align 4
72613888870SDoru Bercea // CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP36]], 1
72713888870SDoru Bercea // CHECK-NEXT: store i32 [[INC]], ptr [[J_ASCAST]], align 4
72813888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP18:![0-9]+]]
72913888870SDoru Bercea // CHECK: for.end:
73013888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_free_shared(ptr [[A]], i64 [[TMP21]])
73113888870SDoru Bercea // CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
73213888870SDoru Bercea // CHECK: omp.body.continue:
73313888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
73413888870SDoru Bercea // CHECK: omp.inner.for.inc:
73513888870SDoru Bercea // CHECK-NEXT: [[TMP37:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
73613888870SDoru Bercea // CHECK-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP37]], 1
73713888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV_ASCAST]], align 4
73813888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
73913888870SDoru Bercea // CHECK: omp.inner.for.end:
74013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
74113888870SDoru Bercea // CHECK: omp.loop.exit:
74213888870SDoru Bercea // CHECK-NEXT: [[TMP38:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
74313888870SDoru Bercea // CHECK-NEXT: [[TMP39:%.*]] = load i32, ptr [[TMP38]], align 4
74413888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), i32 [[TMP39]])
74513888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
74613888870SDoru Bercea // CHECK: omp.precond.end:
74713888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_free_shared(ptr [[N]], i64 4)
74813888870SDoru Bercea // CHECK-NEXT: ret void
74913888870SDoru Bercea //
75013888870SDoru Bercea //
75113888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined_omp_outlined
75213888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR3]] {
75313888870SDoru Bercea // CHECK-NEXT: entry:
75413888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
75513888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
75613888870SDoru Bercea // CHECK-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
75713888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
75813888870SDoru Bercea // CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
75913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
76013888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
76113888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
76213888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4, addrspace(5)
76313888870SDoru Bercea // CHECK-NEXT: [[J:%.*]] = alloca i32, align 4, addrspace(5)
76413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4, addrspace(5)
76513888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4, addrspace(5)
76613888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
76713888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
76813888870SDoru Bercea // CHECK-NEXT: [[J3:%.*]] = alloca i32, align 4, addrspace(5)
76913888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
77013888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
77113888870SDoru Bercea // CHECK-NEXT: [[N_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N_ADDR]] to ptr
77213888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
77313888870SDoru Bercea // CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
77413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
77513888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
77613888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
77713888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_1]] to ptr
77813888870SDoru Bercea // CHECK-NEXT: [[J_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J]] to ptr
77913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_LB]] to ptr
78013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_UB]] to ptr
78113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
78213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
78313888870SDoru Bercea // CHECK-NEXT: [[J3_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J3]] to ptr
78413888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
78513888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
78613888870SDoru Bercea // CHECK-NEXT: store ptr [[N]], ptr [[N_ADDR_ASCAST]], align 8
78713888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
78813888870SDoru Bercea // CHECK-NEXT: store ptr [[A]], ptr [[A_ADDR_ASCAST]], align 8
78913888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR_ASCAST]], align 8
79013888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
79113888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
79213888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
79313888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
79413888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
79513888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
79613888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
79713888870SDoru Bercea // CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
79813888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
79913888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J_ASCAST]], align 4
80013888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
80113888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
80213888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
80313888870SDoru Bercea // CHECK: omp.precond.then:
80413888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB_ASCAST]], align 4
80513888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
80613888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB_ASCAST]], align 4
80713888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
80813888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
80913888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
81013888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
81113888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_for_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr), i32 [[TMP8]], i32 33, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_LB_ASCAST]], ptr [[DOTOMP_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 1)
81213888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_COND:%.*]]
81313888870SDoru Bercea // CHECK: omp.dispatch.cond:
81413888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
81513888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
81613888870SDoru Bercea // CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
81713888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
81813888870SDoru Bercea // CHECK: cond.true:
81913888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
82013888870SDoru Bercea // CHECK-NEXT: br label [[COND_END:%.*]]
82113888870SDoru Bercea // CHECK: cond.false:
82213888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
82313888870SDoru Bercea // CHECK-NEXT: br label [[COND_END]]
82413888870SDoru Bercea // CHECK: cond.end:
82513888870SDoru Bercea // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
82613888870SDoru Bercea // CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB_ASCAST]], align 4
82713888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
82813888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV_ASCAST]], align 4
82913888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
83013888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
83113888870SDoru Bercea // CHECK-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
83213888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP5]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
83313888870SDoru Bercea // CHECK: omp.dispatch.body:
83413888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
83513888870SDoru Bercea // CHECK: omp.inner.for.cond:
83613888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
83713888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
83813888870SDoru Bercea // CHECK-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
83913888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
84013888870SDoru Bercea // CHECK: omp.inner.for.body:
84113888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
84213888870SDoru Bercea // CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
84313888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
84413888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[J3_ASCAST]], align 4
84513888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[J3_ASCAST]], align 4
84613888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[J3_ASCAST]], align 4
84713888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i64
84813888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM]]
84913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP19]], ptr [[ARRAYIDX]], align 4
85013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
85113888870SDoru Bercea // CHECK: omp.body.continue:
85213888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
85313888870SDoru Bercea // CHECK: omp.inner.for.inc:
85413888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
85513888870SDoru Bercea // CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], 1
85613888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV_ASCAST]], align 4
85713888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
85813888870SDoru Bercea // CHECK: omp.inner.for.end:
85913888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_INC:%.*]]
86013888870SDoru Bercea // CHECK: omp.dispatch.inc:
86113888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
86213888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
86313888870SDoru Bercea // CHECK-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
86413888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_LB_ASCAST]], align 4
86513888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
86613888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
86713888870SDoru Bercea // CHECK-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP24]], [[TMP25]]
86813888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_UB_ASCAST]], align 4
86913888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_COND]]
87013888870SDoru Bercea // CHECK: omp.dispatch.end:
87113888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
87213888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4
87313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr), i32 [[TMP27]])
87413888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
87513888870SDoru Bercea // CHECK: omp.precond.end:
87613888870SDoru Bercea // CHECK-NEXT: ret void
87713888870SDoru Bercea //
87813888870SDoru Bercea //
87913888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined_omp_outlined_wrapper
88013888870SDoru Bercea // CHECK-SAME: (i16 noundef zeroext [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR7:[0-9]+]] {
88113888870SDoru Bercea // CHECK-NEXT: entry:
88213888870SDoru Bercea // CHECK-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2, addrspace(5)
88313888870SDoru Bercea // CHECK-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4, addrspace(5)
88413888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
88513888870SDoru Bercea // CHECK-NEXT: [[GLOBAL_ARGS:%.*]] = alloca ptr, align 8, addrspace(5)
88613888870SDoru Bercea // CHECK-NEXT: [[DOTADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTADDR]] to ptr
88713888870SDoru Bercea // CHECK-NEXT: [[DOTADDR1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTADDR1]] to ptr
88813888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTZERO_ADDR]] to ptr
88913888870SDoru Bercea // CHECK-NEXT: [[GLOBAL_ARGS_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[GLOBAL_ARGS]] to ptr
89013888870SDoru Bercea // CHECK-NEXT: store i16 [[TMP0]], ptr [[DOTADDR_ASCAST]], align 2
89113888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1_ASCAST]], align 4
89213888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTZERO_ADDR_ASCAST]], align 4
89313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_get_shared_variables(ptr [[GLOBAL_ARGS_ASCAST]])
89413888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[GLOBAL_ARGS_ASCAST]], align 8
89513888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 0
89613888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8
89713888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 1
89813888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
89913888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 2
90013888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8
9015a64ae75SJohannes Doerfert // CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo3v_l52_omp_outlined_omp_outlined(ptr [[DOTADDR1_ASCAST]], ptr [[DOTZERO_ADDR_ASCAST]], ptr [[TMP4]], i64 [[TMP6]], ptr [[TMP8]]) #[[ATTR4]]
90213888870SDoru Bercea // CHECK-NEXT: ret void
90313888870SDoru Bercea //
90413888870SDoru Bercea //
90513888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76
906b8cbc5c0SJohannes Doerfert // CHECK-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR0]] {
90713888870SDoru Bercea // CHECK-NEXT: entry:
908b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
90913888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
91013888870SDoru Bercea // CHECK-NEXT: [[N_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
91113888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
91213888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
91313888870SDoru Bercea // CHECK-NEXT: [[M_CASTED:%.*]] = alloca i64, align 8, addrspace(5)
91413888870SDoru Bercea // CHECK-NEXT: [[N_CASTED:%.*]] = alloca i64, align 8, addrspace(5)
91513888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
91613888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4, addrspace(5)
917b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[DYN_PTR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DYN_PTR_ADDR]] to ptr
91813888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
91913888870SDoru Bercea // CHECK-NEXT: [[N_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N_ADDR]] to ptr
92013888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
92113888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
92213888870SDoru Bercea // CHECK-NEXT: [[M_CASTED_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_CASTED]] to ptr
92313888870SDoru Bercea // CHECK-NEXT: [[N_CASTED_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N_CASTED]] to ptr
92413888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTZERO_ADDR]] to ptr
92513888870SDoru Bercea // CHECK-NEXT: [[DOTTHREADID_TEMP__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTTHREADID_TEMP_]] to ptr
926b8cbc5c0SJohannes Doerfert // CHECK-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR_ASCAST]], align 8
92713888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
92813888870SDoru Bercea // CHECK-NEXT: store i64 [[N]], ptr [[N_ADDR_ASCAST]], align 8
92913888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
93013888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
93113888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
93213888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
933b8cbc5c0SJohannes Doerfert // CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_kernel_environment to ptr), ptr [[DYN_PTR]])
93413888870SDoru Bercea // CHECK-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP2]], -1
93513888870SDoru Bercea // CHECK-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
93613888870SDoru Bercea // CHECK: user_code.entry:
93713888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr))
93813888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
93913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP4]], ptr [[M_CASTED_ASCAST]], align 4
94013888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i64, ptr [[M_CASTED_ASCAST]], align 8
94113888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[N_ADDR_ASCAST]], align 4
94213888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP6]], ptr [[N_CASTED_ASCAST]], align 4
94313888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr [[N_CASTED_ASCAST]], align 8
94413888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTZERO_ADDR_ASCAST]], align 4
94513888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP__ASCAST]], align 4
9465a64ae75SJohannes Doerfert // CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined(ptr [[DOTTHREADID_TEMP__ASCAST]], ptr [[DOTZERO_ADDR_ASCAST]], i64 [[TMP5]], i64 [[TMP7]], i64 [[TMP0]], ptr [[TMP1]]) #[[ATTR4]]
94710068cd6SShilei Tian // CHECK-NEXT: call void @__kmpc_target_deinit()
94813888870SDoru Bercea // CHECK-NEXT: ret void
94913888870SDoru Bercea // CHECK: worker.exit:
95013888870SDoru Bercea // CHECK-NEXT: ret void
95113888870SDoru Bercea //
95213888870SDoru Bercea //
95313888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined
95413888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RESULT:%.*]]) #[[ATTR3]] {
95513888870SDoru Bercea // CHECK-NEXT: entry:
95613888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
95713888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
95813888870SDoru Bercea // CHECK-NEXT: [[M_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
95913888870SDoru Bercea // CHECK-NEXT: [[N_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
96013888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
96113888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
96213888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
96313888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
96413888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
96513888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4, addrspace(5)
96613888870SDoru Bercea // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4, addrspace(5)
96713888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4, addrspace(5)
96813888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4, addrspace(5)
96913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
97013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
97113888870SDoru Bercea // CHECK-NEXT: [[I4:%.*]] = alloca i32, align 4, addrspace(5)
97213888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8, addrspace(5)
97313888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 8, addrspace(5)
97413888870SDoru Bercea // CHECK-NEXT: [[J:%.*]] = alloca i32, align 4, addrspace(5)
97513888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
97613888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
97713888870SDoru Bercea // CHECK-NEXT: [[M_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[M_ADDR]] to ptr
97813888870SDoru Bercea // CHECK-NEXT: [[N_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N_ADDR]] to ptr
97913888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
98013888870SDoru Bercea // CHECK-NEXT: [[RESULT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RESULT_ADDR]] to ptr
98113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
98213888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
98313888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
98413888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_2_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_2]] to ptr
98513888870SDoru Bercea // CHECK-NEXT: [[I_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I]] to ptr
98613888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_LB]] to ptr
98713888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_UB]] to ptr
98813888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
98913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
99013888870SDoru Bercea // CHECK-NEXT: [[I4_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I4]] to ptr
99113888870SDoru Bercea // CHECK-NEXT: [[__VLA_EXPR0_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[__VLA_EXPR0]] to ptr
99213888870SDoru Bercea // CHECK-NEXT: [[CAPTURED_VARS_ADDRS_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[CAPTURED_VARS_ADDRS]] to ptr
99313888870SDoru Bercea // CHECK-NEXT: [[J_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J]] to ptr
99413888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
99513888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
99613888870SDoru Bercea // CHECK-NEXT: store i64 [[M]], ptr [[M_ADDR_ASCAST]], align 8
99713888870SDoru Bercea // CHECK-NEXT: store i64 [[N]], ptr [[N_ADDR_ASCAST]], align 8
99813888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
99913888870SDoru Bercea // CHECK-NEXT: store ptr [[RESULT]], ptr [[RESULT_ADDR_ASCAST]], align 8
100013888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
100113888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RESULT_ADDR_ASCAST]], align 8
100213888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[N_ADDR_ASCAST]], align 4
100313888870SDoru Bercea // CHECK-NEXT: [[N1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)
100413888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP2]], ptr [[N1]], align 4
100513888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[M_ADDR_ASCAST]], align 4
100613888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
100713888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
100813888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
100913888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
101013888870SDoru Bercea // CHECK-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
101113888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2_ASCAST]], align 4
101213888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[I_ASCAST]], align 4
101313888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
101413888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
101513888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
101613888870SDoru Bercea // CHECK: omp.precond.then:
101713888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB_ASCAST]], align 4
101813888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2_ASCAST]], align 4
101913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB_ASCAST]], align 4
102013888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
102113888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
102213888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
102313888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
102413888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_LB_ASCAST]], ptr [[DOTOMP_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 1)
102513888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
102613888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2_ASCAST]], align 4
102713888870SDoru Bercea // CHECK-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
102813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
102913888870SDoru Bercea // CHECK: cond.true:
103013888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2_ASCAST]], align 4
103113888870SDoru Bercea // CHECK-NEXT: br label [[COND_END:%.*]]
103213888870SDoru Bercea // CHECK: cond.false:
103313888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
103413888870SDoru Bercea // CHECK-NEXT: br label [[COND_END]]
103513888870SDoru Bercea // CHECK: cond.end:
103613888870SDoru Bercea // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
103713888870SDoru Bercea // CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB_ASCAST]], align 4
103813888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
103913888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV_ASCAST]], align 4
104013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
104113888870SDoru Bercea // CHECK: omp.inner.for.cond:
104213888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
104313888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
104413888870SDoru Bercea // CHECK-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
104513888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
104613888870SDoru Bercea // CHECK: omp.inner.for.body:
104713888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
104813888870SDoru Bercea // CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 1
104913888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
105013888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[I4_ASCAST]], align 4
105113888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[N1]], align 4
105213888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
105313888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = mul nuw i64 [[TMP18]], 4
105413888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = add nuw i64 [[TMP19]], 3
105513888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = udiv i64 [[TMP20]], 4
105613888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = mul nuw i64 [[TMP21]], 4
105713888870SDoru Bercea // CHECK-NEXT: [[A:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 [[TMP22]])
105813888870SDoru Bercea // CHECK-NEXT: store i64 [[TMP18]], ptr [[__VLA_EXPR0_ASCAST]], align 8
105913888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
106013888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
106113888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP24]] to i64
106213888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM]]
106313888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP23]], ptr [[ARRAYIDX]], align 4
106413888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 0
106513888870SDoru Bercea // CHECK-NEXT: store ptr [[N1]], ptr [[TMP25]], align 8
106613888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 1
106713888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP18]] to ptr
106813888870SDoru Bercea // CHECK-NEXT: store ptr [[TMP27]], ptr [[TMP26]], align 8
106913888870SDoru Bercea // CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 0, i64 2
107013888870SDoru Bercea // CHECK-NEXT: store ptr [[A]], ptr [[TMP28]], align 8
107113888870SDoru Bercea // CHECK-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
107213888870SDoru Bercea // CHECK-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
107313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_parallel_51(ptr addrspacecast (ptr addrspace(1) @[[GLOB1]] to ptr), i32 [[TMP30]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined_omp_outlined, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined_omp_outlined_wrapper, ptr [[CAPTURED_VARS_ADDRS_ASCAST]], i64 3)
107413888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J_ASCAST]], align 4
107513888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND:%.*]]
107613888870SDoru Bercea // CHECK: for.cond:
107713888870SDoru Bercea // CHECK-NEXT: [[TMP31:%.*]] = load i32, ptr [[J_ASCAST]], align 4
107813888870SDoru Bercea // CHECK-NEXT: [[TMP32:%.*]] = load i32, ptr [[N1]], align 4
107913888870SDoru Bercea // CHECK-NEXT: [[CMP7:%.*]] = icmp slt i32 [[TMP31]], [[TMP32]]
108013888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP7]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
108113888870SDoru Bercea // CHECK: for.body:
108213888870SDoru Bercea // CHECK-NEXT: [[TMP33:%.*]] = load i32, ptr [[J_ASCAST]], align 4
108313888870SDoru Bercea // CHECK-NEXT: [[IDXPROM8:%.*]] = sext i32 [[TMP33]] to i64
108413888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM8]]
108513888870SDoru Bercea // CHECK-NEXT: [[TMP34:%.*]] = load i32, ptr [[ARRAYIDX9]], align 4
108613888870SDoru Bercea // CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[I4_ASCAST]], align 4
108713888870SDoru Bercea // CHECK-NEXT: [[IDXPROM10:%.*]] = sext i32 [[TMP35]] to i64
108813888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDXPROM10]]
108913888870SDoru Bercea // CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[ARRAYIDX11]], align 4
109013888870SDoru Bercea // CHECK-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP36]], [[TMP34]]
109113888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD12]], ptr [[ARRAYIDX11]], align 4
109213888870SDoru Bercea // CHECK-NEXT: br label [[FOR_INC:%.*]]
109313888870SDoru Bercea // CHECK: for.inc:
109413888870SDoru Bercea // CHECK-NEXT: [[TMP37:%.*]] = load i32, ptr [[J_ASCAST]], align 4
109513888870SDoru Bercea // CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP37]], 1
109613888870SDoru Bercea // CHECK-NEXT: store i32 [[INC]], ptr [[J_ASCAST]], align 4
109713888870SDoru Bercea // CHECK-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
109813888870SDoru Bercea // CHECK: for.end:
109913888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_free_shared(ptr [[A]], i64 [[TMP22]])
110013888870SDoru Bercea // CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
110113888870SDoru Bercea // CHECK: omp.body.continue:
110213888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
110313888870SDoru Bercea // CHECK: omp.inner.for.inc:
110413888870SDoru Bercea // CHECK-NEXT: [[TMP38:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
110513888870SDoru Bercea // CHECK-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP38]], 1
110613888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD13]], ptr [[DOTOMP_IV_ASCAST]], align 4
110713888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
110813888870SDoru Bercea // CHECK: omp.inner.for.end:
110913888870SDoru Bercea // CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
111013888870SDoru Bercea // CHECK: omp.loop.exit:
111113888870SDoru Bercea // CHECK-NEXT: [[TMP39:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
111213888870SDoru Bercea // CHECK-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 4
111313888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_distribute_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB2]] to ptr), i32 [[TMP40]])
111413888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
111513888870SDoru Bercea // CHECK: omp.precond.end:
111613888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_free_shared(ptr [[N1]], i64 4)
111713888870SDoru Bercea // CHECK-NEXT: ret void
111813888870SDoru Bercea //
111913888870SDoru Bercea //
112013888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined_omp_outlined
112113888870SDoru Bercea // CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR3]] {
112213888870SDoru Bercea // CHECK-NEXT: entry:
112313888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
112413888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
112513888870SDoru Bercea // CHECK-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
112613888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8, addrspace(5)
112713888870SDoru Bercea // CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
112813888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4, addrspace(5)
112913888870SDoru Bercea // CHECK-NEXT: [[TMP:%.*]] = alloca i32, align 4, addrspace(5)
113013888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4, addrspace(5)
113113888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4, addrspace(5)
113213888870SDoru Bercea // CHECK-NEXT: [[J:%.*]] = alloca i32, align 4, addrspace(5)
113313888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4, addrspace(5)
113413888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4, addrspace(5)
113513888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4, addrspace(5)
113613888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4, addrspace(5)
113713888870SDoru Bercea // CHECK-NEXT: [[J3:%.*]] = alloca i32, align 4, addrspace(5)
113813888870SDoru Bercea // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTGLOBAL_TID__ADDR]] to ptr
113913888870SDoru Bercea // CHECK-NEXT: [[DOTBOUND_TID__ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTBOUND_TID__ADDR]] to ptr
114013888870SDoru Bercea // CHECK-NEXT: [[N_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[N_ADDR]] to ptr
114113888870SDoru Bercea // CHECK-NEXT: [[VLA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VLA_ADDR]] to ptr
114213888870SDoru Bercea // CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
114313888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IV_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IV]] to ptr
114413888870SDoru Bercea // CHECK-NEXT: [[TMP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TMP]] to ptr
114513888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR__ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_]] to ptr
114613888870SDoru Bercea // CHECK-NEXT: [[DOTCAPTURE_EXPR_1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTCAPTURE_EXPR_1]] to ptr
114713888870SDoru Bercea // CHECK-NEXT: [[J_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J]] to ptr
114813888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_LB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_LB]] to ptr
114913888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_UB_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_UB]] to ptr
115013888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_STRIDE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_STRIDE]] to ptr
115113888870SDoru Bercea // CHECK-NEXT: [[DOTOMP_IS_LAST_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTOMP_IS_LAST]] to ptr
115213888870SDoru Bercea // CHECK-NEXT: [[J3_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[J3]] to ptr
115313888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
115413888870SDoru Bercea // CHECK-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR_ASCAST]], align 8
115513888870SDoru Bercea // CHECK-NEXT: store ptr [[N]], ptr [[N_ADDR_ASCAST]], align 8
115613888870SDoru Bercea // CHECK-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR_ASCAST]], align 8
115713888870SDoru Bercea // CHECK-NEXT: store ptr [[A]], ptr [[A_ADDR_ASCAST]], align 8
115813888870SDoru Bercea // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR_ASCAST]], align 8
115913888870SDoru Bercea // CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR_ASCAST]], align 8
116013888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8
116113888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
116213888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
116313888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
116413888870SDoru Bercea // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
116513888870SDoru Bercea // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
116613888870SDoru Bercea // CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
116713888870SDoru Bercea // CHECK-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
116813888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[J_ASCAST]], align 4
116913888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__ASCAST]], align 4
117013888870SDoru Bercea // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
117113888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
117213888870SDoru Bercea // CHECK: omp.precond.then:
117313888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB_ASCAST]], align 4
117413888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
117513888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB_ASCAST]], align 4
117613888870SDoru Bercea // CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
117713888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST_ASCAST]], align 4
117813888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
117913888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
118013888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_for_static_init_4(ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr), i32 [[TMP8]], i32 33, ptr [[DOTOMP_IS_LAST_ASCAST]], ptr [[DOTOMP_LB_ASCAST]], ptr [[DOTOMP_UB_ASCAST]], ptr [[DOTOMP_STRIDE_ASCAST]], i32 1, i32 1)
118113888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_COND:%.*]]
118213888870SDoru Bercea // CHECK: omp.dispatch.cond:
118313888870SDoru Bercea // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
118413888870SDoru Bercea // CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
118513888870SDoru Bercea // CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
118613888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
118713888870SDoru Bercea // CHECK: cond.true:
118813888870SDoru Bercea // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1_ASCAST]], align 4
118913888870SDoru Bercea // CHECK-NEXT: br label [[COND_END:%.*]]
119013888870SDoru Bercea // CHECK: cond.false:
119113888870SDoru Bercea // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
119213888870SDoru Bercea // CHECK-NEXT: br label [[COND_END]]
119313888870SDoru Bercea // CHECK: cond.end:
119413888870SDoru Bercea // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
119513888870SDoru Bercea // CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB_ASCAST]], align 4
119613888870SDoru Bercea // CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
119713888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV_ASCAST]], align 4
119813888870SDoru Bercea // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
119913888870SDoru Bercea // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
120013888870SDoru Bercea // CHECK-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
120113888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP5]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
120213888870SDoru Bercea // CHECK: omp.dispatch.body:
120313888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
120413888870SDoru Bercea // CHECK: omp.inner.for.cond:
120513888870SDoru Bercea // CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
120613888870SDoru Bercea // CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
120713888870SDoru Bercea // CHECK-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
120813888870SDoru Bercea // CHECK-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
120913888870SDoru Bercea // CHECK: omp.inner.for.body:
121013888870SDoru Bercea // CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
121113888870SDoru Bercea // CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
121213888870SDoru Bercea // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
121313888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD]], ptr [[J3_ASCAST]], align 4
121413888870SDoru Bercea // CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[J3_ASCAST]], align 4
121513888870SDoru Bercea // CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[J3_ASCAST]], align 4
121613888870SDoru Bercea // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i64
121713888870SDoru Bercea // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM]]
121813888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP19]], ptr [[ARRAYIDX]], align 4
121913888870SDoru Bercea // CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
122013888870SDoru Bercea // CHECK: omp.body.continue:
122113888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
122213888870SDoru Bercea // CHECK: omp.inner.for.inc:
122313888870SDoru Bercea // CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV_ASCAST]], align 4
122413888870SDoru Bercea // CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], 1
122513888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV_ASCAST]], align 4
122613888870SDoru Bercea // CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
122713888870SDoru Bercea // CHECK: omp.inner.for.end:
122813888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_INC:%.*]]
122913888870SDoru Bercea // CHECK: omp.dispatch.inc:
123013888870SDoru Bercea // CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_LB_ASCAST]], align 4
123113888870SDoru Bercea // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
123213888870SDoru Bercea // CHECK-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
123313888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_LB_ASCAST]], align 4
123413888870SDoru Bercea // CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_UB_ASCAST]], align 4
123513888870SDoru Bercea // CHECK-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_STRIDE_ASCAST]], align 4
123613888870SDoru Bercea // CHECK-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP24]], [[TMP25]]
123713888870SDoru Bercea // CHECK-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_UB_ASCAST]], align 4
123813888870SDoru Bercea // CHECK-NEXT: br label [[OMP_DISPATCH_COND]]
123913888870SDoru Bercea // CHECK: omp.dispatch.end:
124013888870SDoru Bercea // CHECK-NEXT: [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR_ASCAST]], align 8
124113888870SDoru Bercea // CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4
124213888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr addrspacecast (ptr addrspace(1) @[[GLOB3]] to ptr), i32 [[TMP27]])
124313888870SDoru Bercea // CHECK-NEXT: br label [[OMP_PRECOND_END]]
124413888870SDoru Bercea // CHECK: omp.precond.end:
124513888870SDoru Bercea // CHECK-NEXT: ret void
124613888870SDoru Bercea //
124713888870SDoru Bercea //
124813888870SDoru Bercea // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined_omp_outlined_wrapper
124913888870SDoru Bercea // CHECK-SAME: (i16 noundef zeroext [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR7]] {
125013888870SDoru Bercea // CHECK-NEXT: entry:
125113888870SDoru Bercea // CHECK-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2, addrspace(5)
125213888870SDoru Bercea // CHECK-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4, addrspace(5)
125313888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
125413888870SDoru Bercea // CHECK-NEXT: [[GLOBAL_ARGS:%.*]] = alloca ptr, align 8, addrspace(5)
125513888870SDoru Bercea // CHECK-NEXT: [[DOTADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTADDR]] to ptr
125613888870SDoru Bercea // CHECK-NEXT: [[DOTADDR1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTADDR1]] to ptr
125713888870SDoru Bercea // CHECK-NEXT: [[DOTZERO_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[DOTZERO_ADDR]] to ptr
125813888870SDoru Bercea // CHECK-NEXT: [[GLOBAL_ARGS_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[GLOBAL_ARGS]] to ptr
125913888870SDoru Bercea // CHECK-NEXT: store i16 [[TMP0]], ptr [[DOTADDR_ASCAST]], align 2
126013888870SDoru Bercea // CHECK-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1_ASCAST]], align 4
126113888870SDoru Bercea // CHECK-NEXT: store i32 0, ptr [[DOTZERO_ADDR_ASCAST]], align 4
126213888870SDoru Bercea // CHECK-NEXT: call void @__kmpc_get_shared_variables(ptr [[GLOBAL_ARGS_ASCAST]])
126313888870SDoru Bercea // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[GLOBAL_ARGS_ASCAST]], align 8
126413888870SDoru Bercea // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 0
126513888870SDoru Bercea // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8
126613888870SDoru Bercea // CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 1
126713888870SDoru Bercea // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
126813888870SDoru Bercea // CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 2
126913888870SDoru Bercea // CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8
12705a64ae75SJohannes Doerfert // CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z4foo4v_l76_omp_outlined_omp_outlined(ptr [[DOTADDR1_ASCAST]], ptr [[DOTZERO_ADDR_ASCAST]], ptr [[TMP4]], i64 [[TMP6]], ptr [[TMP8]]) #[[ATTR4]]
127113888870SDoru Bercea // CHECK-NEXT: ret void
127213888870SDoru Bercea //
1273