1207b08a9SGiorgis Georgakoudis // 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 _
2532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -x c++ -O1 -disable-llvm-optzns -verify -fopenmp -internal-isystem %S/../Headers/Inputs/include -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
3532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -x c++ -O1 -disable-llvm-optzns -verify -fopenmp -internal-isystem %S/../Headers/Inputs/include -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix=CHECK1
4532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -x c++ -O1 -disable-llvm-optzns -verify -fopenmp -internal-isystem %S/../Headers/Inputs/include -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
5*b52d33e6SJohannes Doerfert // RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -x c++ -O1 -disable-llvm-optzns -verify -fopenmp -internal-isystem %S/../Headers/Inputs/include -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix=CHECK1
6*b52d33e6SJohannes Doerfert // RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -x c++ -O1 -disable-llvm-optzns -verify -fopenmp -internal-isystem %S/../Headers/Inputs/include -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -fexceptions -fcxx-exceptions -aux-triple powerpc64le-unknown-unknown -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix=CHECK1
795a25e4cSJohannes Doerfert // expected-no-diagnostics
895a25e4cSJohannes Doerfert #ifndef HEADER
995a25e4cSJohannes Doerfert #define HEADER
1095a25e4cSJohannes Doerfert
1195a25e4cSJohannes Doerfert #include <complex>
1295a25e4cSJohannes Doerfert
1395a25e4cSJohannes Doerfert // Verify we do not add tbaa metadata to type punned memory operations:
1495a25e4cSJohannes Doerfert template <typename T>
complex_reduction()1595a25e4cSJohannes Doerfert void complex_reduction() {
1695a25e4cSJohannes Doerfert #pragma omp target teams distribute
1795a25e4cSJohannes Doerfert for (int ib = 0; ib < 100; ib++) {
1895a25e4cSJohannes Doerfert std::complex<T> partial_sum;
1995a25e4cSJohannes Doerfert const int istart = ib * 4;
2095a25e4cSJohannes Doerfert const int iend = (ib + 1) * 4;
2195a25e4cSJohannes Doerfert #pragma omp parallel for reduction(+ \
2295a25e4cSJohannes Doerfert : partial_sum)
2395a25e4cSJohannes Doerfert for (int i = istart; i < iend; i++)
2495a25e4cSJohannes Doerfert partial_sum += std::complex<T>(i, i);
2595a25e4cSJohannes Doerfert }
2695a25e4cSJohannes Doerfert }
2795a25e4cSJohannes Doerfert
test()2895a25e4cSJohannes Doerfert void test() {
2995a25e4cSJohannes Doerfert complex_reduction<float>();
3095a25e4cSJohannes Doerfert complex_reduction<double>();
3195a25e4cSJohannes Doerfert }
3295a25e4cSJohannes Doerfert #endif
33af000197SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z17complex_reductionIfEvv_l16
34e2cfbfccSJohannes Doerfert // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
35207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
36207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
37207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4
38423d34f7SShilei Tian // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i8 1, i1 true, i1 true)
39e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1
40e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
41e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry:
42e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
43f7de6962Shsmahesha // CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
44e2cfbfccSJohannes Doerfert // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTTHREADID_TEMP_]], align 4, !tbaa [[TBAA8:![0-9]+]]
4553d5757eSJoseph Huber // CHECK1-NEXT: call void @__omp_outlined__(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTZERO_ADDR]]) #[[ATTR6:[0-9]+]]
46423d34f7SShilei Tian // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i8 1, i1 true)
47e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void
48e2cfbfccSJohannes Doerfert // CHECK1: worker.exit:
49207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
50207b08a9SGiorgis Georgakoudis //
51207b08a9SGiorgis Georgakoudis //
52207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__
5353d5757eSJoseph Huber // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] {
54207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
55207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
56207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
57207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
58207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
59207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
60207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
61207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
62207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
63207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[IB:%.*]] = alloca i32, align 4
64207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca float, align 4
65207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP2:%.*]] = alloca float, align 4
66ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x i8*], align 8
679ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8, !tbaa [[TBAA12:![0-9]+]]
689ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8, !tbaa [[TBAA12]]
697cdaa5a9SJoseph Huber // CHECK1-NEXT: [[ISTART:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 4)
7068d133a3SJoseph Huber // CHECK1-NEXT: [[ISTART_ON_STACK:%.*]] = bitcast i8* [[ISTART]] to i32*
717cdaa5a9SJoseph Huber // CHECK1-NEXT: [[IEND:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 4)
7268d133a3SJoseph Huber // CHECK1-NEXT: [[IEND_ON_STACK:%.*]] = bitcast i8* [[IEND]] to i32*
737cdaa5a9SJoseph Huber // CHECK1-NEXT: [[PARTIAL_SUM:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 8)
7468d133a3SJoseph Huber // CHECK1-NEXT: [[PARTIAL_SUM_ON_STACK:%.*]] = bitcast i8* [[PARTIAL_SUM]] to %"class.std::complex"*
75ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
7653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP0]]) #[[ATTR6]]
77ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
7853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP1]]) #[[ATTR6]]
79e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
80ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
8153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP2]]) #[[ATTR6]]
82e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 99, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
83ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
8453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR6]]
85e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
86ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
8753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]]) #[[ATTR6]]
88e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4, !tbaa [[TBAA8]]
89ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i32* [[IB]] to i8*
9053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP5]]) #[[ATTR6]]
91ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
92ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4, !tbaa [[TBAA8]]
93b4a55436SJoseph Huber // CHECK1-NEXT: call void @__kmpc_distribute_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP7]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
94ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
95ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 99
96207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
97207b08a9SGiorgis Georgakoudis // CHECK1: cond.true:
98207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END:%.*]]
99207b08a9SGiorgis Georgakoudis // CHECK1: cond.false:
100ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
101207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END]]
102207b08a9SGiorgis Georgakoudis // CHECK1: cond.end:
103ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
1049ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
105ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
106ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
107207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
108207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond:
109ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
110ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
111ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
112207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]
113207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond.cleanup:
114207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
115207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.body:
116ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
117ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
118207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1199ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[ADD]], i32* [[IB]], align 4, !tbaa [[TBAA8]]
120ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = bitcast float* [[REF_TMP]] to i8*
12153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP14]]) #[[ATTR6]]
122e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store float 0.000000e+00, float* [[REF_TMP]], align 4, !tbaa [[TBAA14:![0-9]+]]
123ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = bitcast float* [[REF_TMP2]] to i8*
12453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP15]]) #[[ATTR6]]
1251d66649aSGiorgis Georgakoudis // CHECK1-NEXT: store float 0.000000e+00, float* [[REF_TMP2]], align 4, !tbaa [[TBAA14]]
126afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIfEC1ERKfS2_(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[PARTIAL_SUM_ON_STACK]], float* nonnull align 4 dereferenceable(4) [[REF_TMP]], float* nonnull align 4 dereferenceable(4) [[REF_TMP2]]) #[[ATTR12:[0-9]+]]
127ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast float* [[REF_TMP2]] to i8*
12853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP16]]) #[[ATTR6]]
129ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = bitcast float* [[REF_TMP]] to i8*
13053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP17]]) #[[ATTR6]]
131ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[IB]], align 4, !tbaa [[TBAA8]]
132ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL3:%.*]] = mul nsw i32 [[TMP18]], 4
1331d66649aSGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[MUL3]], i32* [[ISTART_ON_STACK]], align 4, !tbaa [[TBAA8]]
134ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[IB]], align 4, !tbaa [[TBAA8]]
135ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP19]], 1
136207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL5:%.*]] = mul nsw i32 [[ADD4]], 4
1379ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[MUL5]], i32* [[IEND_ON_STACK]], align 4, !tbaa [[TBAA8]]
138ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 0
139ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = bitcast i32* [[ISTART_ON_STACK]] to i8*
140ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP21]], i8** [[TMP20]], align 8, !tbaa [[TBAA12]]
141ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 1
142ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = bitcast i32* [[IEND_ON_STACK]] to i8*
143ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP23]], i8** [[TMP22]], align 8, !tbaa [[TBAA12]]
144ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 2
145ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = bitcast %"class.std::complex"* [[PARTIAL_SUM_ON_STACK]] to i8*
1469ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP25]], i8** [[TMP24]], align 8, !tbaa [[TBAA12]]
147ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = bitcast [3 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
148ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP7]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*, i32*, %"class.std::complex"*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP26]], i64 3)
149207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
150207b08a9SGiorgis Georgakoudis // CHECK1: omp.body.continue:
151207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
152207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.inc:
153ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
154ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP27]], 1
1559ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
156207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
157207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.end:
158207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
159207b08a9SGiorgis Georgakoudis // CHECK1: omp.loop.exit:
160b4a55436SJoseph Huber // CHECK1-NEXT: call void @__kmpc_distribute_static_fini(%struct.ident_t* @[[GLOB2]], i32 [[TMP7]])
161ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = bitcast i32* [[IB]] to i8*
16253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP28]]) #[[ATTR6]]
163ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
16453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP29]]) #[[ATTR6]]
165ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
16653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP30]]) #[[ATTR6]]
167ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
16853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP31]]) #[[ATTR6]]
169ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
17053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP32]]) #[[ATTR6]]
171ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
17253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP33]]) #[[ATTR6]]
173754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[PARTIAL_SUM]], i64 8)
174754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[IEND]], i64 4)
175754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[ISTART]], i64 4)
176207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
177207b08a9SGiorgis Georgakoudis //
178207b08a9SGiorgis Georgakoudis //
179207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIfEC1ERKfS2_
18053d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS:%.*]], float* nonnull align 4 dereferenceable(4) [[__RE:%.*]], float* nonnull align 4 dereferenceable(4) [[__IM:%.*]]) unnamed_addr #[[ATTR4:[0-9]+]] comdat align 2 {
181207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
182207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
183207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_ADDR:%.*]] = alloca float*, align 8
184207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_ADDR:%.*]] = alloca float*, align 8
1859ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[THIS]], %"class.std::complex"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
1869ce02ea8SJoseph Huber // CHECK1-NEXT: store float* [[__RE]], float** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
1879ce02ea8SJoseph Huber // CHECK1-NEXT: store float* [[__IM]], float** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
188207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[THIS_ADDR]], align 8
189207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load float*, float** [[__RE_ADDR]], align 8
190207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load float*, float** [[__IM_ADDR]], align 8
191afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIfEC2ERKfS2_(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS1]], float* nonnull align 4 dereferenceable(4) [[TMP0]], float* nonnull align 4 dereferenceable(4) [[TMP1]]) #[[ATTR12]]
192207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
193207b08a9SGiorgis Georgakoudis //
194207b08a9SGiorgis Georgakoudis //
195207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1
19653d5757eSJoseph Huber // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ISTART:%.*]], i32* nonnull align 4 dereferenceable(4) [[IEND:%.*]], %"class.std::complex"* nonnull align 4 dereferenceable(8) [[PARTIAL_SUM:%.*]]) #[[ATTR1]] {
197207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
198207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
199207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
200ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ISTART_ADDR:%.*]] = alloca i32*, align 8
201ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[IEND_ADDR:%.*]] = alloca i32*, align 8
202ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[PARTIAL_SUM_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
203207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
204207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
205207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
206207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
207207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
208207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4
209207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
210207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
211207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
212207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
213ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[PARTIAL_SUM5:%.*]] = alloca %"class.std::complex", align 4
214207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca float, align 4
215ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP6:%.*]] = alloca float, align 4
216ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[I7:%.*]] = alloca i32, align 4
217ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP14:%.*]] = alloca %"class.std::complex", align 4
218207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP15:%.*]] = alloca float, align 4
219ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP16:%.*]] = alloca float, align 4
220207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
2219ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8, !tbaa [[TBAA12]]
2229ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8, !tbaa [[TBAA12]]
223ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[ISTART]], i32** [[ISTART_ADDR]], align 8, !tbaa [[TBAA12]]
224ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[IEND]], i32** [[IEND_ADDR]], align 8, !tbaa [[TBAA12]]
225ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex"* [[PARTIAL_SUM]], %"class.std::complex"** [[PARTIAL_SUM_ADDR]], align 8, !tbaa [[TBAA12]]
226ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ISTART_ADDR]], align 8, !tbaa [[TBAA12]]
227ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load i32*, i32** [[IEND_ADDR]], align 8, !tbaa [[TBAA12]]
228ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[PARTIAL_SUM_ADDR]], align 8, !tbaa [[TBAA12]]
229ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
23053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR6]]
231ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_]] to i8*
23253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]]) #[[ATTR6]]
233ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4, !tbaa [[TBAA8]]
234ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
235ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_1]] to i8*
23653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP6]]) #[[ATTR6]]
237ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP1]], align 4, !tbaa [[TBAA8]]
238ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP7]], i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
239ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_2]] to i8*
24053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP8]]) #[[ATTR6]]
241ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
242ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
243ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB:%.*]] = sub i32 [[TMP9]], [[TMP10]]
244207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1
245207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], 1
246207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], 1
247207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1
2489ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[SUB4]], i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
249ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = bitcast i32* [[I]] to i8*
25053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP11]]) #[[ATTR6]]
251ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
252ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP12]], i32* [[I]], align 4, !tbaa [[TBAA8]]
253ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = bitcast i32* [[I]] to i8*
25453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP13]]) #[[ATTR6]]
255ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
256ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
257ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP14]], [[TMP15]]
258207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
259207b08a9SGiorgis Georgakoudis // CHECK1: omp.precond.then:
260ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
26153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP16]]) #[[ATTR6]]
262e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
263ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
26453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP17]]) #[[ATTR6]]
265ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
266ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP18]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
267ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
26853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP19]]) #[[ATTR6]]
269e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
270ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
27153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP20]]) #[[ATTR6]]
272e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4, !tbaa [[TBAA8]]
273ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = bitcast %"class.std::complex"* [[PARTIAL_SUM5]] to i8*
27453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP21]]) #[[ATTR6]]
275ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = bitcast float* [[REF_TMP]] to i8*
27653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP22]]) #[[ATTR6]]
277e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store float 0.000000e+00, float* [[REF_TMP]], align 4, !tbaa [[TBAA14]]
278ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = bitcast float* [[REF_TMP6]] to i8*
27953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP23]]) #[[ATTR6]]
280ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store float 0.000000e+00, float* [[REF_TMP6]], align 4, !tbaa [[TBAA14]]
281afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIfEC1ERKfS2_(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[PARTIAL_SUM5]], float* nonnull align 4 dereferenceable(4) [[REF_TMP]], float* nonnull align 4 dereferenceable(4) [[REF_TMP6]]) #[[ATTR12]]
282ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = bitcast float* [[REF_TMP6]] to i8*
28353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP24]]) #[[ATTR6]]
284ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = bitcast float* [[REF_TMP]] to i8*
28553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP25]]) #[[ATTR6]]
286ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = bitcast i32* [[I7]] to i8*
28753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP26]]) #[[ATTR6]]
288ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
289ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4, !tbaa [[TBAA8]]
290ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP28]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
291207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_COND:%.*]]
292207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.cond:
293ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
294ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
295ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP8:%.*]] = icmp ugt i32 [[TMP29]], [[TMP30]]
296ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP8]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
297207b08a9SGiorgis Georgakoudis // CHECK1: cond.true:
298ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
299207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END:%.*]]
300207b08a9SGiorgis Georgakoudis // CHECK1: cond.false:
301ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
302207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END]]
303207b08a9SGiorgis Georgakoudis // CHECK1: cond.end:
304ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE]] ], [ [[TMP32]], [[COND_FALSE]] ]
3059ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
306ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
307ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
308ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
309ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
310ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD9:%.*]] = add i32 [[TMP35]], 1
311ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP10:%.*]] = icmp ult i32 [[TMP34]], [[ADD9]]
312ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP10]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_CLEANUP:%.*]]
313207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.cleanup:
314207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_END:%.*]]
315207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.body:
316207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
317207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond:
318ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
319ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP37:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
320ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD11:%.*]] = add i32 [[TMP37]], 1
321ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP12:%.*]] = icmp ult i32 [[TMP36]], [[ADD11]]
322ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP12]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]
323207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond.cleanup:
324207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
325207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.body:
326ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
327ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP39:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
328ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL:%.*]] = mul i32 [[TMP39]], 1
329ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD13:%.*]] = add i32 [[TMP38]], [[MUL]]
330ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD13]], i32* [[I7]], align 4, !tbaa [[TBAA8]]
331ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP40:%.*]] = bitcast %"class.std::complex"* [[REF_TMP14]] to i8*
33253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP40]]) #[[ATTR6]]
333ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP41:%.*]] = bitcast float* [[REF_TMP15]] to i8*
33453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP41]]) #[[ATTR6]]
335ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP42:%.*]] = load i32, i32* [[I7]], align 4, !tbaa [[TBAA8]]
336ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP42]] to float
337ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store float [[CONV]], float* [[REF_TMP15]], align 4, !tbaa [[TBAA14]]
338ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP43:%.*]] = bitcast float* [[REF_TMP16]] to i8*
33953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP43]]) #[[ATTR6]]
340ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP44:%.*]] = load i32, i32* [[I7]], align 4, !tbaa [[TBAA8]]
341ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV17:%.*]] = sitofp i32 [[TMP44]] to float
342ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store float [[CONV17]], float* [[REF_TMP16]], align 4, !tbaa [[TBAA14]]
343afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIfEC1ERKfS2_(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[REF_TMP14]], float* nonnull align 4 dereferenceable(4) [[REF_TMP15]], float* nonnull align 4 dereferenceable(4) [[REF_TMP16]]) #[[ATTR12]]
344afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) %"class.std::complex"* @_ZNSt7complexIfEpLIfEERS0_RKS_IT_E(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[PARTIAL_SUM5]], %"class.std::complex"* nonnull align 4 dereferenceable(8) [[REF_TMP14]]) #[[ATTR12]]
345ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP45:%.*]] = bitcast float* [[REF_TMP16]] to i8*
34653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP45]]) #[[ATTR6]]
347ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP46:%.*]] = bitcast float* [[REF_TMP15]] to i8*
34853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP46]]) #[[ATTR6]]
349ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP47:%.*]] = bitcast %"class.std::complex"* [[REF_TMP14]] to i8*
35053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP47]]) #[[ATTR6]]
351207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
352207b08a9SGiorgis Georgakoudis // CHECK1: omp.body.continue:
353207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
354207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.inc:
355ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP48:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
356ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD18:%.*]] = add i32 [[TMP48]], 1
357ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD18]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
358207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
359207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.end:
360207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_INC:%.*]]
361207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.inc:
362ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP49:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
363ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP50:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
364ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD19:%.*]] = add i32 [[TMP49]], [[TMP50]]
365ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD19]], i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
366ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP51:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
367ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP52:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
368ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD20:%.*]] = add i32 [[TMP51]], [[TMP52]]
369ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD20]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
370207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_COND]]
371207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.end:
372ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP53:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
373ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP54:%.*]] = load i32, i32* [[TMP53]], align 4, !tbaa [[TBAA8]]
374ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP54]])
375ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP55:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
376ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP56:%.*]] = load i32, i32* [[TMP55]], align 4, !tbaa [[TBAA8]]
377ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP57:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
378ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP58:%.*]] = bitcast %"class.std::complex"* [[PARTIAL_SUM5]] to i8*
379ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP58]], i8** [[TMP57]], align 8
380ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP59:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
381ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP60:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(%struct.ident_t* @[[GLOB1]], i32 [[TMP56]], i32 1, i64 8, i8* [[TMP59]], void (i8*, i16, i16, i16)* @_omp_reduction_shuffle_and_reduce_func, void (i8*, i32)* @_omp_reduction_inter_warp_copy_func)
382ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP61:%.*]] = icmp eq i32 [[TMP60]], 1
383ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[TMP61]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]
384207b08a9SGiorgis Georgakoudis // CHECK1: .omp.reduction.then:
385afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL21:%.*]] = call nonnull align 4 dereferenceable(8) %"class.std::complex"* @_ZNSt7complexIfEpLIfEERS0_RKS_IT_E(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[TMP2]], %"class.std::complex"* nonnull align 4 dereferenceable(8) [[PARTIAL_SUM5]]) #[[ATTR12]]
386ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_nvptx_end_reduce_nowait(i32 [[TMP56]])
387207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]
388207b08a9SGiorgis Georgakoudis // CHECK1: .omp.reduction.done:
389ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP62:%.*]] = bitcast i32* [[I7]] to i8*
39053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP62]]) #[[ATTR6]]
391ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP63:%.*]] = bitcast %"class.std::complex"* [[PARTIAL_SUM5]] to i8*
39253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP63]]) #[[ATTR6]]
393ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP64:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
39453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP64]]) #[[ATTR6]]
395ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP65:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
39653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP65]]) #[[ATTR6]]
397ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP66:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
39853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP66]]) #[[ATTR6]]
399ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP67:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
40053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP67]]) #[[ATTR6]]
401207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_PRECOND_END]]
402207b08a9SGiorgis Georgakoudis // CHECK1: omp.precond.end:
403ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP68:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_2]] to i8*
40453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP68]]) #[[ATTR6]]
405ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP69:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_1]] to i8*
40653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP69]]) #[[ATTR6]]
407ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP70:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_]] to i8*
40853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP70]]) #[[ATTR6]]
409ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP71:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
41053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP71]]) #[[ATTR6]]
411207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
412207b08a9SGiorgis Georgakoudis //
413207b08a9SGiorgis Georgakoudis //
414207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIfEpLIfEERS0_RKS_IT_E
41553d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS:%.*]], %"class.std::complex"* nonnull align 4 dereferenceable(8) [[__C:%.*]]) #[[ATTR5:[0-9]+]] comdat align 2 {
416207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
417207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
418207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__C_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
4199ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[THIS]], %"class.std::complex"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
4209ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[__C]], %"class.std::complex"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
421207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[THIS_ADDR]], align 8
4229ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
423afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL:%.*]] = call float @_ZNKSt7complexIfE4realEv(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[TMP0]]) #[[ATTR12]]
424207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 0
4259ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP1:%.*]] = load float, float* [[__RE_]], align 4, !tbaa [[TBAA16:![0-9]+]]
426207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP1]], [[CALL]]
4279ce02ea8SJoseph Huber // CHECK1-NEXT: store float [[ADD]], float* [[__RE_]], align 4, !tbaa [[TBAA16]]
4289ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP2:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
429afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL2:%.*]] = call float @_ZNKSt7complexIfE4imagEv(%"class.std::complex"* nonnull align 4 dereferenceable(8) [[TMP2]]) #[[ATTR12]]
430207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 1
4319ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = load float, float* [[__IM_]], align 4, !tbaa [[TBAA18:![0-9]+]]
432207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD3:%.*]] = fadd float [[TMP3]], [[CALL2]]
4339ce02ea8SJoseph Huber // CHECK1-NEXT: store float [[ADD3]], float* [[__IM_]], align 4, !tbaa [[TBAA18]]
434207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret %"class.std::complex"* [[THIS1]]
435207b08a9SGiorgis Georgakoudis //
436207b08a9SGiorgis Georgakoudis //
437207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func
43853d5757eSJoseph Huber // CHECK1-SAME: (i8* [[TMP0:%.*]], i16 signext [[TMP1:%.*]], i16 signext [[TMP2:%.*]], i16 signext [[TMP3:%.*]]) #[[ATTR7:[0-9]+]] {
439207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
440207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
441207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2
442207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2
443207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2
444207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x i8*], align 8
445207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca %"class.std::complex", align 4
4469ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
4479ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP1]], i16* [[DOTADDR1]], align 2, !tbaa [[TBAA19:![0-9]+]]
4489ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP2]], i16* [[DOTADDR2]], align 2, !tbaa [[TBAA19]]
4499ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP3]], i16* [[DOTADDR3]], align 2, !tbaa [[TBAA19]]
4509ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
451207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
4529ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP6:%.*]] = load i16, i16* [[DOTADDR1]], align 2, !tbaa [[TBAA19]]
4539ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTADDR2]], align 2, !tbaa [[TBAA19]]
4549ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP8:%.*]] = load i16, i16* [[DOTADDR3]], align 2, !tbaa [[TBAA19]]
455207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
4567a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %"class.std::complex"**
4577a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP11:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[TMP10]], align 8
4587a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0
4597a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr %"class.std::complex", %"class.std::complex"* [[TMP11]], i64 1
460207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = bitcast %"class.std::complex"* [[TMP13]] to i8*
4617a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP15:%.*]] = bitcast %"class.std::complex"* [[TMP11]] to i64*
462207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast %"class.std::complex"* [[DOTOMP_REDUCTION_ELEMENT]] to i64*
463207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = load i64, i64* [[TMP15]], align 4
4647cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_get_warp_size()
4657cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP19:%.*]] = trunc i32 [[TMP18]] to i16
4667cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP20:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP17]], i16 [[TMP7]], i16 [[TMP19]])
4677cdaa5a9SJoseph Huber // CHECK1-NEXT: store i64 [[TMP20]], i64* [[TMP16]], align 4
4687cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i64, i64* [[TMP15]], i64 1
4697cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP22:%.*]] = getelementptr i64, i64* [[TMP16]], i64 1
4707cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP23:%.*]] = bitcast %"class.std::complex"* [[DOTOMP_REDUCTION_ELEMENT]] to i8*
4717a2e12e0SNikita Popov // CHECK1-NEXT: store i8* [[TMP23]], i8** [[TMP12]], align 8, !tbaa [[TBAA12]]
4727cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP24:%.*]] = icmp eq i16 [[TMP8]], 0
4737cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP25:%.*]] = icmp eq i16 [[TMP8]], 1
4747cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP26:%.*]] = icmp ult i16 [[TMP6]], [[TMP7]]
4757cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP27:%.*]] = and i1 [[TMP25]], [[TMP26]]
4767cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP28:%.*]] = icmp eq i16 [[TMP8]], 2
4777cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP29:%.*]] = and i16 [[TMP6]], 1
4787cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP29]], 0
4797cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP31:%.*]] = and i1 [[TMP28]], [[TMP30]]
4807cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP32:%.*]] = icmp sgt i16 [[TMP7]], 0
4817cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]
4827cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP34:%.*]] = or i1 [[TMP24]], [[TMP27]]
4837cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP35:%.*]] = or i1 [[TMP34]], [[TMP33]]
4847cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP35]], label [[THEN:%.*]], label [[ELSE:%.*]]
485207b08a9SGiorgis Georgakoudis // CHECK1: then:
4867cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP36:%.*]] = bitcast [1 x i8*]* [[TMP5]] to i8*
4877cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP37:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]] to i8*
48853d5757eSJoseph Huber // CHECK1-NEXT: call void @"_omp$reduction$reduction_func"(i8* [[TMP36]], i8* [[TMP37]]) #[[ATTR6]]
489207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT:%.*]]
490207b08a9SGiorgis Georgakoudis // CHECK1: else:
491207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT]]
492207b08a9SGiorgis Georgakoudis // CHECK1: ifcont:
4937cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP38:%.*]] = icmp eq i16 [[TMP8]], 1
4947cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP39:%.*]] = icmp uge i16 [[TMP6]], [[TMP7]]
4957cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP40:%.*]] = and i1 [[TMP38]], [[TMP39]]
4967cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP40]], label [[THEN4:%.*]], label [[ELSE5:%.*]]
497207b08a9SGiorgis Georgakoudis // CHECK1: then4:
4987cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0
4997a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP42:%.*]] = bitcast i8** [[TMP41]] to %"class.std::complex"**
5007a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP43:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[TMP42]], align 8
5017a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP44:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
5027a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP45:%.*]] = bitcast i8** [[TMP44]] to %"class.std::complex"**
5037a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP46:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[TMP45]], align 8
5047cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP47:%.*]] = bitcast %"class.std::complex"* [[TMP46]] to i8*
5057a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP48:%.*]] = bitcast %"class.std::complex"* [[TMP43]] to i8*
5067cdaa5a9SJoseph Huber // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP47]], i8* align 4 [[TMP48]], i64 8, i1 false), !tbaa.struct !21
507207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT6:%.*]]
508207b08a9SGiorgis Georgakoudis // CHECK1: else5:
509207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT6]]
510207b08a9SGiorgis Georgakoudis // CHECK1: ifcont6:
511207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
512207b08a9SGiorgis Georgakoudis //
513207b08a9SGiorgis Georgakoudis //
514207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func
51553d5757eSJoseph Huber // CHECK1-SAME: (i8* [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR7]] {
516207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
517207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
518207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
519207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 4
520e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
5219ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
5229ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
5237cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
5247cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
5257cdaa5a9SJoseph Huber // CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31
5267cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
5277cdaa5a9SJoseph Huber // CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5
5287cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP6:%.*]] = load i8*, i8** [[DOTADDR]], align 8
5297cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to [1 x i8*]*
5309ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 0, i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
531207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[PRECOND:%.*]]
532207b08a9SGiorgis Georgakoudis // CHECK1: precond:
5337cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
5347cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP9:%.*]] = icmp ult i32 [[TMP8]], 2
5357cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP9]], label [[BODY:%.*]], label [[EXIT:%.*]]
536207b08a9SGiorgis Georgakoudis // CHECK1: body:
537207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP2]])
538207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0
539207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]
540207b08a9SGiorgis Georgakoudis // CHECK1: then:
5417cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0
5427cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP11:%.*]] = load i8*, i8** [[TMP10]], align 8, !tbaa [[TBAA12]]
5437cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP12:%.*]] = bitcast i8* [[TMP11]] to i32*
5447cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr i32, i32* [[TMP12]], i32 [[TMP8]]
5457cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]
5467cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP13]], align 4
5477cdaa5a9SJoseph Huber // CHECK1-NEXT: store volatile i32 [[TMP15]], i32 addrspace(3)* [[TMP14]], align 4
548207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT:%.*]]
549207b08a9SGiorgis Georgakoudis // CHECK1: else:
550207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT]]
551207b08a9SGiorgis Georgakoudis // CHECK1: ifcont:
552207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4]], i32 [[TMP2]])
5537cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
5547cdaa5a9SJoseph Huber // CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP16]]
5557cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]
556737c4a26SAtmn Patel // CHECK1: then2:
5577cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]
5587cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0
5597cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP19:%.*]] = load i8*, i8** [[TMP18]], align 8, !tbaa [[TBAA12]]
5607cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP20:%.*]] = bitcast i8* [[TMP19]] to i32*
5617cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i32, i32* [[TMP20]], i32 [[TMP8]]
5627cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP22:%.*]] = load volatile i32, i32 addrspace(3)* [[TMP17]], align 4, !tbaa [[TBAA8]]
5637cdaa5a9SJoseph Huber // CHECK1-NEXT: store i32 [[TMP22]], i32* [[TMP21]], align 4, !tbaa [[TBAA8]]
5647cdaa5a9SJoseph Huber // CHECK1-NEXT: br label [[IFCONT4:%.*]]
565737c4a26SAtmn Patel // CHECK1: else3:
5667cdaa5a9SJoseph Huber // CHECK1-NEXT: br label [[IFCONT4]]
567737c4a26SAtmn Patel // CHECK1: ifcont4:
5687cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP23:%.*]] = add nsw i32 [[TMP8]], 1
5697cdaa5a9SJoseph Huber // CHECK1-NEXT: store i32 [[TMP23]], i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
570207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[PRECOND]]
571207b08a9SGiorgis Georgakoudis // CHECK1: exit:
572207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
573207b08a9SGiorgis Georgakoudis //
574207b08a9SGiorgis Georgakoudis //
575207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper
57653d5757eSJoseph Huber // CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR7]] {
577207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
578207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
579207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
580207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
581207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
5829ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2, !tbaa [[TBAA19]]
5839ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
584f7de6962Shsmahesha // CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
585207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
586207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
587207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
588ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
589ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8, !tbaa [[TBAA12]]
590ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 1
591ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32**
592ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = load i32*, i32** [[TMP7]], align 8, !tbaa [[TBAA12]]
593ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 2
594ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %"class.std::complex"**
595ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[TMP10]], align 8, !tbaa [[TBAA12]]
59653d5757eSJoseph Huber // CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], i32* [[TMP8]], %"class.std::complex"* [[TMP11]]) #[[ATTR6]]
597207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
598207b08a9SGiorgis Georgakoudis //
599207b08a9SGiorgis Georgakoudis //
600af000197SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z17complex_reductionIdEvv_l16
601207b08a9SGiorgis Georgakoudis // CHECK1-SAME: () #[[ATTR0]] {
602207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
603207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
604207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4
605423d34f7SShilei Tian // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i8 1, i1 true, i1 true)
606e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1
607e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]
608e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry:
609e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
610f7de6962Shsmahesha // CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
611e2cfbfccSJohannes Doerfert // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTTHREADID_TEMP_]], align 4, !tbaa [[TBAA8]]
61253d5757eSJoseph Huber // CHECK1-NEXT: call void @__omp_outlined__2(i32* [[DOTTHREADID_TEMP_]], i32* [[DOTZERO_ADDR]]) #[[ATTR6]]
613423d34f7SShilei Tian // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i8 1, i1 true)
614e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void
615e2cfbfccSJohannes Doerfert // CHECK1: worker.exit:
616207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
617207b08a9SGiorgis Georgakoudis //
618207b08a9SGiorgis Georgakoudis //
619207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__2
62053d5757eSJoseph Huber // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
621207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
622207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
623207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
624207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
625207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
626207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
627207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
628207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
629207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
630207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[IB:%.*]] = alloca i32, align 4
631207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca double, align 8
632207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP2:%.*]] = alloca double, align 8
633ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x i8*], align 8
6349ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8, !tbaa [[TBAA12]]
6359ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8, !tbaa [[TBAA12]]
6367cdaa5a9SJoseph Huber // CHECK1-NEXT: [[ISTART:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 4)
63768d133a3SJoseph Huber // CHECK1-NEXT: [[ISTART_ON_STACK:%.*]] = bitcast i8* [[ISTART]] to i32*
6387cdaa5a9SJoseph Huber // CHECK1-NEXT: [[IEND:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 4)
63968d133a3SJoseph Huber // CHECK1-NEXT: [[IEND_ON_STACK:%.*]] = bitcast i8* [[IEND]] to i32*
6407cdaa5a9SJoseph Huber // CHECK1-NEXT: [[PARTIAL_SUM:%.*]] = call align 16 i8* @__kmpc_alloc_shared(i64 16)
641ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[PARTIAL_SUM_ON_STACK:%.*]] = bitcast i8* [[PARTIAL_SUM]] to %"class.std::complex.0"*
642ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
64353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP0]]) #[[ATTR6]]
644ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
64553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP1]]) #[[ATTR6]]
646e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
647ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
64853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP2]]) #[[ATTR6]]
649e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 99, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
650ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
65153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR6]]
652e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
653ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
65453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]]) #[[ATTR6]]
655e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4, !tbaa [[TBAA8]]
656ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i32* [[IB]] to i8*
65753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP5]]) #[[ATTR6]]
658ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
659ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4, !tbaa [[TBAA8]]
660b4a55436SJoseph Huber // CHECK1-NEXT: call void @__kmpc_distribute_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP7]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
661ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
662ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 99
663207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
664207b08a9SGiorgis Georgakoudis // CHECK1: cond.true:
665207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END:%.*]]
666207b08a9SGiorgis Georgakoudis // CHECK1: cond.false:
667ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
668207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END]]
669207b08a9SGiorgis Georgakoudis // CHECK1: cond.end:
670ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
6719ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
672ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
673ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
674207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
675207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond:
676ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
677ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
678ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
679207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]
680207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond.cleanup:
681207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
682207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.body:
683ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
684ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
685207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6869ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[ADD]], i32* [[IB]], align 4, !tbaa [[TBAA8]]
687ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = bitcast double* [[REF_TMP]] to i8*
68853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP14]]) #[[ATTR6]]
689e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store double 0.000000e+00, double* [[REF_TMP]], align 8, !tbaa [[TBAA22:![0-9]+]]
690ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = bitcast double* [[REF_TMP2]] to i8*
69153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP15]]) #[[ATTR6]]
6921d66649aSGiorgis Georgakoudis // CHECK1-NEXT: store double 0.000000e+00, double* [[REF_TMP2]], align 8, !tbaa [[TBAA22]]
693afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIdEC1ERKdS2_(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[PARTIAL_SUM_ON_STACK]], double* nonnull align 8 dereferenceable(8) [[REF_TMP]], double* nonnull align 8 dereferenceable(8) [[REF_TMP2]]) #[[ATTR12]]
694ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast double* [[REF_TMP2]] to i8*
69553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP16]]) #[[ATTR6]]
696ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = bitcast double* [[REF_TMP]] to i8*
69753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP17]]) #[[ATTR6]]
698ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[IB]], align 4, !tbaa [[TBAA8]]
699ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL3:%.*]] = mul nsw i32 [[TMP18]], 4
7001d66649aSGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[MUL3]], i32* [[ISTART_ON_STACK]], align 4, !tbaa [[TBAA8]]
701ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[IB]], align 4, !tbaa [[TBAA8]]
702ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP19]], 1
703207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL5:%.*]] = mul nsw i32 [[ADD4]], 4
7049ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[MUL5]], i32* [[IEND_ON_STACK]], align 4, !tbaa [[TBAA8]]
705ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 0
706ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = bitcast i32* [[ISTART_ON_STACK]] to i8*
707ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP21]], i8** [[TMP20]], align 8, !tbaa [[TBAA12]]
708ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 1
709ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = bitcast i32* [[IEND_ON_STACK]] to i8*
710ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP23]], i8** [[TMP22]], align 8, !tbaa [[TBAA12]]
711ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 2
712ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = bitcast %"class.std::complex.0"* [[PARTIAL_SUM_ON_STACK]] to i8*
7139ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP25]], i8** [[TMP24]], align 8, !tbaa [[TBAA12]]
714ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = bitcast [3 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8**
715ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB1]], i32 [[TMP7]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, i32*, i32*, %"class.std::complex.0"*)* @__omp_outlined__3 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__3_wrapper to i8*), i8** [[TMP26]], i64 3)
716207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
717207b08a9SGiorgis Georgakoudis // CHECK1: omp.body.continue:
718207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
719207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.inc:
720ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
721ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP27]], 1
7229ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
723207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
724207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.end:
725207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
726207b08a9SGiorgis Georgakoudis // CHECK1: omp.loop.exit:
727b4a55436SJoseph Huber // CHECK1-NEXT: call void @__kmpc_distribute_static_fini(%struct.ident_t* @[[GLOB2]], i32 [[TMP7]])
728ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = bitcast i32* [[IB]] to i8*
72953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP28]]) #[[ATTR6]]
730ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
73153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP29]]) #[[ATTR6]]
732ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
73353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP30]]) #[[ATTR6]]
734ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
73553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP31]]) #[[ATTR6]]
736ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
73753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP32]]) #[[ATTR6]]
738ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
73953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP33]]) #[[ATTR6]]
740754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[PARTIAL_SUM]], i64 16)
741754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[IEND]], i64 4)
742754eb1c2SJoseph Huber // CHECK1-NEXT: call void @__kmpc_free_shared(i8* [[ISTART]], i64 4)
743207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
744207b08a9SGiorgis Georgakoudis //
745207b08a9SGiorgis Georgakoudis //
746207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIdEC1ERKdS2_
74753d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS:%.*]], double* nonnull align 8 dereferenceable(8) [[__RE:%.*]], double* nonnull align 8 dereferenceable(8) [[__IM:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
748207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
749ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
750207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_ADDR:%.*]] = alloca double*, align 8
751207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_ADDR:%.*]] = alloca double*, align 8
752ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[THIS]], %"class.std::complex.0"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
7539ce02ea8SJoseph Huber // CHECK1-NEXT: store double* [[__RE]], double** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
7549ce02ea8SJoseph Huber // CHECK1-NEXT: store double* [[__IM]], double** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
755ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[THIS_ADDR]], align 8
756207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load double*, double** [[__RE_ADDR]], align 8
757207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load double*, double** [[__IM_ADDR]], align 8
758afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIdEC2ERKdS2_(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS1]], double* nonnull align 8 dereferenceable(8) [[TMP0]], double* nonnull align 8 dereferenceable(8) [[TMP1]]) #[[ATTR12]]
759207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
760207b08a9SGiorgis Georgakoudis //
761207b08a9SGiorgis Georgakoudis //
76268d133a3SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__3
76353d5757eSJoseph Huber // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ISTART:%.*]], i32* nonnull align 4 dereferenceable(4) [[IEND:%.*]], %"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[PARTIAL_SUM:%.*]]) #[[ATTR1]] {
764207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
765207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
766207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
767ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ISTART_ADDR:%.*]] = alloca i32*, align 8
768ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[IEND_ADDR:%.*]] = alloca i32*, align 8
769ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[PARTIAL_SUM_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
770207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
771207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
772207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
773207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
774207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
775207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4
776207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
777207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
778207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
779207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
780ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[PARTIAL_SUM5:%.*]] = alloca %"class.std::complex.0", align 8
781207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca double, align 8
782ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP6:%.*]] = alloca double, align 8
783ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[I7:%.*]] = alloca i32, align 4
784ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP14:%.*]] = alloca %"class.std::complex.0", align 8
785207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP15:%.*]] = alloca double, align 8
786ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP16:%.*]] = alloca double, align 8
787207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
7889ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8, !tbaa [[TBAA12]]
7899ce02ea8SJoseph Huber // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8, !tbaa [[TBAA12]]
790ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[ISTART]], i32** [[ISTART_ADDR]], align 8, !tbaa [[TBAA12]]
791ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[IEND]], i32** [[IEND_ADDR]], align 8, !tbaa [[TBAA12]]
792ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[PARTIAL_SUM]], %"class.std::complex.0"** [[PARTIAL_SUM_ADDR]], align 8, !tbaa [[TBAA12]]
793ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ISTART_ADDR]], align 8, !tbaa [[TBAA12]]
794ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load i32*, i32** [[IEND_ADDR]], align 8, !tbaa [[TBAA12]]
795ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[PARTIAL_SUM_ADDR]], align 8, !tbaa [[TBAA12]]
796ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
79753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP3]]) #[[ATTR6]]
798ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_]] to i8*
79953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]]) #[[ATTR6]]
800ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4, !tbaa [[TBAA8]]
801ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
802ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_1]] to i8*
80353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP6]]) #[[ATTR6]]
804ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP1]], align 4, !tbaa [[TBAA8]]
805ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP7]], i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
806ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_2]] to i8*
80753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP8]]) #[[ATTR6]]
808ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
809ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
810ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB:%.*]] = sub i32 [[TMP9]], [[TMP10]]
811207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1
812207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], 1
813207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], 1
814207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1
8159ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[SUB4]], i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
816ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = bitcast i32* [[I]] to i8*
81753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP11]]) #[[ATTR6]]
818ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
819ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP12]], i32* [[I]], align 4, !tbaa [[TBAA8]]
820ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = bitcast i32* [[I]] to i8*
82153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP13]]) #[[ATTR6]]
822ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
823ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4, !tbaa [[TBAA8]]
824ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP14]], [[TMP15]]
825207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
826207b08a9SGiorgis Georgakoudis // CHECK1: omp.precond.then:
827ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
82853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP16]]) #[[ATTR6]]
829e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
830ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
83153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP17]]) #[[ATTR6]]
832ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
833ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP18]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
834ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
83553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP19]]) #[[ATTR6]]
836e9c7291cSGiorgis Georgakoudis // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
837ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
83853d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP20]]) #[[ATTR6]]
8399ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4, !tbaa [[TBAA8]]
840ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = bitcast %"class.std::complex.0"* [[PARTIAL_SUM5]] to i8*
84153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* [[TMP21]]) #[[ATTR6]]
842ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = bitcast double* [[REF_TMP]] to i8*
84353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP22]]) #[[ATTR6]]
8449ce02ea8SJoseph Huber // CHECK1-NEXT: store double 0.000000e+00, double* [[REF_TMP]], align 8, !tbaa [[TBAA22]]
845ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = bitcast double* [[REF_TMP6]] to i8*
84653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP23]]) #[[ATTR6]]
847ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store double 0.000000e+00, double* [[REF_TMP6]], align 8, !tbaa [[TBAA22]]
848afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIdEC1ERKdS2_(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[PARTIAL_SUM5]], double* nonnull align 8 dereferenceable(8) [[REF_TMP]], double* nonnull align 8 dereferenceable(8) [[REF_TMP6]]) #[[ATTR12]]
849ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = bitcast double* [[REF_TMP6]] to i8*
85053d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP24]]) #[[ATTR6]]
851ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = bitcast double* [[REF_TMP]] to i8*
85253d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP25]]) #[[ATTR6]]
853ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = bitcast i32* [[I7]] to i8*
85453d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP26]]) #[[ATTR6]]
855ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
856ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4, !tbaa [[TBAA8]]
857ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB3]], i32 [[TMP28]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
858207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_COND:%.*]]
859207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.cond:
860ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
861ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
862ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP8:%.*]] = icmp ugt i32 [[TMP29]], [[TMP30]]
863ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP8]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
864207b08a9SGiorgis Georgakoudis // CHECK1: cond.true:
865ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !tbaa [[TBAA8]]
866207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END:%.*]]
867207b08a9SGiorgis Georgakoudis // CHECK1: cond.false:
868ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
869207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[COND_END]]
870207b08a9SGiorgis Georgakoudis // CHECK1: cond.end:
871ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE]] ], [ [[TMP32]], [[COND_FALSE]] ]
8729ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
873ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
874ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
875ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
876ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
877ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD9:%.*]] = add i32 [[TMP35]], 1
878ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP10:%.*]] = icmp ult i32 [[TMP34]], [[ADD9]]
879ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP10]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_CLEANUP:%.*]]
880207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.cleanup:
881207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_END:%.*]]
882207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.body:
883207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
884207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond:
885ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
886ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP37:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
887ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD11:%.*]] = add i32 [[TMP37]], 1
888ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP12:%.*]] = icmp ult i32 [[TMP36]], [[ADD11]]
889ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP12]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]
890207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond.cleanup:
891207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
892207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.body:
893ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4, !tbaa [[TBAA8]]
894ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP39:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
895ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[MUL:%.*]] = mul i32 [[TMP39]], 1
896ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD13:%.*]] = add i32 [[TMP38]], [[MUL]]
897ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD13]], i32* [[I7]], align 4, !tbaa [[TBAA8]]
898ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP40:%.*]] = bitcast %"class.std::complex.0"* [[REF_TMP14]] to i8*
89953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* [[TMP40]]) #[[ATTR6]]
900ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP41:%.*]] = bitcast double* [[REF_TMP15]] to i8*
90153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP41]]) #[[ATTR6]]
902ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP42:%.*]] = load i32, i32* [[I7]], align 4, !tbaa [[TBAA8]]
903ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP42]] to double
904ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store double [[CONV]], double* [[REF_TMP15]], align 8, !tbaa [[TBAA22]]
905ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP43:%.*]] = bitcast double* [[REF_TMP16]] to i8*
90653d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP43]]) #[[ATTR6]]
907ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP44:%.*]] = load i32, i32* [[I7]], align 4, !tbaa [[TBAA8]]
908ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV17:%.*]] = sitofp i32 [[TMP44]] to double
909ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store double [[CONV17]], double* [[REF_TMP16]], align 8, !tbaa [[TBAA22]]
910afb9cbb3SNikita Popov // CHECK1-NEXT: call void @_ZNSt7complexIdEC1ERKdS2_(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[REF_TMP14]], double* nonnull align 8 dereferenceable(8) [[REF_TMP15]], double* nonnull align 8 dereferenceable(8) [[REF_TMP16]]) #[[ATTR12]]
911afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL:%.*]] = call nonnull align 8 dereferenceable(16) %"class.std::complex.0"* @_ZNSt7complexIdEpLIdEERS0_RKS_IT_E(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[PARTIAL_SUM5]], %"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[REF_TMP14]]) #[[ATTR12]]
912ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP45:%.*]] = bitcast double* [[REF_TMP16]] to i8*
91353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP45]]) #[[ATTR6]]
914ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP46:%.*]] = bitcast double* [[REF_TMP15]] to i8*
91553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP46]]) #[[ATTR6]]
916ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP47:%.*]] = bitcast %"class.std::complex.0"* [[REF_TMP14]] to i8*
91753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* [[TMP47]]) #[[ATTR6]]
918207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
919207b08a9SGiorgis Georgakoudis // CHECK1: omp.body.continue:
920207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
921207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.inc:
922ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP48:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
923ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD18:%.*]] = add i32 [[TMP48]], 1
924ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD18]], i32* [[DOTOMP_IV]], align 4, !tbaa [[TBAA8]]
925207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
926207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.end:
927207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_INC:%.*]]
928207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.inc:
929ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP49:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
930ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP50:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
931ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD19:%.*]] = add i32 [[TMP49]], [[TMP50]]
932ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD19]], i32* [[DOTOMP_LB]], align 4, !tbaa [[TBAA8]]
933ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP51:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
934ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP52:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !tbaa [[TBAA8]]
935ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD20:%.*]] = add i32 [[TMP51]], [[TMP52]]
936ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD20]], i32* [[DOTOMP_UB]], align 4, !tbaa [[TBAA8]]
937207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_DISPATCH_COND]]
938207b08a9SGiorgis Georgakoudis // CHECK1: omp.dispatch.end:
939ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP53:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
940ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP54:%.*]] = load i32, i32* [[TMP53]], align 4, !tbaa [[TBAA8]]
941ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP54]])
942ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP55:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
943ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP56:%.*]] = load i32, i32* [[TMP55]], align 4, !tbaa [[TBAA8]]
944ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP57:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
945ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP58:%.*]] = bitcast %"class.std::complex.0"* [[PARTIAL_SUM5]] to i8*
946ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP58]], i8** [[TMP57]], align 8
947ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP59:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
948ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP60:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(%struct.ident_t* @[[GLOB1]], i32 [[TMP56]], i32 1, i64 8, i8* [[TMP59]], void (i8*, i16, i16, i16)* @_omp_reduction_shuffle_and_reduce_func5, void (i8*, i32)* @_omp_reduction_inter_warp_copy_func6)
949ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP61:%.*]] = icmp eq i32 [[TMP60]], 1
950ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[TMP61]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]
951207b08a9SGiorgis Georgakoudis // CHECK1: .omp.reduction.then:
952afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL21:%.*]] = call nonnull align 8 dereferenceable(16) %"class.std::complex.0"* @_ZNSt7complexIdEpLIdEERS0_RKS_IT_E(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[TMP2]], %"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[PARTIAL_SUM5]]) #[[ATTR12]]
953ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_nvptx_end_reduce_nowait(i32 [[TMP56]])
954207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]
955207b08a9SGiorgis Georgakoudis // CHECK1: .omp.reduction.done:
956ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP62:%.*]] = bitcast i32* [[I7]] to i8*
95753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP62]]) #[[ATTR6]]
958ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP63:%.*]] = bitcast %"class.std::complex.0"* [[PARTIAL_SUM5]] to i8*
95953d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* [[TMP63]]) #[[ATTR6]]
960ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP64:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
96153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP64]]) #[[ATTR6]]
962ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP65:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
96353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP65]]) #[[ATTR6]]
964ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP66:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
96553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP66]]) #[[ATTR6]]
966ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP67:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
96753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP67]]) #[[ATTR6]]
968207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_PRECOND_END]]
969207b08a9SGiorgis Georgakoudis // CHECK1: omp.precond.end:
970ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP68:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_2]] to i8*
97153d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP68]]) #[[ATTR6]]
972ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP69:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_1]] to i8*
97353d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP69]]) #[[ATTR6]]
974ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP70:%.*]] = bitcast i32* [[DOTCAPTURE_EXPR_]] to i8*
97553d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP70]]) #[[ATTR6]]
976ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP71:%.*]] = bitcast i32* [[DOTOMP_IV]] to i8*
97753d5757eSJoseph Huber // CHECK1-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP71]]) #[[ATTR6]]
978207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
979207b08a9SGiorgis Georgakoudis //
980207b08a9SGiorgis Georgakoudis //
981207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIdEpLIdEERS0_RKS_IT_E
98253d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS:%.*]], %"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[__C:%.*]]) #[[ATTR5]] comdat align 2 {
983207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
984ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
985ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__C_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
986ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[THIS]], %"class.std::complex.0"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
987ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[__C]], %"class.std::complex.0"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
988ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[THIS_ADDR]], align 8
989ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
990afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL:%.*]] = call double @_ZNKSt7complexIdE4realEv(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[TMP0]]) #[[ATTR12]]
991ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 0
9929ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP1:%.*]] = load double, double* [[__RE_]], align 8, !tbaa [[TBAA24:![0-9]+]]
993207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = fadd double [[TMP1]], [[CALL]]
9949ce02ea8SJoseph Huber // CHECK1-NEXT: store double [[ADD]], double* [[__RE_]], align 8, !tbaa [[TBAA24]]
995ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[__C_ADDR]], align 8, !tbaa [[TBAA12]]
996afb9cbb3SNikita Popov // CHECK1-NEXT: [[CALL2:%.*]] = call double @_ZNKSt7complexIdE4imagEv(%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[TMP2]]) #[[ATTR12]]
997ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 1
9989ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = load double, double* [[__IM_]], align 8, !tbaa [[TBAA26:![0-9]+]]
999207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD3:%.*]] = fadd double [[TMP3]], [[CALL2]]
10009ce02ea8SJoseph Huber // CHECK1-NEXT: store double [[ADD3]], double* [[__IM_]], align 8, !tbaa [[TBAA26]]
1001ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: ret %"class.std::complex.0"* [[THIS1]]
1002207b08a9SGiorgis Georgakoudis //
1003207b08a9SGiorgis Georgakoudis //
100468d133a3SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func5
100553d5757eSJoseph Huber // CHECK1-SAME: (i8* [[TMP0:%.*]], i16 signext [[TMP1:%.*]], i16 signext [[TMP2:%.*]], i16 signext [[TMP3:%.*]]) #[[ATTR7]] {
1006207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1007207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
1008207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2
1009207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2
1010207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2
1011207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x i8*], align 8
1012ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca %"class.std::complex.0", align 8
10139ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
10149ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP1]], i16* [[DOTADDR1]], align 2, !tbaa [[TBAA19]]
10159ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP2]], i16* [[DOTADDR2]], align 2, !tbaa [[TBAA19]]
10169ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP3]], i16* [[DOTADDR3]], align 2, !tbaa [[TBAA19]]
10179ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
1018207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
10199ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP6:%.*]] = load i16, i16* [[DOTADDR1]], align 2, !tbaa [[TBAA19]]
10209ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTADDR2]], align 2, !tbaa [[TBAA19]]
10219ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP8:%.*]] = load i16, i16* [[DOTADDR3]], align 2, !tbaa [[TBAA19]]
1022207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
10237a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %"class.std::complex.0"**
10247a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP11:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[TMP10]], align 8
10257a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0
10267a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr %"class.std::complex.0", %"class.std::complex.0"* [[TMP11]], i64 1
1027ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = bitcast %"class.std::complex.0"* [[TMP13]] to i8*
10287a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP15:%.*]] = bitcast %"class.std::complex.0"* [[TMP11]] to i64*
1029ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = bitcast %"class.std::complex.0"* [[DOTOMP_REDUCTION_ELEMENT]] to i64*
1030207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[DOTSHUFFLE_PRE_COND:%.*]]
1031207b08a9SGiorgis Georgakoudis // CHECK1: .shuffle.pre_cond:
10327cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP17:%.*]] = phi i64* [ [[TMP15]], [[ENTRY:%.*]] ], [ [[TMP29:%.*]], [[DOTSHUFFLE_THEN:%.*]] ]
10337cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP18:%.*]] = phi i64* [ [[TMP16]], [[ENTRY]] ], [ [[TMP30:%.*]], [[DOTSHUFFLE_THEN]] ]
1034207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = bitcast i64* [[TMP17]] to i8*
1035207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = ptrtoint i8* [[TMP14]] to i64
1036207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = ptrtoint i8* [[TMP19]] to i64
1037207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = sub i64 [[TMP20]], [[TMP21]]
1038207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = sdiv exact i64 [[TMP22]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
1039207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = icmp sgt i64 [[TMP23]], 7
1040207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[TMP24]], label [[DOTSHUFFLE_THEN]], label [[DOTSHUFFLE_EXIT:%.*]]
1041207b08a9SGiorgis Georgakoudis // CHECK1: .shuffle.then:
1042207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = load i64, i64* [[TMP17]], align 8
10437cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_get_warp_size()
10447cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i16
10457cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP28:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP25]], i16 [[TMP7]], i16 [[TMP27]])
10467cdaa5a9SJoseph Huber // CHECK1-NEXT: store i64 [[TMP28]], i64* [[TMP18]], align 8
10477cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP29]] = getelementptr i64, i64* [[TMP17]], i64 1
10487cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP30]] = getelementptr i64, i64* [[TMP18]], i64 1
1049207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[DOTSHUFFLE_PRE_COND]]
1050207b08a9SGiorgis Georgakoudis // CHECK1: .shuffle.exit:
10517cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP31:%.*]] = bitcast %"class.std::complex.0"* [[DOTOMP_REDUCTION_ELEMENT]] to i8*
10527a2e12e0SNikita Popov // CHECK1-NEXT: store i8* [[TMP31]], i8** [[TMP12]], align 8, !tbaa [[TBAA12]]
10537cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP32:%.*]] = icmp eq i16 [[TMP8]], 0
10547cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP33:%.*]] = icmp eq i16 [[TMP8]], 1
10557cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP34:%.*]] = icmp ult i16 [[TMP6]], [[TMP7]]
10567cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP35:%.*]] = and i1 [[TMP33]], [[TMP34]]
10577cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP8]], 2
10587cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP37:%.*]] = and i16 [[TMP6]], 1
10597cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP38:%.*]] = icmp eq i16 [[TMP37]], 0
10607cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP39:%.*]] = and i1 [[TMP36]], [[TMP38]]
10617cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP40:%.*]] = icmp sgt i16 [[TMP7]], 0
10627cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP41:%.*]] = and i1 [[TMP39]], [[TMP40]]
10637cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP42:%.*]] = or i1 [[TMP32]], [[TMP35]]
10647cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP43:%.*]] = or i1 [[TMP42]], [[TMP41]]
10657cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP43]], label [[THEN:%.*]], label [[ELSE:%.*]]
1066207b08a9SGiorgis Georgakoudis // CHECK1: then:
10677cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP44:%.*]] = bitcast [1 x i8*]* [[TMP5]] to i8*
10687cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP45:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]] to i8*
106953d5757eSJoseph Huber // CHECK1-NEXT: call void @"_omp$reduction$reduction_func4"(i8* [[TMP44]], i8* [[TMP45]]) #[[ATTR6]]
1070207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT:%.*]]
1071207b08a9SGiorgis Georgakoudis // CHECK1: else:
1072207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT]]
1073207b08a9SGiorgis Georgakoudis // CHECK1: ifcont:
10747cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP46:%.*]] = icmp eq i16 [[TMP8]], 1
10757cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP47:%.*]] = icmp uge i16 [[TMP6]], [[TMP7]]
10767cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP48:%.*]] = and i1 [[TMP46]], [[TMP47]]
10777cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP48]], label [[THEN4:%.*]], label [[ELSE5:%.*]]
1078207b08a9SGiorgis Georgakoudis // CHECK1: then4:
10797cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP49:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0
10807a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP50:%.*]] = bitcast i8** [[TMP49]] to %"class.std::complex.0"**
10817a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP51:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[TMP50]], align 8
10827a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP52:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
10837a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP53:%.*]] = bitcast i8** [[TMP52]] to %"class.std::complex.0"**
10847a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP54:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[TMP53]], align 8
10857cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP55:%.*]] = bitcast %"class.std::complex.0"* [[TMP54]] to i8*
10867a2e12e0SNikita Popov // CHECK1-NEXT: [[TMP56:%.*]] = bitcast %"class.std::complex.0"* [[TMP51]] to i8*
10877cdaa5a9SJoseph Huber // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP55]], i8* align 8 [[TMP56]], i64 16, i1 false), !tbaa.struct !27
1088207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT6:%.*]]
1089207b08a9SGiorgis Georgakoudis // CHECK1: else5:
1090207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT6]]
1091207b08a9SGiorgis Georgakoudis // CHECK1: ifcont6:
1092207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
1093207b08a9SGiorgis Georgakoudis //
1094207b08a9SGiorgis Georgakoudis //
109568d133a3SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func6
109653d5757eSJoseph Huber // CHECK1-SAME: (i8* [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR7]] {
1097207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1098207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
1099207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
1100207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 4
1101e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
11029ce02ea8SJoseph Huber // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8, !tbaa [[TBAA12]]
11039ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
11047cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
11057cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
11067cdaa5a9SJoseph Huber // CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31
11077cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()
11087cdaa5a9SJoseph Huber // CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5
11097cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP6:%.*]] = load i8*, i8** [[DOTADDR]], align 8
11107cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to [1 x i8*]*
11119ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 0, i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
1112207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[PRECOND:%.*]]
1113207b08a9SGiorgis Georgakoudis // CHECK1: precond:
11147cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
11157cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP9:%.*]] = icmp ult i32 [[TMP8]], 4
11167cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[TMP9]], label [[BODY:%.*]], label [[EXIT:%.*]]
1117207b08a9SGiorgis Georgakoudis // CHECK1: body:
1118207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4]], i32 [[TMP2]])
1119207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0
1120207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]
1121207b08a9SGiorgis Georgakoudis // CHECK1: then:
11227cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0
11237cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP11:%.*]] = load i8*, i8** [[TMP10]], align 8, !tbaa [[TBAA12]]
11247cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP12:%.*]] = bitcast i8* [[TMP11]] to i32*
11257cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr i32, i32* [[TMP12]], i32 [[TMP8]]
11267cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]
11277cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP13]], align 4
11287cdaa5a9SJoseph Huber // CHECK1-NEXT: store volatile i32 [[TMP15]], i32 addrspace(3)* [[TMP14]], align 4
1129207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT:%.*]]
1130207b08a9SGiorgis Georgakoudis // CHECK1: else:
1131207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[IFCONT]]
1132207b08a9SGiorgis Georgakoudis // CHECK1: ifcont:
1133207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4]], i32 [[TMP2]])
11347cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
11357cdaa5a9SJoseph Huber // CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP16]]
11367cdaa5a9SJoseph Huber // CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]
1137737c4a26SAtmn Patel // CHECK1: then2:
11387cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]
11397cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0
11407cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP19:%.*]] = load i8*, i8** [[TMP18]], align 8, !tbaa [[TBAA12]]
11417cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP20:%.*]] = bitcast i8* [[TMP19]] to i32*
11427cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i32, i32* [[TMP20]], i32 [[TMP8]]
11437cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP22:%.*]] = load volatile i32, i32 addrspace(3)* [[TMP17]], align 4, !tbaa [[TBAA8]]
11447cdaa5a9SJoseph Huber // CHECK1-NEXT: store i32 [[TMP22]], i32* [[TMP21]], align 4, !tbaa [[TBAA8]]
11457cdaa5a9SJoseph Huber // CHECK1-NEXT: br label [[IFCONT4:%.*]]
1146737c4a26SAtmn Patel // CHECK1: else3:
11477cdaa5a9SJoseph Huber // CHECK1-NEXT: br label [[IFCONT4]]
1148737c4a26SAtmn Patel // CHECK1: ifcont4:
11497cdaa5a9SJoseph Huber // CHECK1-NEXT: [[TMP23:%.*]] = add nsw i32 [[TMP8]], 1
11507cdaa5a9SJoseph Huber // CHECK1-NEXT: store i32 [[TMP23]], i32* [[DOTCNT_ADDR]], align 4, !tbaa [[TBAA8]]
1151207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[PRECOND]]
1152207b08a9SGiorgis Georgakoudis // CHECK1: exit:
1153207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
1154207b08a9SGiorgis Georgakoudis //
1155207b08a9SGiorgis Georgakoudis //
115668d133a3SJoseph Huber // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__3_wrapper
115753d5757eSJoseph Huber // CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR7]] {
1158207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1159207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2
1160207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4
1161207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4
1162207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8
11639ce02ea8SJoseph Huber // CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2, !tbaa [[TBAA19]]
11649ce02ea8SJoseph Huber // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4, !tbaa [[TBAA8]]
1165f7de6962Shsmahesha // CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4
1166207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]])
1167207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8**, i8*** [[GLOBAL_ARGS]], align 8
1168207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 0
1169ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8** [[TMP3]] to i32**
1170ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[TMP4]], align 8, !tbaa [[TBAA12]]
1171ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 1
1172ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32**
1173ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = load i32*, i32** [[TMP7]], align 8, !tbaa [[TBAA12]]
1174ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds i8*, i8** [[TMP2]], i64 2
1175ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %"class.std::complex.0"**
1176ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[TMP10]], align 8, !tbaa [[TBAA12]]
117753d5757eSJoseph Huber // CHECK1-NEXT: call void @__omp_outlined__3(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]], i32* [[TMP5]], i32* [[TMP8]], %"class.std::complex.0"* [[TMP11]]) #[[ATTR6]]
1178207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
1179207b08a9SGiorgis Georgakoudis //
1180207b08a9SGiorgis Georgakoudis //
1181207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIfEC2ERKfS2_
118253d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS:%.*]], float* nonnull align 4 dereferenceable(4) [[__RE:%.*]], float* nonnull align 4 dereferenceable(4) [[__IM:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
1183207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1184207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
1185207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_ADDR:%.*]] = alloca float*, align 8
1186207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_ADDR:%.*]] = alloca float*, align 8
11879ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[THIS]], %"class.std::complex"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
11889ce02ea8SJoseph Huber // CHECK1-NEXT: store float* [[__RE]], float** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
11899ce02ea8SJoseph Huber // CHECK1-NEXT: store float* [[__IM]], float** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
1190207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[THIS_ADDR]], align 8
1191207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 0
11929ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load float*, float** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
11939ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP1:%.*]] = load float, float* [[TMP0]], align 4, !tbaa [[TBAA14]]
11949ce02ea8SJoseph Huber // CHECK1-NEXT: store float [[TMP1]], float* [[__RE_]], align 4, !tbaa [[TBAA16]]
1195207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 1
11969ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP2:%.*]] = load float*, float** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
11979ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = load float, float* [[TMP2]], align 4, !tbaa [[TBAA14]]
11989ce02ea8SJoseph Huber // CHECK1-NEXT: store float [[TMP3]], float* [[__IM_]], align 4, !tbaa [[TBAA18]]
1199207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
1200207b08a9SGiorgis Georgakoudis //
1201207b08a9SGiorgis Georgakoudis //
1202207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNKSt7complexIfE4realEv
120353d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) #[[ATTR5]] comdat align 2 {
1204207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1205207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
12069ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[THIS]], %"class.std::complex"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
1207207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[THIS_ADDR]], align 8
1208207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 0
12099ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[__RE_]], align 4, !tbaa [[TBAA16]]
1210207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret float [[TMP0]]
1211207b08a9SGiorgis Georgakoudis //
1212207b08a9SGiorgis Georgakoudis //
1213207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNKSt7complexIfE4imagEv
121453d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex"* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) #[[ATTR5]] comdat align 2 {
1215207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1216207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex"*, align 8
12179ce02ea8SJoseph Huber // CHECK1-NEXT: store %"class.std::complex"* [[THIS]], %"class.std::complex"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
1218207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex"*, %"class.std::complex"** [[THIS_ADDR]], align 8
1219207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex", %"class.std::complex"* [[THIS1]], i32 0, i32 1
12209ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load float, float* [[__IM_]], align 4, !tbaa [[TBAA18]]
1221207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret float [[TMP0]]
1222207b08a9SGiorgis Georgakoudis //
1223207b08a9SGiorgis Georgakoudis //
1224207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNSt7complexIdEC2ERKdS2_
122553d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS:%.*]], double* nonnull align 8 dereferenceable(8) [[__RE:%.*]], double* nonnull align 8 dereferenceable(8) [[__IM:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
1226207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1227ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
1228207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_ADDR:%.*]] = alloca double*, align 8
1229207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_ADDR:%.*]] = alloca double*, align 8
1230ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[THIS]], %"class.std::complex.0"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
12319ce02ea8SJoseph Huber // CHECK1-NEXT: store double* [[__RE]], double** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
12329ce02ea8SJoseph Huber // CHECK1-NEXT: store double* [[__IM]], double** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
1233ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[THIS_ADDR]], align 8
1234ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 0
12359ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load double*, double** [[__RE_ADDR]], align 8, !tbaa [[TBAA12]]
12369ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP1:%.*]] = load double, double* [[TMP0]], align 8, !tbaa [[TBAA22]]
12379ce02ea8SJoseph Huber // CHECK1-NEXT: store double [[TMP1]], double* [[__RE_]], align 8, !tbaa [[TBAA24]]
1238ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 1
12399ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP2:%.*]] = load double*, double** [[__IM_ADDR]], align 8, !tbaa [[TBAA12]]
12409ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP3:%.*]] = load double, double* [[TMP2]], align 8, !tbaa [[TBAA22]]
12419ce02ea8SJoseph Huber // CHECK1-NEXT: store double [[TMP3]], double* [[__IM_]], align 8, !tbaa [[TBAA26]]
1242207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void
1243207b08a9SGiorgis Georgakoudis //
1244207b08a9SGiorgis Georgakoudis //
1245207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNKSt7complexIdE4realEv
124653d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR5]] comdat align 2 {
1247207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1248ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
1249ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[THIS]], %"class.std::complex.0"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
1250ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[THIS_ADDR]], align 8
1251ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__RE_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 0
12529ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load double, double* [[__RE_]], align 8, !tbaa [[TBAA24]]
1253207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret double [[TMP0]]
1254207b08a9SGiorgis Georgakoudis //
1255207b08a9SGiorgis Georgakoudis //
1256207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZNKSt7complexIdE4imagEv
125753d5757eSJoseph Huber // CHECK1-SAME: (%"class.std::complex.0"* nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR5]] comdat align 2 {
1258207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry:
1259ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %"class.std::complex.0"*, align 8
1260ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: store %"class.std::complex.0"* [[THIS]], %"class.std::complex.0"** [[THIS_ADDR]], align 8, !tbaa [[TBAA12]]
1261ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %"class.std::complex.0"*, %"class.std::complex.0"** [[THIS_ADDR]], align 8
1262ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[__IM_:%.*]] = getelementptr inbounds %"class.std::complex.0", %"class.std::complex.0"* [[THIS1]], i32 0, i32 1
12639ce02ea8SJoseph Huber // CHECK1-NEXT: [[TMP0:%.*]] = load double, double* [[__IM_]], align 8, !tbaa [[TBAA26]]
1264207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret double [[TMP0]]
1265207b08a9SGiorgis Georgakoudis //
1266