1*d7c69c20SDavid Pagan // 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 _ 2*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK1 3*d7c69c20SDavid Pagan 4*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 5*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1 6*d7c69c20SDavid Pagan 7*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 8*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK4 9*d7c69c20SDavid Pagan 10*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK5 11*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK6 12*d7c69c20SDavid Pagan 13*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 14*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 15*d7c69c20SDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 16*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 17*d7c69c20SDavid Pagan // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 18*d7c69c20SDavid Pagan // expected-no-diagnostics 19*d7c69c20SDavid Pagan 20*d7c69c20SDavid Pagan typedef void **omp_allocator_handle_t; 21*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_null_allocator; 22*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_default_mem_alloc; 23*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_large_cap_mem_alloc; 24*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_const_mem_alloc; 25*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_high_bw_mem_alloc; 26*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_low_lat_mem_alloc; 27*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_cgroup_mem_alloc; 28*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_pteam_mem_alloc; 29*d7c69c20SDavid Pagan extern const omp_allocator_handle_t omp_thread_mem_alloc; 30*d7c69c20SDavid Pagan 31*d7c69c20SDavid Pagan #ifndef ARRAY 32*d7c69c20SDavid Pagan #ifndef HEADER 33*d7c69c20SDavid Pagan #define HEADER 34*d7c69c20SDavid Pagan 35*d7c69c20SDavid Pagan class TestClass { 36*d7c69c20SDavid Pagan public: 37*d7c69c20SDavid Pagan int a; 38*d7c69c20SDavid Pagan TestClass() : a(0) {} 39*d7c69c20SDavid Pagan TestClass(const TestClass &C) : a(C.a) {} 40*d7c69c20SDavid Pagan TestClass &operator=(const TestClass &) { return *this;} 41*d7c69c20SDavid Pagan ~TestClass(){}; 42*d7c69c20SDavid Pagan }; 43*d7c69c20SDavid Pagan 44*d7c69c20SDavid Pagan 45*d7c69c20SDavid Pagan TestClass tc; 46*d7c69c20SDavid Pagan TestClass tc2[2]; 47*d7c69c20SDavid Pagan 48*d7c69c20SDavid Pagan void foo() { extern void mayThrow(); mayThrow(); } 49*d7c69c20SDavid Pagan 50*d7c69c20SDavid Pagan struct SS { 51*d7c69c20SDavid Pagan int e; 52*d7c69c20SDavid Pagan int a; 53*d7c69c20SDavid Pagan int b : 4; 54*d7c69c20SDavid Pagan int &c; 55*d7c69c20SDavid Pagan SS(int &d) : a(0), b(0), c(d) { 56*d7c69c20SDavid Pagan #pragma omp scope private(a, this->b, (this)->c) allocate(omp_default_mem_alloc:b) nowait 57*d7c69c20SDavid Pagan [&]() { 58*d7c69c20SDavid Pagan ++this->a, --b, (this)->c /= 1; 59*d7c69c20SDavid Pagan #pragma omp parallel num_threads(b) 60*d7c69c20SDavid Pagan #pragma omp scope firstprivate(a, this->b, (this)->c) reduction(+:e) 61*d7c69c20SDavid Pagan ++(this)->a, e+=1, this->c /= 1; 62*d7c69c20SDavid Pagan }(); 63*d7c69c20SDavid Pagan } 64*d7c69c20SDavid Pagan }; 65*d7c69c20SDavid Pagan 66*d7c69c20SDavid Pagan template<typename T> 67*d7c69c20SDavid Pagan struct SST { 68*d7c69c20SDavid Pagan T a; 69*d7c69c20SDavid Pagan SST() : a(T()) { 70*d7c69c20SDavid Pagan #pragma omp target teams 71*d7c69c20SDavid Pagan #pragma omp parallel firstprivate(a) 72*d7c69c20SDavid Pagan #pragma omp scope private(this->a) 73*d7c69c20SDavid Pagan [&]() { 74*d7c69c20SDavid Pagan [&]() { 75*d7c69c20SDavid Pagan int c; 76*d7c69c20SDavid Pagan ++this->a; 77*d7c69c20SDavid Pagan #pragma omp parallel firstprivate(a) 78*d7c69c20SDavid Pagan #pragma omp scope private((this)->a) allocate(omp_cgroup_mem_alloc:a) 79*d7c69c20SDavid Pagan ++(this)->a; 80*d7c69c20SDavid Pagan }(); 81*d7c69c20SDavid Pagan }(); 82*d7c69c20SDavid Pagan } 83*d7c69c20SDavid Pagan }; 84*d7c69c20SDavid Pagan 85*d7c69c20SDavid Pagan int main() { 86*d7c69c20SDavid Pagan char a; 87*d7c69c20SDavid Pagan char a2[2]; 88*d7c69c20SDavid Pagan TestClass &c = tc; 89*d7c69c20SDavid Pagan SST<double> sst; 90*d7c69c20SDavid Pagan SS ss(c.a); 91*d7c69c20SDavid Pagan 92*d7c69c20SDavid Pagan #pragma omp scope nowait 93*d7c69c20SDavid Pagan a = 2; 94*d7c69c20SDavid Pagan #pragma omp scope 95*d7c69c20SDavid Pagan a = 2; 96*d7c69c20SDavid Pagan #pragma omp scope firstprivate(a,c, tc) private(a2, tc2) 97*d7c69c20SDavid Pagan foo(); 98*d7c69c20SDavid Pagan return a; 99*d7c69c20SDavid Pagan } 100*d7c69c20SDavid Pagan 101*d7c69c20SDavid Pagan 102*d7c69c20SDavid Pagan void parallel_single() { 103*d7c69c20SDavid Pagan #pragma omp parallel 104*d7c69c20SDavid Pagan #pragma omp scope 105*d7c69c20SDavid Pagan foo(); 106*d7c69c20SDavid Pagan } 107*d7c69c20SDavid Pagan #endif 108*d7c69c20SDavid Pagan #else 109*d7c69c20SDavid Pagan struct St { 110*d7c69c20SDavid Pagan int a, b; 111*d7c69c20SDavid Pagan St() : a(0), b(0) {} 112*d7c69c20SDavid Pagan St &operator=(const St &) { return *this; }; 113*d7c69c20SDavid Pagan ~St() {} 114*d7c69c20SDavid Pagan }; 115*d7c69c20SDavid Pagan 116*d7c69c20SDavid Pagan void array_func(int n, int a[n], St s[2]) { 117*d7c69c20SDavid Pagan int b,c; 118*d7c69c20SDavid Pagan #pragma omp scope nowait firstprivate(b) allocate(omp_high_bw_mem_alloc:c) private(a,s) reduction(*:c) 119*d7c69c20SDavid Pagan ; 120*d7c69c20SDavid Pagan } 121*d7c69c20SDavid Pagan 122*d7c69c20SDavid Pagan int main() { 123*d7c69c20SDavid Pagan int n; 124*d7c69c20SDavid Pagan int a[10]; 125*d7c69c20SDavid Pagan St s[2]; 126*d7c69c20SDavid Pagan 127*d7c69c20SDavid Pagan array_func(n, a, s); 128*d7c69c20SDavid Pagan return 0; 129*d7c69c20SDavid Pagan } 130*d7c69c20SDavid Pagan #endif 131*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init 132*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0:[0-9]+]] { 133*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 134*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc) 135*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]] 136*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 137*d7c69c20SDavid Pagan // 138*d7c69c20SDavid Pagan // 139*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev 140*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 { 141*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 142*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 143*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 144*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 145*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) 146*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 147*d7c69c20SDavid Pagan // 148*d7c69c20SDavid Pagan // 149*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev 150*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 { 151*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 152*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 153*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 154*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 155*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]] 156*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 157*d7c69c20SDavid Pagan // 158*d7c69c20SDavid Pagan // 159*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev 160*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 161*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 162*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 163*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 164*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 165*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0 166*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 0, ptr [[A]], align 4 167*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 168*d7c69c20SDavid Pagan // 169*d7c69c20SDavid Pagan // 170*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev 171*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 172*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 173*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 174*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 175*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 176*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 177*d7c69c20SDavid Pagan // 178*d7c69c20SDavid Pagan // 179*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1 180*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 { 181*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 182*d7c69c20SDavid Pagan // CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8 183*d7c69c20SDavid Pagan // CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4 184*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 185*d7c69c20SDavid Pagan // CHECK1: arrayctor.loop: 186*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ] 187*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 188*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]] 189*d7c69c20SDavid Pagan // CHECK1: invoke.cont: 190*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1 191*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2) 192*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 193*d7c69c20SDavid Pagan // CHECK1: arrayctor.cont: 194*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]] 195*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 196*d7c69c20SDavid Pagan // CHECK1: lpad: 197*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 } 198*d7c69c20SDavid Pagan // CHECK1-NEXT: cleanup 199*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0 200*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8 201*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1 202*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4 203*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]] 204*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]] 205*d7c69c20SDavid Pagan // CHECK1: arraydestroy.body: 206*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 207*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 208*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 209*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2 210*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]] 211*d7c69c20SDavid Pagan // CHECK1: arraydestroy.done1: 212*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[EH_RESUME:%.*]] 213*d7c69c20SDavid Pagan // CHECK1: eh.resume: 214*d7c69c20SDavid Pagan // CHECK1-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8 215*d7c69c20SDavid Pagan // CHECK1-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4 216*d7c69c20SDavid Pagan // CHECK1-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0 217*d7c69c20SDavid Pagan // CHECK1-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1 218*d7c69c20SDavid Pagan // CHECK1-NEXT: resume { ptr, i32 } [[LPAD_VAL2]] 219*d7c69c20SDavid Pagan // 220*d7c69c20SDavid Pagan // 221*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_array_dtor 222*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] { 223*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 224*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 225*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 226*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 227*d7c69c20SDavid Pagan // CHECK1: arraydestroy.body: 228*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 229*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 230*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 231*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2 232*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]] 233*d7c69c20SDavid Pagan // CHECK1: arraydestroy.done1: 234*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 235*d7c69c20SDavid Pagan // 236*d7c69c20SDavid Pagan // 237*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z3foov 238*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR1]] { 239*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 240*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_Z8mayThrowv() 241*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 242*d7c69c20SDavid Pagan // 243*d7c69c20SDavid Pagan // 244*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@main 245*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 { 246*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 247*d7c69c20SDavid Pagan // CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 248*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A:%.*]] = alloca i8, align 1 249*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A2:%.*]] = alloca [2 x i8], align 1 250*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C:%.*]] = alloca ptr, align 8 251*d7c69c20SDavid Pagan // CHECK1-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8 252*d7c69c20SDavid Pagan // CHECK1-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8 253*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A1:%.*]] = alloca i8, align 1 254*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4 255*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 256*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4 257*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A24:%.*]] = alloca [2 x i8], align 1 258*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4 259*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]) 260*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4 261*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr @tc, ptr [[C]], align 8 262*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]]) 263*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 264*d7c69c20SDavid Pagan // CHECK1-NEXT: store i8 2, ptr [[A]], align 1 265*d7c69c20SDavid Pagan // CHECK1-NEXT: store i8 2, ptr [[A]], align 1 266*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]]) 267*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = load i8, ptr [[A]], align 1 268*d7c69c20SDavid Pagan // CHECK1-NEXT: store i8 [[TMP1]], ptr [[A1]], align 1 269*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 270*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 271*d7c69c20SDavid Pagan // CHECK1: invoke.cont: 272*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C2]], ptr [[TMP]], align 8 273*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 274*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]] 275*d7c69c20SDavid Pagan // CHECK1: invoke.cont3: 276*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0 277*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2 278*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 279*d7c69c20SDavid Pagan // CHECK1: arrayctor.loop: 280*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ] 281*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 282*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]] 283*d7c69c20SDavid Pagan // CHECK1: invoke.cont5: 284*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1 285*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 286*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 287*d7c69c20SDavid Pagan // CHECK1: arrayctor.cont: 288*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_Z3foov() 289*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]] 290*d7c69c20SDavid Pagan // CHECK1: invoke.cont6: 291*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0 292*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2 293*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 294*d7c69c20SDavid Pagan // CHECK1: arraydestroy.body: 295*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 296*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 297*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 298*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]] 299*d7c69c20SDavid Pagan // CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]] 300*d7c69c20SDavid Pagan // CHECK1: arraydestroy.done8: 301*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]] 302*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]] 303*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP0]]) 304*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = load i8, ptr [[A]], align 1 305*d7c69c20SDavid Pagan // CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP3]] to i32 306*d7c69c20SDavid Pagan // CHECK1-NEXT: ret i32 [[CONV]] 307*d7c69c20SDavid Pagan // CHECK1: terminate.lpad: 308*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } 309*d7c69c20SDavid Pagan // CHECK1-NEXT: catch ptr null 310*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0 311*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]] 312*d7c69c20SDavid Pagan // CHECK1-NEXT: unreachable 313*d7c69c20SDavid Pagan // 314*d7c69c20SDavid Pagan // 315*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev 316*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 317*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 318*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 319*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 320*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 321*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]]) 322*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 323*d7c69c20SDavid Pagan // 324*d7c69c20SDavid Pagan // 325*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC1ERi 326*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 327*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 328*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 329*d7c69c20SDavid Pagan // CHECK1-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 330*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 331*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 332*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 333*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 334*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 335*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 336*d7c69c20SDavid Pagan // 337*d7c69c20SDavid Pagan // 338*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_ 339*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 340*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 341*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 342*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 343*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 344*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 345*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 346*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8 347*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 348*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 349*d7c69c20SDavid Pagan // 350*d7c69c20SDavid Pagan // 351*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate 352*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat { 353*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] 354*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @_ZSt9terminatev() #[[ATTR10]] 355*d7c69c20SDavid Pagan // CHECK1-NEXT: unreachable 356*d7c69c20SDavid Pagan // 357*d7c69c20SDavid Pagan // 358*d7c69c20SDavid Pagan // 359*d7c69c20SDavid Pagan // 360*d7c69c20SDavid Pagan // 361*d7c69c20SDavid Pagan // 362*d7c69c20SDavid Pagan // 363*d7c69c20SDavid Pagan // 364*d7c69c20SDavid Pagan // 365*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC2ERi 366*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 personality ptr @__gxx_personality_v0 { 367*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 368*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 369*d7c69c20SDavid Pagan // CHECK1-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 370*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A2:%.*]] = alloca i32, align 4 371*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 372*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C3:%.*]] = alloca i32, align 4 373*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 374*d7c69c20SDavid Pagan // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 375*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 376*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 377*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 378*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 379*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1 380*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 0, ptr [[A]], align 4 381*d7c69c20SDavid Pagan // CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2 382*d7c69c20SDavid Pagan // CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8 383*d7c69c20SDavid Pagan // CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 384*d7c69c20SDavid Pagan // CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 385*d7c69c20SDavid Pagan // CHECK1-NEXT: store i8 [[BF_SET]], ptr [[B]], align 8 386*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3 387*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8 388*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP1]], ptr [[C]], align 8 389*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[A2]], ptr [[TMP]], align 8 390*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8 391*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]]) 392*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C3]], ptr [[_TMP4]], align 8 393*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 394*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS1]], ptr [[TMP3]], align 8 395*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 396*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8 397*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP5]], ptr [[TMP4]], align 8 398*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2 399*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8 400*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3 401*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8 402*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 403*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) 404*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 405*d7c69c20SDavid Pagan // CHECK1: invoke.cont: 406*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8 407*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]]) 408*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 409*d7c69c20SDavid Pagan // CHECK1: terminate.lpad: 410*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP10:%.*]] = landingpad { ptr, i32 } 411*d7c69c20SDavid Pagan // CHECK1-NEXT: catch ptr null 412*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0 413*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]] 414*d7c69c20SDavid Pagan // CHECK1-NEXT: unreachable 415*d7c69c20SDavid Pagan // 416*d7c69c20SDavid Pagan // 417*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv 418*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 { 419*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 420*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 421*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 422*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 423*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 424*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 425*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8 426*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 427*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8 428*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 429*d7c69c20SDavid Pagan // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1 430*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[INC]], ptr [[TMP4]], align 4 431*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 432*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 433*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 434*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP8]], -1 435*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[DEC]], ptr [[TMP7]], align 4 436*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3 437*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8 438*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 439*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 1 440*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 4 441*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 442*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8 443*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4 444*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP14]]) 445*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 446*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8 447*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 448*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8 449*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3 450*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 451*d7c69c20SDavid Pagan // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]]) 452*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 453*d7c69c20SDavid Pagan // 454*d7c69c20SDavid Pagan // 455*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined 456*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8:[0-9]+]] { 457*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 458*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 459*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 460*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 461*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 462*d7c69c20SDavid Pagan // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8 463*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 464*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 465*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 466*d7c69c20SDavid Pagan // CHECK1-NEXT: [[E:%.*]] = alloca ptr, align 8 467*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP3:%.*]] = alloca ptr, align 8 468*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 469*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 8 470*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A6:%.*]] = alloca i32, align 4 471*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP7:%.*]] = alloca ptr, align 8 472*d7c69c20SDavid Pagan // CHECK1-NEXT: [[B8:%.*]] = alloca i32, align 4 473*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C9:%.*]] = alloca i32, align 4 474*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP10:%.*]] = alloca ptr, align 8 475*d7c69c20SDavid Pagan // CHECK1-NEXT: [[E11:%.*]] = alloca i32, align 4 476*d7c69c20SDavid Pagan // CHECK1-NEXT: [[_TMP12:%.*]] = alloca ptr, align 8 477*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8 478*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 479*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 480*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 481*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8 482*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8 483*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 484*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 485*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8 486*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8 487*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8 488*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8 489*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP3]], ptr [[_TMP1]], align 8 490*d7c69c20SDavid Pagan // CHECK1-NEXT: [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0 491*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[E2]], ptr [[E]], align 8 492*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8 493*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP4]], ptr [[_TMP3]], align 8 494*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[E]], align 8 495*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP5]], ptr [[_TMP4]], align 8 496*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8 497*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP6]], ptr [[_TMP5]], align 8 498*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8 499*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 500*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[TMP8]], ptr [[A6]], align 4 501*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[A6]], ptr [[_TMP7]], align 8 502*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4 503*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[TMP9]], ptr [[B8]], align 4 504*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8 505*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 506*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[TMP11]], ptr [[C9]], align 4 507*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C9]], ptr [[_TMP10]], align 8 508*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8 509*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 0, ptr [[E11]], align 4 510*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[E11]], ptr [[_TMP12]], align 8 511*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8 512*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4 513*d7c69c20SDavid Pagan // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP14]], 1 514*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[INC]], ptr [[TMP13]], align 4 515*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8 516*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4 517*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], 1 518*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[ADD]], ptr [[TMP15]], align 4 519*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8 520*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 521*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP18]], 1 522*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[DIV]], ptr [[TMP17]], align 4 523*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 524*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[E11]], ptr [[TMP19]], align 8 525*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 526*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 527*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var) 528*d7c69c20SDavid Pagan // CHECK1-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 529*d7c69c20SDavid Pagan // CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 530*d7c69c20SDavid Pagan // CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 531*d7c69c20SDavid Pagan // CHECK1-NEXT: ] 532*d7c69c20SDavid Pagan // CHECK1: .omp.reduction.case1: 533*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4 534*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[E11]], align 4 535*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]] 536*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[ADD13]], ptr [[TMP12]], align 4 537*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var) 538*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 539*d7c69c20SDavid Pagan // CHECK1: .omp.reduction.case2: 540*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[E11]], align 4 541*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4 542*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var) 543*d7c69c20SDavid Pagan // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 544*d7c69c20SDavid Pagan // CHECK1: .omp.reduction.default: 545*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP21]]) 546*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 547*d7c69c20SDavid Pagan // 548*d7c69c20SDavid Pagan // 549*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func 550*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] { 551*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 552*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 553*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 554*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 555*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 556*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 557*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 558*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 559*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 560*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 561*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 562*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 563*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4 564*d7c69c20SDavid Pagan // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]] 565*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[ADD]], ptr [[TMP7]], align 4 566*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 567*d7c69c20SDavid Pagan // 568*d7c69c20SDavid Pagan // 569*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_ 570*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 571*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 572*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 573*d7c69c20SDavid Pagan // CHECK1-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 574*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 575*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 576*d7c69c20SDavid Pagan // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 577*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0 578*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8 579*d7c69c20SDavid Pagan // CHECK1-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0 580*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[A2]], align 4 581*d7c69c20SDavid Pagan // CHECK1-NEXT: store i32 [[TMP1]], ptr [[A]], align 4 582*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 583*d7c69c20SDavid Pagan // 584*d7c69c20SDavid Pagan // 585*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev 586*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR2]] { 587*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 588*d7c69c20SDavid Pagan // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @_Z15parallel_singlev.omp_outlined) 589*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 590*d7c69c20SDavid Pagan // 591*d7c69c20SDavid Pagan // 592*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined 593*d7c69c20SDavid Pagan // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 { 594*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 595*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 596*d7c69c20SDavid Pagan // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 597*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 598*d7c69c20SDavid Pagan // CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 599*d7c69c20SDavid Pagan // CHECK1-NEXT: invoke void @_Z3foov() 600*d7c69c20SDavid Pagan // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 601*d7c69c20SDavid Pagan // CHECK1: invoke.cont: 602*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 603*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 604*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP1]]) 605*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 606*d7c69c20SDavid Pagan // CHECK1: terminate.lpad: 607*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 } 608*d7c69c20SDavid Pagan // CHECK1-NEXT: catch ptr null 609*d7c69c20SDavid Pagan // CHECK1-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0 610*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]] 611*d7c69c20SDavid Pagan // CHECK1-NEXT: unreachable 612*d7c69c20SDavid Pagan // 613*d7c69c20SDavid Pagan // 614*d7c69c20SDavid Pagan // CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp 615*d7c69c20SDavid Pagan // CHECK1-SAME: () #[[ATTR0]] { 616*d7c69c20SDavid Pagan // CHECK1-NEXT: entry: 617*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__cxx_global_var_init() 618*d7c69c20SDavid Pagan // CHECK1-NEXT: call void @__cxx_global_var_init.1() 619*d7c69c20SDavid Pagan // CHECK1-NEXT: ret void 620*d7c69c20SDavid Pagan // 621*d7c69c20SDavid Pagan // 622*d7c69c20SDavid Pagan // 623*d7c69c20SDavid Pagan // 624*d7c69c20SDavid Pagan // 625*d7c69c20SDavid Pagan // 626*d7c69c20SDavid Pagan // 627*d7c69c20SDavid Pagan // 628*d7c69c20SDavid Pagan // 629*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init 630*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0:[0-9]+]] { 631*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 632*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc) 633*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]] 634*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 635*d7c69c20SDavid Pagan // 636*d7c69c20SDavid Pagan // 637*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev 638*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 { 639*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 640*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 641*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 642*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 643*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) 644*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 645*d7c69c20SDavid Pagan // 646*d7c69c20SDavid Pagan // 647*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev 648*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 { 649*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 650*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 651*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 652*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 653*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]] 654*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 655*d7c69c20SDavid Pagan // 656*d7c69c20SDavid Pagan // 657*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev 658*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 659*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 660*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 661*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 662*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 663*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0 664*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 0, ptr [[A]], align 4 665*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 666*d7c69c20SDavid Pagan // 667*d7c69c20SDavid Pagan // 668*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev 669*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 670*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 671*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 672*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 673*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 674*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 675*d7c69c20SDavid Pagan // 676*d7c69c20SDavid Pagan // 677*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.1 678*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 { 679*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 680*d7c69c20SDavid Pagan // CHECK4-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8 681*d7c69c20SDavid Pagan // CHECK4-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4 682*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 683*d7c69c20SDavid Pagan // CHECK4: arrayctor.loop: 684*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ] 685*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 686*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]] 687*d7c69c20SDavid Pagan // CHECK4: invoke.cont: 688*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1 689*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2) 690*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 691*d7c69c20SDavid Pagan // CHECK4: arrayctor.cont: 692*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]] 693*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 694*d7c69c20SDavid Pagan // CHECK4: lpad: 695*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 } 696*d7c69c20SDavid Pagan // CHECK4-NEXT: cleanup 697*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0 698*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8 699*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1 700*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4 701*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]] 702*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]] 703*d7c69c20SDavid Pagan // CHECK4: arraydestroy.body: 704*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 705*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 706*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 707*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2 708*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]] 709*d7c69c20SDavid Pagan // CHECK4: arraydestroy.done1: 710*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[EH_RESUME:%.*]] 711*d7c69c20SDavid Pagan // CHECK4: eh.resume: 712*d7c69c20SDavid Pagan // CHECK4-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8 713*d7c69c20SDavid Pagan // CHECK4-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4 714*d7c69c20SDavid Pagan // CHECK4-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0 715*d7c69c20SDavid Pagan // CHECK4-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1 716*d7c69c20SDavid Pagan // CHECK4-NEXT: resume { ptr, i32 } [[LPAD_VAL2]] 717*d7c69c20SDavid Pagan // 718*d7c69c20SDavid Pagan // 719*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__cxx_global_array_dtor 720*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] { 721*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 722*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 723*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 724*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 725*d7c69c20SDavid Pagan // CHECK4: arraydestroy.body: 726*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 727*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 728*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 729*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2 730*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]] 731*d7c69c20SDavid Pagan // CHECK4: arraydestroy.done1: 732*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 733*d7c69c20SDavid Pagan // 734*d7c69c20SDavid Pagan // 735*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z3foov 736*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR1]] { 737*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 738*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_Z8mayThrowv() 739*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 740*d7c69c20SDavid Pagan // 741*d7c69c20SDavid Pagan // 742*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@main 743*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 { 744*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 745*d7c69c20SDavid Pagan // CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 746*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = alloca i8, align 1 747*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A2:%.*]] = alloca [2 x i8], align 1 748*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C:%.*]] = alloca ptr, align 8 749*d7c69c20SDavid Pagan // CHECK4-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8 750*d7c69c20SDavid Pagan // CHECK4-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8 751*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A1:%.*]] = alloca i8, align 1 752*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4 753*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 754*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4 755*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A24:%.*]] = alloca [2 x i8], align 1 756*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4 757*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]) 758*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 0, ptr [[RETVAL]], align 4 759*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr @tc, ptr [[C]], align 8 760*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]]) 761*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 762*d7c69c20SDavid Pagan // CHECK4-NEXT: store i8 2, ptr [[A]], align 1 763*d7c69c20SDavid Pagan // CHECK4-NEXT: store i8 2, ptr [[A]], align 1 764*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]]) 765*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load i8, ptr [[A]], align 1 766*d7c69c20SDavid Pagan // CHECK4-NEXT: store i8 [[TMP1]], ptr [[A1]], align 1 767*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 768*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 769*d7c69c20SDavid Pagan // CHECK4: invoke.cont: 770*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C2]], ptr [[TMP]], align 8 771*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 772*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]] 773*d7c69c20SDavid Pagan // CHECK4: invoke.cont3: 774*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0 775*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2 776*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 777*d7c69c20SDavid Pagan // CHECK4: arrayctor.loop: 778*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ] 779*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 780*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]] 781*d7c69c20SDavid Pagan // CHECK4: invoke.cont5: 782*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1 783*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 784*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 785*d7c69c20SDavid Pagan // CHECK4: arrayctor.cont: 786*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_Z3foov() 787*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]] 788*d7c69c20SDavid Pagan // CHECK4: invoke.cont6: 789*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0 790*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2 791*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 792*d7c69c20SDavid Pagan // CHECK4: arraydestroy.body: 793*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 794*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 795*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 796*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]] 797*d7c69c20SDavid Pagan // CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]] 798*d7c69c20SDavid Pagan // CHECK4: arraydestroy.done8: 799*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]] 800*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]] 801*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP0]]) 802*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load i8, ptr [[A]], align 1 803*d7c69c20SDavid Pagan // CHECK4-NEXT: [[CONV:%.*]] = sext i8 [[TMP3]] to i32 804*d7c69c20SDavid Pagan // CHECK4-NEXT: ret i32 [[CONV]] 805*d7c69c20SDavid Pagan // CHECK4: terminate.lpad: 806*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } 807*d7c69c20SDavid Pagan // CHECK4-NEXT: catch ptr null 808*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0 809*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]] 810*d7c69c20SDavid Pagan // CHECK4-NEXT: unreachable 811*d7c69c20SDavid Pagan // 812*d7c69c20SDavid Pagan // 813*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev 814*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 815*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 816*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 817*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 818*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 819*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]]) 820*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 821*d7c69c20SDavid Pagan // 822*d7c69c20SDavid Pagan // 823*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC1ERi 824*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 825*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 826*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 827*d7c69c20SDavid Pagan // CHECK4-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 828*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 829*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 830*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 831*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 832*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 833*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 834*d7c69c20SDavid Pagan // 835*d7c69c20SDavid Pagan // 836*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_ 837*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 838*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 839*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 840*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 841*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 842*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 843*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 844*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8 845*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 846*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 847*d7c69c20SDavid Pagan // 848*d7c69c20SDavid Pagan // 849*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@__clang_call_terminate 850*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat { 851*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] 852*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZSt9terminatev() #[[ATTR10]] 853*d7c69c20SDavid Pagan // CHECK4-NEXT: unreachable 854*d7c69c20SDavid Pagan // 855*d7c69c20SDavid Pagan // 856*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev 857*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 858*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 859*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 860*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 861*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 862*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0 863*d7c69c20SDavid Pagan // CHECK4-NEXT: store double 0.000000e+00, ptr [[A]], align 8 864*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr @omp_cgroup_mem_alloc, align 8 865*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr @omp_null_allocator, align 8 866*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8 867*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr @omp_large_cap_mem_alloc, align 8 868*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr @omp_const_mem_alloc, align 8 869*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8 870*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr @omp_low_lat_mem_alloc, align 8 871*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr @omp_pteam_mem_alloc, align 8 872*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr @omp_thread_mem_alloc, align 8 873*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70(ptr [[THIS1]], ptr [[TMP0]], ptr [[TMP1]], ptr [[TMP2]], ptr [[TMP3]], ptr [[TMP4]], ptr [[TMP5]], ptr [[TMP6]], ptr [[TMP7]], ptr [[TMP8]]) #[[ATTR3]] 874*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 875*d7c69c20SDavid Pagan // 876*d7c69c20SDavid Pagan // 877*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70 878*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8:[0-9]+]] { 879*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 880*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 881*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 882*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8 883*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 884*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 885*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 886*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 887*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 888*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 889*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 890*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 891*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 892*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 893*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 894*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 895*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 896*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 897*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 898*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 899*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 900*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 901*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 902*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 903*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 904*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 905*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 906*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 907*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 908*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 909*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 910*d7c69c20SDavid Pagan // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 10, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined, ptr [[TMP0]], ptr [[TMP1]], ptr [[TMP2]], ptr [[TMP3]], ptr [[TMP4]], ptr [[TMP5]], ptr [[TMP6]], ptr [[TMP7]], ptr [[TMP8]], ptr [[TMP9]]) 911*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 912*d7c69c20SDavid Pagan // 913*d7c69c20SDavid Pagan // 914*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined 915*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8]] { 916*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 917*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 918*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 919*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 920*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 921*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8 922*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 923*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 924*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 925*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 926*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 927*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 928*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 929*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = alloca ptr, align 8 930*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 931*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 932*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 933*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 934*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 935*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 936*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 937*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 938*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 939*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 940*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 941*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 942*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 943*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 944*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[TMP0]], i32 0, i32 0 945*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A1]], ptr [[A]], align 8 946*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A]], align 8 947*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load double, ptr [[TMP1]], align 8 948*d7c69c20SDavid Pagan // CHECK4-NEXT: store double [[TMP2]], ptr [[A_CASTED]], align 8 949*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8 950*d7c69c20SDavid Pagan // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 11, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined, ptr [[TMP0]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], i64 [[TMP3]]) 951*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 952*d7c69c20SDavid Pagan // 953*d7c69c20SDavid Pagan // 954*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined 955*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_THREAD_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 { 956*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 957*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 958*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 959*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 960*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 961*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8 962*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 963*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 964*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 965*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 966*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 967*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 968*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 969*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 970*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 971*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A1:%.*]] = alloca double, align 8 972*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP2:%.*]] = alloca ptr, align 8 973*d7c69c20SDavid Pagan // CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8 974*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 975*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 976*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 977*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 978*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 979*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 980*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 981*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 982*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 983*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 984*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 985*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 986*d7c69c20SDavid Pagan // CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8 987*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 988*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 989*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 990*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 991*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 992*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 993*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 994*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 995*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 996*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 997*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8 998*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A1]], ptr [[_TMP2]], align 8 999*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0 1000*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP10]], align 8 1001*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 1002*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP2]], align 8 1003*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 1004*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2 1005*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP13]], align 8 1006*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3 1007*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP2]], ptr [[TMP14]], align 8 1008*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 4 1009*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP3]], ptr [[TMP15]], align 8 1010*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 5 1011*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP4]], ptr [[TMP16]], align 8 1012*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 6 1013*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP17]], align 8 1014*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 7 1015*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP6]], ptr [[TMP18]], align 8 1016*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 8 1017*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP7]], ptr [[TMP19]], align 8 1018*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 9 1019*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP20]], align 8 1020*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 10 1021*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP21]], align 8 1022*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(88) [[REF_TMP]]) 1023*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 1024*d7c69c20SDavid Pagan // CHECK4: invoke.cont: 1025*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 1026*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4 1027*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP23]]) 1028*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1029*d7c69c20SDavid Pagan // CHECK4: terminate.lpad: 1030*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP24:%.*]] = landingpad { ptr, i32 } 1031*d7c69c20SDavid Pagan // CHECK4-NEXT: catch ptr null 1032*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP25:%.*]] = extractvalue { ptr, i32 } [[TMP24]], 0 1033*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP25]]) #[[ATTR10]] 1034*d7c69c20SDavid Pagan // CHECK4-NEXT: unreachable 1035*d7c69c20SDavid Pagan // 1036*d7c69c20SDavid Pagan // 1037*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv 1038*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(88) [[THIS:%.*]]) #[[ATTR1]] align 2 { 1039*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1040*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1041*d7c69c20SDavid Pagan // CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 1042*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1043*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1044*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 1045*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 1046*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 1047*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 1048*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 1049*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1 1050*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 1051*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 1052*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2 1053*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 2 1054*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8 1055*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP6]], align 8 1056*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3 1057*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 3 1058*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8 1059*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP11]], ptr [[TMP9]], align 8 1060*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 4 1061*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 4 1062*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8 1063*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP14]], ptr [[TMP12]], align 8 1064*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 5 1065*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 5 1066*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 1067*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP17]], ptr [[TMP15]], align 8 1068*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 6 1069*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 6 1070*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 1071*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP20]], ptr [[TMP18]], align 8 1072*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 7 1073*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 7 1074*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 8 1075*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP23]], ptr [[TMP21]], align 8 1076*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 8 1077*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 8 1078*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP26:%.*]] = load ptr, ptr [[TMP25]], align 8 1079*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP26]], ptr [[TMP24]], align 8 1080*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 9 1081*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 9 1082*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP29:%.*]] = load ptr, ptr [[TMP28]], align 8 1083*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP29]], ptr [[TMP27]], align 8 1084*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 10 1085*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 10 1086*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP32:%.*]] = load ptr, ptr [[TMP31]], align 8 1087*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP32]], ptr [[TMP30]], align 8 1088*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(88) [[REF_TMP]]) 1089*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1090*d7c69c20SDavid Pagan // 1091*d7c69c20SDavid Pagan // 1092*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv 1093*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(88) [[THIS:%.*]]) #[[ATTR2]] align 2 { 1094*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1095*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1096*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C:%.*]] = alloca i32, align 4 1097*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 1098*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1099*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1100*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 1101*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 1102*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 1103*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 1104*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 1105*d7c69c20SDavid Pagan // CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 1106*d7c69c20SDavid Pagan // CHECK4-NEXT: store double [[INC]], ptr [[TMP3]], align 8 1107*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 2 1108*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 1109*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 1110*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8 1111*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load double, ptr [[TMP8]], align 8 1112*d7c69c20SDavid Pagan // CHECK4-NEXT: store double [[TMP9]], ptr [[A_CASTED]], align 8 1113*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = load i64, ptr [[A_CASTED]], align 8 1114*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 3 1115*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8 1116*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 4 1117*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8 1118*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 5 1119*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8 1120*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 6 1121*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8 1122*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 7 1123*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 1124*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 8 1125*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 8 1126*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 9 1127*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 8 1128*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 10 1129*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP26:%.*]] = load ptr, ptr [[TMP25]], align 8 1130*d7c69c20SDavid Pagan // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 11, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], ptr [[TMP6]], i64 [[TMP10]], ptr [[TMP12]], ptr [[TMP14]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]], ptr [[TMP22]], ptr [[TMP24]], ptr [[TMP26]]) 1131*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1132*d7c69c20SDavid Pagan // 1133*d7c69c20SDavid Pagan // 1134*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined 1135*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_NULL_ALLOCATOR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_DEFAULT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LARGE_CAP_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CONST_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_HIGH_BW_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_LOW_LAT_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_PTEAM_MEM_ALLOC:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_THREAD_MEM_ALLOC:%.*]]) #[[ATTR8]] { 1136*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1137*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1138*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1139*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1140*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1141*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 1142*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_NULL_ALLOCATOR_ADDR:%.*]] = alloca ptr, align 8 1143*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_DEFAULT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1144*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LARGE_CAP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1145*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_CONST_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1146*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_HIGH_BW_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1147*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_LOW_LAT_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1148*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_PTEAM_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1149*d7c69c20SDavid Pagan // CHECK4-NEXT: [[OMP_THREAD_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1150*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1151*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 1152*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1153*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1154*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1155*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1156*d7c69c20SDavid Pagan // CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8 1157*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_NULL_ALLOCATOR]], ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 1158*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_DEFAULT_MEM_ALLOC]], ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 1159*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LARGE_CAP_MEM_ALLOC]], ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 1160*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_CONST_MEM_ALLOC]], ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 1161*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_HIGH_BW_MEM_ALLOC]], ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 1162*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_LOW_LAT_MEM_ALLOC]], ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 1163*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_PTEAM_MEM_ALLOC]], ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 1164*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[OMP_THREAD_MEM_ALLOC]], ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 1165*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1166*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1167*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[OMP_NULL_ALLOCATOR_ADDR]], align 8 1168*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[OMP_DEFAULT_MEM_ALLOC_ADDR]], align 8 1169*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr [[OMP_LARGE_CAP_MEM_ALLOC_ADDR]], align 8 1170*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[OMP_CONST_MEM_ALLOC_ADDR]], align 8 1171*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[OMP_HIGH_BW_MEM_ALLOC_ADDR]], align 8 1172*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[OMP_LOW_LAT_MEM_ALLOC_ADDR]], align 8 1173*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[OMP_PTEAM_MEM_ALLOC_ADDR]], align 8 1174*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[OMP_THREAD_MEM_ALLOC_ADDR]], align 8 1175*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8 1176*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 1177*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 1178*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP1]], align 8 1179*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP11]], i64 8, ptr [[TMP12]]) 1180*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTA__VOID_ADDR]], ptr [[_TMP1]], align 8 1181*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP1]], align 8 1182*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = load double, ptr [[TMP13]], align 8 1183*d7c69c20SDavid Pagan // CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP14]], 1.000000e+00 1184*d7c69c20SDavid Pagan // CHECK4-NEXT: store double [[INC]], ptr [[TMP13]], align 8 1185*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP1]], align 8 1186*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_free(i32 [[TMP11]], ptr [[DOTA__VOID_ADDR]], ptr [[TMP15]]) 1187*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP11]]) 1188*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1189*d7c69c20SDavid Pagan // 1190*d7c69c20SDavid Pagan // 1191*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC2ERi 1192*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 personality ptr @__gxx_personality_v0 { 1193*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1194*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1195*d7c69c20SDavid Pagan // CHECK4-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 1196*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A2:%.*]] = alloca i32, align 4 1197*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1198*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C3:%.*]] = alloca i32, align 4 1199*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 1200*d7c69c20SDavid Pagan // CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 1201*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 1202*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1203*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 1204*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1205*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1 1206*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 0, ptr [[A]], align 4 1207*d7c69c20SDavid Pagan // CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2 1208*d7c69c20SDavid Pagan // CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8 1209*d7c69c20SDavid Pagan // CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16 1210*d7c69c20SDavid Pagan // CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0 1211*d7c69c20SDavid Pagan // CHECK4-NEXT: store i8 [[BF_SET]], ptr [[B]], align 8 1212*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3 1213*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8 1214*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP1]], ptr [[C]], align 8 1215*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A2]], ptr [[TMP]], align 8 1216*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8 1217*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]]) 1218*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C3]], ptr [[_TMP4]], align 8 1219*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 1220*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS1]], ptr [[TMP3]], align 8 1221*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 1222*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8 1223*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP4]], align 8 1224*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2 1225*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8 1226*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3 1227*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8 1228*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 1229*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) 1230*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 1231*d7c69c20SDavid Pagan // CHECK4: invoke.cont: 1232*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8 1233*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]]) 1234*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1235*d7c69c20SDavid Pagan // CHECK4: terminate.lpad: 1236*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = landingpad { ptr, i32 } 1237*d7c69c20SDavid Pagan // CHECK4-NEXT: catch ptr null 1238*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0 1239*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]] 1240*d7c69c20SDavid Pagan // CHECK4-NEXT: unreachable 1241*d7c69c20SDavid Pagan // 1242*d7c69c20SDavid Pagan // 1243*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv 1244*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 { 1245*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1246*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1247*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 1248*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1249*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1250*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 1251*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8 1252*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 1253*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8 1254*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 1255*d7c69c20SDavid Pagan // CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1 1256*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[INC]], ptr [[TMP4]], align 4 1257*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 1258*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 1259*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 1260*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP8]], -1 1261*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[DEC]], ptr [[TMP7]], align 4 1262*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3 1263*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8 1264*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 1265*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 1 1266*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 4 1267*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 1268*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8 1269*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4 1270*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP14]]) 1271*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 1272*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8 1273*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2 1274*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8 1275*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3 1276*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8 1277*d7c69c20SDavid Pagan // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]]) 1278*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1279*d7c69c20SDavid Pagan // 1280*d7c69c20SDavid Pagan // 1281*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined 1282*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8]] { 1283*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1284*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1285*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1286*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1287*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 1288*d7c69c20SDavid Pagan // CHECK4-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8 1289*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 1290*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1291*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 1292*d7c69c20SDavid Pagan // CHECK4-NEXT: [[E:%.*]] = alloca ptr, align 8 1293*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP3:%.*]] = alloca ptr, align 8 1294*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 1295*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP5:%.*]] = alloca ptr, align 8 1296*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A6:%.*]] = alloca i32, align 4 1297*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP7:%.*]] = alloca ptr, align 8 1298*d7c69c20SDavid Pagan // CHECK4-NEXT: [[B8:%.*]] = alloca i32, align 4 1299*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C9:%.*]] = alloca i32, align 4 1300*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP10:%.*]] = alloca ptr, align 8 1301*d7c69c20SDavid Pagan // CHECK4-NEXT: [[E11:%.*]] = alloca i32, align 4 1302*d7c69c20SDavid Pagan // CHECK4-NEXT: [[_TMP12:%.*]] = alloca ptr, align 8 1303*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8 1304*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1305*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1306*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1307*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8 1308*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8 1309*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 1310*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1311*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8 1312*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8 1313*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8 1314*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8 1315*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP3]], ptr [[_TMP1]], align 8 1316*d7c69c20SDavid Pagan // CHECK4-NEXT: [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0 1317*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[E2]], ptr [[E]], align 8 1318*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8 1319*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP4]], ptr [[_TMP3]], align 8 1320*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[E]], align 8 1321*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP5]], ptr [[_TMP4]], align 8 1322*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8 1323*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP6]], ptr [[_TMP5]], align 8 1324*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8 1325*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 1326*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[TMP8]], ptr [[A6]], align 4 1327*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[A6]], ptr [[_TMP7]], align 8 1328*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4 1329*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[TMP9]], ptr [[B8]], align 4 1330*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8 1331*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4 1332*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[TMP11]], ptr [[C9]], align 4 1333*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C9]], ptr [[_TMP10]], align 8 1334*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8 1335*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 0, ptr [[E11]], align 4 1336*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[E11]], ptr [[_TMP12]], align 8 1337*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8 1338*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4 1339*d7c69c20SDavid Pagan // CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP14]], 1 1340*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[INC]], ptr [[TMP13]], align 4 1341*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8 1342*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4 1343*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], 1 1344*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[ADD]], ptr [[TMP15]], align 4 1345*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8 1346*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 1347*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP18]], 1 1348*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[DIV]], ptr [[TMP17]], align 4 1349*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 1350*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[E11]], ptr [[TMP19]], align 8 1351*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 1352*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 1353*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var) 1354*d7c69c20SDavid Pagan // CHECK4-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1355*d7c69c20SDavid Pagan // CHECK4-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1356*d7c69c20SDavid Pagan // CHECK4-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1357*d7c69c20SDavid Pagan // CHECK4-NEXT: ] 1358*d7c69c20SDavid Pagan // CHECK4: .omp.reduction.case1: 1359*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4 1360*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP24:%.*]] = load i32, ptr [[E11]], align 4 1361*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]] 1362*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[ADD13]], ptr [[TMP12]], align 4 1363*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var) 1364*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1365*d7c69c20SDavid Pagan // CHECK4: .omp.reduction.case2: 1366*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP25:%.*]] = load i32, ptr [[E11]], align 4 1367*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4 1368*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var) 1369*d7c69c20SDavid Pagan // CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1370*d7c69c20SDavid Pagan // CHECK4: .omp.reduction.default: 1371*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP21]]) 1372*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1373*d7c69c20SDavid Pagan // 1374*d7c69c20SDavid Pagan // 1375*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func 1376*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] { 1377*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1378*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 1379*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 1380*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 1381*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 1382*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 1383*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 1384*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 1385*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 1386*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 1387*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 1388*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 1389*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4 1390*d7c69c20SDavid Pagan // CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]] 1391*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[ADD]], ptr [[TMP7]], align 4 1392*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1393*d7c69c20SDavid Pagan // 1394*d7c69c20SDavid Pagan // 1395*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_ 1396*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { 1397*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1398*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1399*d7c69c20SDavid Pagan // CHECK4-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 1400*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1401*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 1402*d7c69c20SDavid Pagan // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1403*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0 1404*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8 1405*d7c69c20SDavid Pagan // CHECK4-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0 1406*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[A2]], align 4 1407*d7c69c20SDavid Pagan // CHECK4-NEXT: store i32 [[TMP1]], ptr [[A]], align 4 1408*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1409*d7c69c20SDavid Pagan // 1410*d7c69c20SDavid Pagan // 1411*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev 1412*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR2]] { 1413*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1414*d7c69c20SDavid Pagan // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @_Z15parallel_singlev.omp_outlined) 1415*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1416*d7c69c20SDavid Pagan // 1417*d7c69c20SDavid Pagan // 1418*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined 1419*d7c69c20SDavid Pagan // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 { 1420*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1421*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1422*d7c69c20SDavid Pagan // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1423*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1424*d7c69c20SDavid Pagan // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1425*d7c69c20SDavid Pagan // CHECK4-NEXT: invoke void @_Z3foov() 1426*d7c69c20SDavid Pagan // CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] 1427*d7c69c20SDavid Pagan // CHECK4: invoke.cont: 1428*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 1429*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 1430*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1]], i32 [[TMP1]]) 1431*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1432*d7c69c20SDavid Pagan // CHECK4: terminate.lpad: 1433*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 } 1434*d7c69c20SDavid Pagan // CHECK4-NEXT: catch ptr null 1435*d7c69c20SDavid Pagan // CHECK4-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0 1436*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]] 1437*d7c69c20SDavid Pagan // CHECK4-NEXT: unreachable 1438*d7c69c20SDavid Pagan // 1439*d7c69c20SDavid Pagan // 1440*d7c69c20SDavid Pagan // CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp 1441*d7c69c20SDavid Pagan // CHECK4-SAME: () #[[ATTR0]] { 1442*d7c69c20SDavid Pagan // CHECK4-NEXT: entry: 1443*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__cxx_global_var_init() 1444*d7c69c20SDavid Pagan // CHECK4-NEXT: call void @__cxx_global_var_init.1() 1445*d7c69c20SDavid Pagan // CHECK4-NEXT: ret void 1446*d7c69c20SDavid Pagan // 1447*d7c69c20SDavid Pagan // 1448*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init 1449*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG6:![0-9]+]] { 1450*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1451*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG9:![0-9]+]] 1452*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]], !dbg [[DBG12:![0-9]+]] 1453*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG9]] 1454*d7c69c20SDavid Pagan // 1455*d7c69c20SDavid Pagan // 1456*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev 1457*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 !dbg [[DBG13:![0-9]+]] { 1458*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1459*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1460*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1461*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1462*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]), !dbg [[DBG14:![0-9]+]] 1463*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG15:![0-9]+]] 1464*d7c69c20SDavid Pagan // 1465*d7c69c20SDavid Pagan // 1466*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev 1467*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] align 2 !dbg [[DBG16:![0-9]+]] { 1468*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1469*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1470*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1471*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1472*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]], !dbg [[DBG17:![0-9]+]] 1473*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG18:![0-9]+]] 1474*d7c69c20SDavid Pagan // 1475*d7c69c20SDavid Pagan // 1476*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev 1477*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG19:![0-9]+]] { 1478*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1479*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1480*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1481*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1482*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG20:![0-9]+]] 1483*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 0, ptr [[A]], align 4, !dbg [[DBG20]] 1484*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG21:![0-9]+]] 1485*d7c69c20SDavid Pagan // 1486*d7c69c20SDavid Pagan // 1487*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev 1488*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG22:![0-9]+]] { 1489*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1490*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1491*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1492*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1493*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG23:![0-9]+]] 1494*d7c69c20SDavid Pagan // 1495*d7c69c20SDavid Pagan // 1496*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init.1 1497*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality ptr @__gxx_personality_v0 !dbg [[DBG24:![0-9]+]] { 1498*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1499*d7c69c20SDavid Pagan // CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8 1500*d7c69c20SDavid Pagan // CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4 1501*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG25:![0-9]+]] 1502*d7c69c20SDavid Pagan // CHECK5: arrayctor.loop: 1503*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG25]] 1504*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 1505*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG25]] 1506*d7c69c20SDavid Pagan // CHECK5: invoke.cont: 1507*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG25]] 1508*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2), !dbg [[DBG25]] 1509*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG25]] 1510*d7c69c20SDavid Pagan // CHECK5: arrayctor.cont: 1511*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]], !dbg [[DBG27:![0-9]+]] 1512*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG27]] 1513*d7c69c20SDavid Pagan // CHECK5: lpad: 1514*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 } 1515*d7c69c20SDavid Pagan // CHECK5-NEXT: cleanup, !dbg [[DBG28:![0-9]+]] 1516*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0, !dbg [[DBG28]] 1517*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8, !dbg [[DBG28]] 1518*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1, !dbg [[DBG28]] 1519*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG28]] 1520*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]], !dbg [[DBG25]] 1521*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG25]] 1522*d7c69c20SDavid Pagan // CHECK5: arraydestroy.body: 1523*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG25]] 1524*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG25]] 1525*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG25]] 1526*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG25]] 1527*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG25]] 1528*d7c69c20SDavid Pagan // CHECK5: arraydestroy.done1: 1529*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG25]] 1530*d7c69c20SDavid Pagan // CHECK5: eh.resume: 1531*d7c69c20SDavid Pagan // CHECK5-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8, !dbg [[DBG25]] 1532*d7c69c20SDavid Pagan // CHECK5-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG25]] 1533*d7c69c20SDavid Pagan // CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0, !dbg [[DBG25]] 1534*d7c69c20SDavid Pagan // CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG25]] 1535*d7c69c20SDavid Pagan // CHECK5-NEXT: resume { ptr, i32 } [[LPAD_VAL2]], !dbg [[DBG25]] 1536*d7c69c20SDavid Pagan // 1537*d7c69c20SDavid Pagan // 1538*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__cxx_global_array_dtor 1539*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG29:![0-9]+]] { 1540*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1541*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 1542*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 1543*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG30:![0-9]+]] 1544*d7c69c20SDavid Pagan // CHECK5: arraydestroy.body: 1545*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG30]] 1546*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG30]] 1547*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG30]] 1548*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG30]] 1549*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG30]] 1550*d7c69c20SDavid Pagan // CHECK5: arraydestroy.done1: 1551*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG30]] 1552*d7c69c20SDavid Pagan // 1553*d7c69c20SDavid Pagan // 1554*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z3foov 1555*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR1]] !dbg [[DBG31:![0-9]+]] { 1556*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1557*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_Z8mayThrowv(), !dbg [[DBG32:![0-9]+]] 1558*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG33:![0-9]+]] 1559*d7c69c20SDavid Pagan // 1560*d7c69c20SDavid Pagan // 1561*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@main 1562*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG34:![0-9]+]] { 1563*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1564*d7c69c20SDavid Pagan // CHECK5-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 1565*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = alloca i8, align 1 1566*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A2:%.*]] = alloca [2 x i8], align 1 1567*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C:%.*]] = alloca ptr, align 8 1568*d7c69c20SDavid Pagan // CHECK5-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8 1569*d7c69c20SDavid Pagan // CHECK5-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8 1570*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A1:%.*]] = alloca i8, align 1 1571*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C2:%.*]] = alloca [[CLASS_TESTCLASS:%.*]], align 4 1572*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1573*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TC:%.*]] = alloca [[CLASS_TESTCLASS]], align 4 1574*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A24:%.*]] = alloca [2 x i8], align 1 1575*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TC2:%.*]] = alloca [2 x %class.TestClass], align 4 1576*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]), !dbg [[DBG35:![0-9]+]] 1577*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 0, ptr [[RETVAL]], align 4 1578*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr @tc, ptr [[C]], align 8, !dbg [[DBG36:![0-9]+]] 1579*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]]), !dbg [[DBG37:![0-9]+]] 1580*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(24) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG38:![0-9]+]] 1581*d7c69c20SDavid Pagan // CHECK5-NEXT: store i8 2, ptr [[A]], align 1, !dbg [[DBG39:![0-9]+]] 1582*d7c69c20SDavid Pagan // CHECK5-NEXT: store i8 2, ptr [[A]], align 1, !dbg [[DBG40:![0-9]+]] 1583*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG41:![0-9]+]] 1584*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG42:![0-9]+]] 1585*d7c69c20SDavid Pagan // CHECK5-NEXT: store i8 [[TMP1]], ptr [[A1]], align 1, !dbg [[DBG42]] 1586*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[C2]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 1587*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG43:![0-9]+]] 1588*d7c69c20SDavid Pagan // CHECK5: invoke.cont: 1589*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C2]], ptr [[TMP]], align 8, !dbg [[DBG44:![0-9]+]] 1590*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZN9TestClassC1ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TC]], ptr noundef nonnull align 4 dereferenceable(4) @tc) 1591*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT3:%.*]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG45:![0-9]+]] 1592*d7c69c20SDavid Pagan // CHECK5: invoke.cont3: 1593*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0, !dbg [[DBG46:![0-9]+]] 1594*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN]], i64 2, !dbg [[DBG46]] 1595*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG46]] 1596*d7c69c20SDavid Pagan // CHECK5: arrayctor.loop: 1597*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[INVOKE_CONT3]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT5:%.*]] ], !dbg [[DBG46]] 1598*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 1599*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT5]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG46]] 1600*d7c69c20SDavid Pagan // CHECK5: invoke.cont5: 1601*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG46]] 1602*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]], !dbg [[DBG46]] 1603*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG46]] 1604*d7c69c20SDavid Pagan // CHECK5: arrayctor.cont: 1605*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_Z3foov() 1606*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT6:%.*]] unwind label [[TERMINATE_LPAD]], !dbg [[DBG47:![0-9]+]] 1607*d7c69c20SDavid Pagan // CHECK5: invoke.cont6: 1608*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TC2]], i32 0, i32 0, !dbg [[DBG47]] 1609*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAY_BEGIN7]], i64 2, !dbg [[DBG47]] 1610*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG47]] 1611*d7c69c20SDavid Pagan // CHECK5: arraydestroy.body: 1612*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[INVOKE_CONT6]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG47]] 1613*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG47]] 1614*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG47]] 1615*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]], !dbg [[DBG47]] 1616*d7c69c20SDavid Pagan // CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG47]] 1617*d7c69c20SDavid Pagan // CHECK5: arraydestroy.done8: 1618*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TC]]) #[[ATTR3]], !dbg [[DBG47]] 1619*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[C2]]) #[[ATTR3]], !dbg [[DBG47]] 1620*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG48:![0-9]+]] 1621*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG49:![0-9]+]] 1622*d7c69c20SDavid Pagan // CHECK5-NEXT: [[CONV:%.*]] = sext i8 [[TMP3]] to i32, !dbg [[DBG49]] 1623*d7c69c20SDavid Pagan // CHECK5-NEXT: ret i32 [[CONV]], !dbg [[DBG50:![0-9]+]] 1624*d7c69c20SDavid Pagan // CHECK5: terminate.lpad: 1625*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } 1626*d7c69c20SDavid Pagan // CHECK5-NEXT: catch ptr null, !dbg [[DBG43]] 1627*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0, !dbg [[DBG43]] 1628*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR10:[0-9]+]], !dbg [[DBG43]] 1629*d7c69c20SDavid Pagan // CHECK5-NEXT: unreachable, !dbg [[DBG43]] 1630*d7c69c20SDavid Pagan // 1631*d7c69c20SDavid Pagan // 1632*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev 1633*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG51:![0-9]+]] { 1634*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1635*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1636*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1637*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1638*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]]), !dbg [[DBG52:![0-9]+]] 1639*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG53:![0-9]+]] 1640*d7c69c20SDavid Pagan // 1641*d7c69c20SDavid Pagan // 1642*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC1ERi 1643*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG54:![0-9]+]] { 1644*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1645*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1646*d7c69c20SDavid Pagan // CHECK5-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 1647*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1648*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 1649*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1650*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG55:![0-9]+]] 1651*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(24) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG55]] 1652*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG56:![0-9]+]] 1653*d7c69c20SDavid Pagan // 1654*d7c69c20SDavid Pagan // 1655*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1ERKS_ 1656*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG57:![0-9]+]] { 1657*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1658*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1659*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 1660*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1661*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 1662*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1663*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG58:![0-9]+]] 1664*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZN9TestClassC2ERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG58]] 1665*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG59:![0-9]+]] 1666*d7c69c20SDavid Pagan // 1667*d7c69c20SDavid Pagan // 1668*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@__clang_call_terminate 1669*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] { 1670*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] 1671*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZSt9terminatev() #[[ATTR10]] 1672*d7c69c20SDavid Pagan // CHECK5-NEXT: unreachable 1673*d7c69c20SDavid Pagan // 1674*d7c69c20SDavid Pagan // 1675*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev 1676*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG60:![0-9]+]] { 1677*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1678*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1679*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1680*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1681*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG61:![0-9]+]] 1682*d7c69c20SDavid Pagan // CHECK5-NEXT: store double 0.000000e+00, ptr [[A]], align 8, !dbg [[DBG61]] 1683*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr @omp_cgroup_mem_alloc, align 8, !dbg [[DBG62:![0-9]+]] 1684*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70(ptr [[THIS1]], ptr [[TMP0]]) #[[ATTR3]], !dbg [[DBG62]] 1685*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG63:![0-9]+]] 1686*d7c69c20SDavid Pagan // 1687*d7c69c20SDavid Pagan // 1688*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70 1689*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]]) #[[ATTR8:[0-9]+]] !dbg [[DBG64:![0-9]+]] { 1690*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1691*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1692*d7c69c20SDavid Pagan // CHECK5-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1693*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1694*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1695*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG65:![0-9]+]] 1696*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG65]] 1697*d7c69c20SDavid Pagan // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB10:[0-9]+]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined, ptr [[TMP0]], ptr [[TMP1]]), !dbg [[DBG65]] 1698*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG66:![0-9]+]] 1699*d7c69c20SDavid Pagan // 1700*d7c69c20SDavid Pagan // 1701*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined 1702*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef [[OMP_CGROUP_MEM_ALLOC:%.*]]) #[[ATTR8]] !dbg [[DBG67:![0-9]+]] { 1703*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1704*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1705*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1706*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1707*d7c69c20SDavid Pagan // CHECK5-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1708*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = alloca ptr, align 8 1709*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 1710*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1711*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1712*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1713*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1714*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG68:![0-9]+]] 1715*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG69:![0-9]+]] 1716*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A1]], ptr [[A]], align 8, !dbg [[DBG69]] 1717*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A]], align 8, !dbg [[DBG69]] 1718*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load double, ptr [[TMP1]], align 8, !dbg [[DBG70:![0-9]+]] 1719*d7c69c20SDavid Pagan // CHECK5-NEXT: store double [[TMP2]], ptr [[A_CASTED]], align 8, !dbg [[DBG70]] 1720*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG70]] 1721*d7c69c20SDavid Pagan // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB8:[0-9]+]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined, ptr [[TMP0]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], i64 [[TMP3]]), !dbg [[DBG70]] 1722*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG71:![0-9]+]] 1723*d7c69c20SDavid Pagan // 1724*d7c69c20SDavid Pagan // 1725*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN3SSTIdEC1Ev_l70.omp_outlined.omp_outlined 1726*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 !dbg [[DBG72:![0-9]+]] { 1727*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1728*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1729*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1730*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1731*d7c69c20SDavid Pagan // CHECK5-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1732*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 1733*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1734*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A1:%.*]] = alloca double, align 8 1735*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP2:%.*]] = alloca ptr, align 8 1736*d7c69c20SDavid Pagan // CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8 1737*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1738*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1739*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1740*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1741*d7c69c20SDavid Pagan // CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8 1742*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG73:![0-9]+]] 1743*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG73]] 1744*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG73]] 1745*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A1]], ptr [[_TMP2]], align 8, !dbg [[DBG74:![0-9]+]] 1746*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG75:![0-9]+]] 1747*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP0]], ptr [[TMP2]], align 8, !dbg [[DBG75]] 1748*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG75]] 1749*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG76:![0-9]+]] 1750*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP4]], ptr [[TMP3]], align 8, !dbg [[DBG75]] 1751*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG75]] 1752*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP5]], align 8, !dbg [[DBG75]] 1753*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]) 1754*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG75]] 1755*d7c69c20SDavid Pagan // CHECK5: invoke.cont: 1756*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG77:![0-9]+]] 1757*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4, !dbg [[DBG77]] 1758*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB6:[0-9]+]], i32 [[TMP7]]), !dbg [[DBG77]] 1759*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG77]] 1760*d7c69c20SDavid Pagan // CHECK5: terminate.lpad: 1761*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = landingpad { ptr, i32 } 1762*d7c69c20SDavid Pagan // CHECK5-NEXT: catch ptr null, !dbg [[DBG75]] 1763*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = extractvalue { ptr, i32 } [[TMP8]], 0, !dbg [[DBG75]] 1764*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP9]]) #[[ATTR10]], !dbg [[DBG75]] 1765*d7c69c20SDavid Pagan // CHECK5-NEXT: unreachable, !dbg [[DBG75]] 1766*d7c69c20SDavid Pagan // 1767*d7c69c20SDavid Pagan // 1768*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv 1769*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR1]] align 2 !dbg [[DBG78:![0-9]+]] { 1770*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1771*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1772*d7c69c20SDavid Pagan // CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 1773*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1774*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1775*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 1776*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 1777*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG79:![0-9]+]] 1778*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8, !dbg [[DBG79]] 1779*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG79]] 1780*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG80:![0-9]+]] 1781*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG80]] 1782*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8, !dbg [[DBG79]] 1783*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG79]] 1784*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG80]] 1785*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8, !dbg [[DBG80]] 1786*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP8]], ptr [[TMP6]], align 8, !dbg [[DBG79]] 1787*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]), !dbg [[DBG79]] 1788*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG81:![0-9]+]] 1789*d7c69c20SDavid Pagan // 1790*d7c69c20SDavid Pagan // 1791*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv 1792*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG84:![0-9]+]] { 1793*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1794*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1795*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C:%.*]] = alloca i32, align 4 1796*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 1797*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1798*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1799*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 1800*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 1801*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG85:![0-9]+]] 1802*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG85]] 1803*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8, !dbg [[DBG86:![0-9]+]] 1804*d7c69c20SDavid Pagan // CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00, !dbg [[DBG86]] 1805*d7c69c20SDavid Pagan // CHECK5-NEXT: store double [[INC]], ptr [[TMP3]], align 8, !dbg [[DBG86]] 1806*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG87:![0-9]+]] 1807*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG87]] 1808*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG88:![0-9]+]] 1809*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8, !dbg [[DBG88]] 1810*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = load double, ptr [[TMP8]], align 8, !dbg [[DBG89:![0-9]+]] 1811*d7c69c20SDavid Pagan // CHECK5-NEXT: store double [[TMP9]], ptr [[A_CASTED]], align 8, !dbg [[DBG89]] 1812*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP10:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG89]] 1813*d7c69c20SDavid Pagan // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB14:[0-9]+]], i32 3, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], ptr [[TMP6]], i64 [[TMP10]]), !dbg [[DBG89]] 1814*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG90:![0-9]+]] 1815*d7c69c20SDavid Pagan // 1816*d7c69c20SDavid Pagan // 1817*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined 1818*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[OMP_CGROUP_MEM_ALLOC:%.*]], i64 noundef [[A:%.*]]) #[[ATTR8]] !dbg [[DBG91:![0-9]+]] { 1819*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1820*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1821*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1822*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1823*d7c69c20SDavid Pagan // CHECK5-NEXT: [[OMP_CGROUP_MEM_ALLOC_ADDR:%.*]] = alloca ptr, align 8 1824*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 1825*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1826*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 1827*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1828*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1829*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1830*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[OMP_CGROUP_MEM_ALLOC]], ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8 1831*d7c69c20SDavid Pagan // CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8 1832*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG92:![0-9]+]] 1833*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OMP_CGROUP_MEM_ALLOC_ADDR]], align 8, !dbg [[DBG92]] 1834*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG92]] 1835*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG93:![0-9]+]] 1836*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG93]] 1837*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG94:![0-9]+]] 1838*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP3]], i64 8, ptr [[TMP4]]), !dbg [[DBG93]] 1839*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTA__VOID_ADDR]], ptr [[_TMP1]], align 8, !dbg [[DBG93]] 1840*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG95:![0-9]+]] 1841*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = load double, ptr [[TMP5]], align 8, !dbg [[DBG96:![0-9]+]] 1842*d7c69c20SDavid Pagan // CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP6]], 1.000000e+00, !dbg [[DBG96]] 1843*d7c69c20SDavid Pagan // CHECK5-NEXT: store double [[INC]], ptr [[TMP5]], align 8, !dbg [[DBG96]] 1844*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG94]] 1845*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_free(i32 [[TMP3]], ptr [[DOTA__VOID_ADDR]], ptr [[TMP7]]), !dbg [[DBG96]] 1846*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB12:[0-9]+]], i32 [[TMP3]]), !dbg [[DBG97:![0-9]+]] 1847*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG97]] 1848*d7c69c20SDavid Pagan // 1849*d7c69c20SDavid Pagan // 1850*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC2ERi 1851*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(24) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] align 2 personality ptr @__gxx_personality_v0 !dbg [[DBG98:![0-9]+]] { 1852*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1853*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1854*d7c69c20SDavid Pagan // CHECK5-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8 1855*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A2:%.*]] = alloca i32, align 4 1856*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1857*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C3:%.*]] = alloca i32, align 4 1858*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 1859*d7c69c20SDavid Pagan // CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 1860*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB16:[0-9]+]]), !dbg [[DBG99:![0-9]+]] 1861*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1862*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 1863*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1864*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG100:![0-9]+]] 1865*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 0, ptr [[A]], align 4, !dbg [[DBG100]] 1866*d7c69c20SDavid Pagan // CHECK5-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG101:![0-9]+]] 1867*d7c69c20SDavid Pagan // CHECK5-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 8, !dbg [[DBG101]] 1868*d7c69c20SDavid Pagan // CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16, !dbg [[DBG101]] 1869*d7c69c20SDavid Pagan // CHECK5-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0, !dbg [[DBG101]] 1870*d7c69c20SDavid Pagan // CHECK5-NEXT: store i8 [[BF_SET]], ptr [[B]], align 8, !dbg [[DBG101]] 1871*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG102:![0-9]+]] 1872*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG103:![0-9]+]] 1873*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP1]], ptr [[C]], align 8, !dbg [[DBG102]] 1874*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A2]], ptr [[TMP]], align 8, !dbg [[DBG104:![0-9]+]] 1875*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8, !dbg [[DBG105:![0-9]+]] 1876*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTB__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP2]]), !dbg [[DBG104]] 1877*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C3]], ptr [[_TMP4]], align 8, !dbg [[DBG104]] 1878*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG106:![0-9]+]] 1879*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS1]], ptr [[TMP3]], align 8, !dbg [[DBG106]] 1880*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG106]] 1881*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG107:![0-9]+]] 1882*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP5]], ptr [[TMP4]], align 8, !dbg [[DBG106]] 1883*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG106]] 1884*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTB__VOID_ADDR]], ptr [[TMP6]], align 8, !dbg [[DBG106]] 1885*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3, !dbg [[DBG106]] 1886*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP4]], align 8, !dbg [[DBG107]] 1887*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8, !dbg [[DBG106]] 1888*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) 1889*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG106]] 1890*d7c69c20SDavid Pagan // CHECK5: invoke.cont: 1891*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr @omp_default_mem_alloc, align 8, !dbg [[DBG105]] 1892*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTB__VOID_ADDR]], ptr [[TMP9]]), !dbg [[DBG106]] 1893*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG108:![0-9]+]] 1894*d7c69c20SDavid Pagan // CHECK5: terminate.lpad: 1895*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP10:%.*]] = landingpad { ptr, i32 } 1896*d7c69c20SDavid Pagan // CHECK5-NEXT: catch ptr null, !dbg [[DBG106]] 1897*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP11:%.*]] = extractvalue { ptr, i32 } [[TMP10]], 0, !dbg [[DBG106]] 1898*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP11]]) #[[ATTR10]], !dbg [[DBG106]] 1899*d7c69c20SDavid Pagan // CHECK5-NEXT: unreachable, !dbg [[DBG106]] 1900*d7c69c20SDavid Pagan // 1901*d7c69c20SDavid Pagan // 1902*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv 1903*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG109:![0-9]+]] { 1904*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1905*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1906*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB22:[0-9]+]]), !dbg [[DBG110:![0-9]+]] 1907*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1908*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 1909*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 1910*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8 1911*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG111:![0-9]+]] 1912*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP3]], align 8, !dbg [[DBG111]] 1913*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4, !dbg [[DBG112:![0-9]+]] 1914*d7c69c20SDavid Pagan // CHECK5-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG112]] 1915*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[INC]], ptr [[TMP4]], align 4, !dbg [[DBG112]] 1916*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG113:![0-9]+]] 1917*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG113]] 1918*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG114:![0-9]+]] 1919*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP8]], -1, !dbg [[DBG114]] 1920*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[DEC]], ptr [[TMP7]], align 4, !dbg [[DBG114]] 1921*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG115:![0-9]+]] 1922*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8, !dbg [[DBG115]] 1923*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG116:![0-9]+]] 1924*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 1, !dbg [[DBG116]] 1925*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 4, !dbg [[DBG116]] 1926*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG117:![0-9]+]] 1927*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8, !dbg [[DBG117]] 1928*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4, !dbg [[DBG117]] 1929*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_push_num_threads(ptr @[[GLOB22]], i32 [[TMP0]], i32 [[TMP14]]), !dbg [[DBG118:![0-9]+]] 1930*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG119:![0-9]+]] 1931*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8, !dbg [[DBG119]] 1932*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG120:![0-9]+]] 1933*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8, !dbg [[DBG120]] 1934*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG121:![0-9]+]] 1935*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8, !dbg [[DBG121]] 1936*d7c69c20SDavid Pagan // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB24:[0-9]+]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP2]], ptr [[TMP16]], ptr [[TMP18]], ptr [[TMP20]]), !dbg [[DBG118]] 1937*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG122:![0-9]+]] 1938*d7c69c20SDavid Pagan // 1939*d7c69c20SDavid Pagan // 1940*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined 1941*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[B:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR8]] !dbg [[DBG123:![0-9]+]] { 1942*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 1943*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 1944*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 1945*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1946*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 1947*d7c69c20SDavid Pagan // CHECK5-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8 1948*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 1949*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 1950*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 1951*d7c69c20SDavid Pagan // CHECK5-NEXT: [[E:%.*]] = alloca ptr, align 8 1952*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP3:%.*]] = alloca ptr, align 8 1953*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8 1954*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP5:%.*]] = alloca ptr, align 8 1955*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A6:%.*]] = alloca i32, align 4 1956*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP7:%.*]] = alloca ptr, align 8 1957*d7c69c20SDavid Pagan // CHECK5-NEXT: [[B8:%.*]] = alloca i32, align 4 1958*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C9:%.*]] = alloca i32, align 4 1959*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP10:%.*]] = alloca ptr, align 8 1960*d7c69c20SDavid Pagan // CHECK5-NEXT: [[E11:%.*]] = alloca i32, align 4 1961*d7c69c20SDavid Pagan // CHECK5-NEXT: [[_TMP12:%.*]] = alloca ptr, align 8 1962*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8 1963*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 1964*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 1965*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 1966*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8 1967*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8 1968*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 1969*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG124:![0-9]+]] 1970*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG124]] 1971*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[B_ADDR]], align 8, !dbg [[DBG124]] 1972*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG124]] 1973*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8, !dbg [[DBG124]] 1974*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP3]], ptr [[_TMP1]], align 8, !dbg [[DBG124]] 1975*d7c69c20SDavid Pagan // CHECK5-NEXT: [[E2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG125:![0-9]+]] 1976*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[E2]], ptr [[E]], align 8, !dbg [[DBG125]] 1977*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG126:![0-9]+]] 1978*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP4]], ptr [[_TMP3]], align 8, !dbg [[DBG127:![0-9]+]] 1979*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[E]], align 8, !dbg [[DBG128:![0-9]+]] 1980*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP5]], ptr [[_TMP4]], align 8, !dbg [[DBG127]] 1981*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG129:![0-9]+]] 1982*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP6]], ptr [[_TMP5]], align 8, !dbg [[DBG127]] 1983*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG130:![0-9]+]] 1984*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG130]] 1985*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[TMP8]], ptr [[A6]], align 4, !dbg [[DBG130]] 1986*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[A6]], ptr [[_TMP7]], align 8, !dbg [[DBG127]] 1987*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG131:![0-9]+]] 1988*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[TMP9]], ptr [[B8]], align 4, !dbg [[DBG131]] 1989*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP5]], align 8, !dbg [[DBG132:![0-9]+]] 1990*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG132]] 1991*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[TMP11]], ptr [[C9]], align 4, !dbg [[DBG132]] 1992*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C9]], ptr [[_TMP10]], align 8, !dbg [[DBG127]] 1993*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP4]], align 8, !dbg [[DBG125]] 1994*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 0, ptr [[E11]], align 4, !dbg [[DBG125]] 1995*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[E11]], ptr [[_TMP12]], align 8, !dbg [[DBG127]] 1996*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP7]], align 8, !dbg [[DBG126]] 1997*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4, !dbg [[DBG133:![0-9]+]] 1998*d7c69c20SDavid Pagan // CHECK5-NEXT: [[INC:%.*]] = add nsw i32 [[TMP14]], 1, !dbg [[DBG133]] 1999*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[INC]], ptr [[TMP13]], align 4, !dbg [[DBG133]] 2000*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP12]], align 8, !dbg [[DBG128]] 2001*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4, !dbg [[DBG134:![0-9]+]] 2002*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], 1, !dbg [[DBG134]] 2003*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[ADD]], ptr [[TMP15]], align 4, !dbg [[DBG134]] 2004*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP10]], align 8, !dbg [[DBG129]] 2005*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG135:![0-9]+]] 2006*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP18]], 1, !dbg [[DBG135]] 2007*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[DIV]], ptr [[TMP17]], align 4, !dbg [[DBG135]] 2008*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0, !dbg [[DBG133]] 2009*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[E11]], ptr [[TMP19]], align 8, !dbg [[DBG133]] 2010*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG133]] 2011*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4, !dbg [[DBG133]] 2012*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB18:[0-9]+]], i32 [[TMP21]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]] 2013*d7c69c20SDavid Pagan // CHECK5-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 2014*d7c69c20SDavid Pagan // CHECK5-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 2015*d7c69c20SDavid Pagan // CHECK5-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 2016*d7c69c20SDavid Pagan // CHECK5-NEXT: ], !dbg [[DBG133]] 2017*d7c69c20SDavid Pagan // CHECK5: .omp.reduction.case1: 2018*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP12]], align 4, !dbg [[DBG125]] 2019*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP24:%.*]] = load i32, ptr [[E11]], align 4, !dbg [[DBG125]] 2020*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]], !dbg [[DBG136:![0-9]+]] 2021*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[ADD13]], ptr [[TMP12]], align 4, !dbg [[DBG136]] 2022*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB18]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]] 2023*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]], !dbg [[DBG133]] 2024*d7c69c20SDavid Pagan // CHECK5: .omp.reduction.case2: 2025*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP25:%.*]] = load i32, ptr [[E11]], align 4, !dbg [[DBG125]] 2026*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP26:%.*]] = atomicrmw add ptr [[TMP12]], i32 [[TMP25]] monotonic, align 4, !dbg [[DBG133]] 2027*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB18]], i32 [[TMP21]], ptr @.gomp_critical_user_.reduction.var), !dbg [[DBG133]] 2028*d7c69c20SDavid Pagan // CHECK5-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]], !dbg [[DBG133]] 2029*d7c69c20SDavid Pagan // CHECK5: .omp.reduction.default: 2030*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB20:[0-9]+]], i32 [[TMP21]]), !dbg [[DBG137:![0-9]+]] 2031*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG137]] 2032*d7c69c20SDavid Pagan // 2033*d7c69c20SDavid Pagan // 2034*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined.omp.reduction.reduction_func 2035*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] !dbg [[DBG138:![0-9]+]] { 2036*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 2037*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 2038*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 2039*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 2040*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 2041*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG139:![0-9]+]] 2042*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG139]] 2043*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG139]] 2044*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG139]] 2045*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG139]] 2046*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG139]] 2047*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG140:![0-9]+]] 2048*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4, !dbg [[DBG140]] 2049*d7c69c20SDavid Pagan // CHECK5-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]], !dbg [[DBG141:![0-9]+]] 2050*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[ADD]], ptr [[TMP7]], align 4, !dbg [[DBG141]] 2051*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG140]] 2052*d7c69c20SDavid Pagan // 2053*d7c69c20SDavid Pagan // 2054*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC2ERKS_ 2055*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG142:![0-9]+]] { 2056*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 2057*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 2058*d7c69c20SDavid Pagan // CHECK5-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8 2059*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 2060*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8 2061*d7c69c20SDavid Pagan // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 2062*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG143:![0-9]+]] 2063*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8, !dbg [[DBG144:![0-9]+]] 2064*d7c69c20SDavid Pagan // CHECK5-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG145:![0-9]+]] 2065*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[A2]], align 4, !dbg [[DBG145]] 2066*d7c69c20SDavid Pagan // CHECK5-NEXT: store i32 [[TMP1]], ptr [[A]], align 4, !dbg [[DBG143]] 2067*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG146:![0-9]+]] 2068*d7c69c20SDavid Pagan // 2069*d7c69c20SDavid Pagan // 2070*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev 2071*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR2]] !dbg [[DBG147:![0-9]+]] { 2072*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 2073*d7c69c20SDavid Pagan // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB28:[0-9]+]], i32 0, ptr @_Z15parallel_singlev.omp_outlined), !dbg [[DBG148:![0-9]+]] 2074*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG149:![0-9]+]] 2075*d7c69c20SDavid Pagan // 2076*d7c69c20SDavid Pagan // 2077*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined 2078*d7c69c20SDavid Pagan // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR8]] personality ptr @__gxx_personality_v0 !dbg [[DBG150:![0-9]+]] { 2079*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 2080*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 2081*d7c69c20SDavid Pagan // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 2082*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 2083*d7c69c20SDavid Pagan // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 2084*d7c69c20SDavid Pagan // CHECK5-NEXT: invoke void @_Z3foov() 2085*d7c69c20SDavid Pagan // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG151:![0-9]+]] 2086*d7c69c20SDavid Pagan // CHECK5: invoke.cont: 2087*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG152:![0-9]+]] 2088*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG152]] 2089*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB26:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG152]] 2090*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void, !dbg [[DBG152]] 2091*d7c69c20SDavid Pagan // CHECK5: terminate.lpad: 2092*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 } 2093*d7c69c20SDavid Pagan // CHECK5-NEXT: catch ptr null, !dbg [[DBG151]] 2094*d7c69c20SDavid Pagan // CHECK5-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 0, !dbg [[DBG151]] 2095*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP3]]) #[[ATTR10]], !dbg [[DBG151]] 2096*d7c69c20SDavid Pagan // CHECK5-NEXT: unreachable, !dbg [[DBG151]] 2097*d7c69c20SDavid Pagan // 2098*d7c69c20SDavid Pagan // 2099*d7c69c20SDavid Pagan // CHECK5-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_scope_codegen.cpp 2100*d7c69c20SDavid Pagan // CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG153:![0-9]+]] { 2101*d7c69c20SDavid Pagan // CHECK5-NEXT: entry: 2102*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__cxx_global_var_init(), !dbg [[DBG154:![0-9]+]] 2103*d7c69c20SDavid Pagan // CHECK5-NEXT: call void @__cxx_global_var_init.1(), !dbg [[DBG154]] 2104*d7c69c20SDavid Pagan // CHECK5-NEXT: ret void 2105*d7c69c20SDavid Pagan // 2106*d7c69c20SDavid Pagan // 2107*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_Z10array_funciPiP2St 2108*d7c69c20SDavid Pagan // CHECK6-SAME: (i32 noundef [[N:%.*]], ptr noundef [[A:%.*]], ptr noundef [[S:%.*]]) #[[ATTR0:[0-9]+]] { 2109*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2110*d7c69c20SDavid Pagan // CHECK6-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4 2111*d7c69c20SDavid Pagan // CHECK6-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 2112*d7c69c20SDavid Pagan // CHECK6-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8 2113*d7c69c20SDavid Pagan // CHECK6-NEXT: [[B:%.*]] = alloca i32, align 4 2114*d7c69c20SDavid Pagan // CHECK6-NEXT: [[C:%.*]] = alloca i32, align 4 2115*d7c69c20SDavid Pagan // CHECK6-NEXT: [[B1:%.*]] = alloca i32, align 4 2116*d7c69c20SDavid Pagan // CHECK6-NEXT: [[A2:%.*]] = alloca ptr, align 8 2117*d7c69c20SDavid Pagan // CHECK6-NEXT: [[S3:%.*]] = alloca ptr, align 8 2118*d7c69c20SDavid Pagan // CHECK6-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8 2119*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ATOMIC_TEMP:%.*]] = alloca i32, align 4 2120*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP:%.*]] = alloca i32, align 4 2121*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]]) 2122*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4 2123*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8 2124*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8 2125*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 4 2126*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64 2127*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP3:%.*]] = load i32, ptr [[B]], align 4 2128*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[TMP3]], ptr [[B1]], align 4 2129*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP4:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8 2130*d7c69c20SDavid Pagan // CHECK6-NEXT: [[DOTC__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr [[TMP4]]) 2131*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 1, ptr [[DOTC__VOID_ADDR]], align 4 2132*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 2133*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[DOTC__VOID_ADDR]], ptr [[TMP5]], align 8 2134*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z10array_funciPiP2St.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var) 2135*d7c69c20SDavid Pagan // CHECK6-NEXT: switch i32 [[TMP6]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 2136*d7c69c20SDavid Pagan // CHECK6-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 2137*d7c69c20SDavid Pagan // CHECK6-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 2138*d7c69c20SDavid Pagan // CHECK6-NEXT: ] 2139*d7c69c20SDavid Pagan // CHECK6: .omp.reduction.case1: 2140*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP7:%.*]] = load i32, ptr [[C]], align 4 2141*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4 2142*d7c69c20SDavid Pagan // CHECK6-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], [[TMP8]] 2143*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[MUL]], ptr [[C]], align 4 2144*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var) 2145*d7c69c20SDavid Pagan // CHECK6-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 2146*d7c69c20SDavid Pagan // CHECK6: .omp.reduction.case2: 2147*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4 2148*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ATOMIC_LOAD:%.*]] = load atomic i32, ptr [[C]] monotonic, align 4 2149*d7c69c20SDavid Pagan // CHECK6-NEXT: br label [[ATOMIC_CONT:%.*]] 2150*d7c69c20SDavid Pagan // CHECK6: atomic_cont: 2151*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP10:%.*]] = phi i32 [ [[ATOMIC_LOAD]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[TMP15:%.*]], [[ATOMIC_CONT]] ] 2152*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[TMP10]], ptr [[TMP]], align 4 2153*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP]], align 4 2154*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTC__VOID_ADDR]], align 4 2155*d7c69c20SDavid Pagan // CHECK6-NEXT: [[MUL4:%.*]] = mul nsw i32 [[TMP11]], [[TMP12]] 2156*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[MUL4]], ptr [[ATOMIC_TEMP]], align 4 2157*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP13:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 4 2158*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP14:%.*]] = cmpxchg ptr [[C]], i32 [[TMP10]], i32 [[TMP13]] monotonic monotonic, align 4 2159*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP15]] = extractvalue { i32, i1 } [[TMP14]], 0 2160*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP16:%.*]] = extractvalue { i32, i1 } [[TMP14]], 1 2161*d7c69c20SDavid Pagan // CHECK6-NEXT: br i1 [[TMP16]], label [[ATOMIC_EXIT:%.*]], label [[ATOMIC_CONT]] 2162*d7c69c20SDavid Pagan // CHECK6: atomic_exit: 2163*d7c69c20SDavid Pagan // CHECK6-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 2164*d7c69c20SDavid Pagan // CHECK6: .omp.reduction.default: 2165*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP17:%.*]] = load ptr, ptr @omp_high_bw_mem_alloc, align 8 2166*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTC__VOID_ADDR]], ptr [[TMP17]]) 2167*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2168*d7c69c20SDavid Pagan // 2169*d7c69c20SDavid Pagan // 2170*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_Z10array_funciPiP2St.omp.reduction.reduction_func 2171*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] { 2172*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2173*d7c69c20SDavid Pagan // CHECK6-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 2174*d7c69c20SDavid Pagan // CHECK6-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 2175*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 2176*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 2177*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 2178*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 2179*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 2180*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 2181*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 2182*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 2183*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 2184*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4 2185*d7c69c20SDavid Pagan // CHECK6-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], [[TMP9]] 2186*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 [[MUL]], ptr [[TMP7]], align 4 2187*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2188*d7c69c20SDavid Pagan // 2189*d7c69c20SDavid Pagan // 2190*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@main 2191*d7c69c20SDavid Pagan // CHECK6-SAME: () #[[ATTR4:[0-9]+]] { 2192*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2193*d7c69c20SDavid Pagan // CHECK6-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 2194*d7c69c20SDavid Pagan // CHECK6-NEXT: [[N:%.*]] = alloca i32, align 4 2195*d7c69c20SDavid Pagan // CHECK6-NEXT: [[A:%.*]] = alloca [10 x i32], align 16 2196*d7c69c20SDavid Pagan // CHECK6-NEXT: [[S:%.*]] = alloca [2 x %struct.St], align 16 2197*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 0, ptr [[RETVAL]], align 4 2198*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i32 0, i32 0 2199*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[ARRAY_BEGIN]], i64 2 2200*d7c69c20SDavid Pagan // CHECK6-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 2201*d7c69c20SDavid Pagan // CHECK6: arrayctor.loop: 2202*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 2203*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @_ZN2StC1Ev(ptr noundef nonnull align 4 dereferenceable(8) [[ARRAYCTOR_CUR]]) 2204*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAYCTOR_CUR]], i64 1 2205*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 2206*d7c69c20SDavid Pagan // CHECK6-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 2207*d7c69c20SDavid Pagan // CHECK6: arrayctor.cont: 2208*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 4 2209*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i64 0, i64 0 2210*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i64 0, i64 0 2211*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @_Z10array_funciPiP2St(i32 noundef [[TMP0]], ptr noundef [[ARRAYDECAY]], ptr noundef [[ARRAYDECAY1]]) 2212*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 0, ptr [[RETVAL]], align 4 2213*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAY_BEGIN2:%.*]] = getelementptr inbounds [2 x %struct.St], ptr [[S]], i32 0, i32 0 2214*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAY_BEGIN2]], i64 2 2215*d7c69c20SDavid Pagan // CHECK6-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 2216*d7c69c20SDavid Pagan // CHECK6: arraydestroy.body: 2217*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP1]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 2218*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_ST]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 2219*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @_ZN2StD1Ev(ptr noundef nonnull align 4 dereferenceable(8) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR1:[0-9]+]] 2220*d7c69c20SDavid Pagan // CHECK6-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN2]] 2221*d7c69c20SDavid Pagan // CHECK6-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE3:%.*]], label [[ARRAYDESTROY_BODY]] 2222*d7c69c20SDavid Pagan // CHECK6: arraydestroy.done3: 2223*d7c69c20SDavid Pagan // CHECK6-NEXT: [[TMP2:%.*]] = load i32, ptr [[RETVAL]], align 4 2224*d7c69c20SDavid Pagan // CHECK6-NEXT: ret i32 [[TMP2]] 2225*d7c69c20SDavid Pagan // 2226*d7c69c20SDavid Pagan // 2227*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StC1Ev 2228*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 2229*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2230*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 2231*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 2232*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 2233*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @_ZN2StC2Ev(ptr noundef nonnull align 4 dereferenceable(8) [[THIS1]]) 2234*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2235*d7c69c20SDavid Pagan // 2236*d7c69c20SDavid Pagan // 2237*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StD1Ev 2238*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 2239*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2240*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 2241*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 2242*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 2243*d7c69c20SDavid Pagan // CHECK6-NEXT: call void @_ZN2StD2Ev(ptr noundef nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR1]] 2244*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2245*d7c69c20SDavid Pagan // 2246*d7c69c20SDavid Pagan // 2247*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StC2Ev 2248*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 2249*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2250*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 2251*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 2252*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 2253*d7c69c20SDavid Pagan // CHECK6-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_ST:%.*]], ptr [[THIS1]], i32 0, i32 0 2254*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 0, ptr [[A]], align 4 2255*d7c69c20SDavid Pagan // CHECK6-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_ST]], ptr [[THIS1]], i32 0, i32 1 2256*d7c69c20SDavid Pagan // CHECK6-NEXT: store i32 0, ptr [[B]], align 4 2257*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2258*d7c69c20SDavid Pagan // 2259*d7c69c20SDavid Pagan // 2260*d7c69c20SDavid Pagan // CHECK6-LABEL: define {{[^@]+}}@_ZN2StD2Ev 2261*d7c69c20SDavid Pagan // CHECK6-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 2262*d7c69c20SDavid Pagan // CHECK6-NEXT: entry: 2263*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 2264*d7c69c20SDavid Pagan // CHECK6-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 2265*d7c69c20SDavid Pagan // CHECK6-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 2266*d7c69c20SDavid Pagan // CHECK6-NEXT: ret void 2267*d7c69c20SDavid Pagan // 2268