3767 lines · cpp
1// 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// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK13// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK24 5// RUN: %clang_cc1 -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s6// RUN: %clang_cc1 -fopenmp -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=CHECK17 8// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s9// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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=CHECK410 11// RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp -fnoopenmp-use-tls -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK512// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -DARRAY -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK613 14// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -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}}"15// RUN: %clang_cc1 -fopenmp-simd -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s16// RUN: %clang_cc1 -fopenmp-simd -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}}"17// RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -std=c++11 -fopenmp-simd -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}}"18// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -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}}"19// expected-no-diagnostics20#ifndef ARRAY21#ifndef HEADER22#define HEADER23 24class TestClass {25public:26 int a;27 TestClass() : a(0) {}28 TestClass(const TestClass &C) : a(C.a) {}29 TestClass &operator=(const TestClass &) { return *this;}30 ~TestClass(){};31};32 33 34 35TestClass tc;36TestClass tc2[2];37#pragma omp threadprivate(tc, tc2)38 39void foo() { extern void mayThrow(); mayThrow(); }40 41struct SS {42 int a;43 int b : 4;44 int &c;45 SS(int &d) : a(0), b(0), c(d) {46#pragma omp parallel firstprivate(a, b, c)47#pragma omp single copyprivate(a, this->b, (this)->c)48 [&]() {49 ++this->a, --b, (this)->c /= 1;50#pragma omp parallel firstprivate(a, b, c)51#pragma omp single copyprivate(a, this->b, (this)->c)52 ++(this)->a, --b, this->c /= 1;53 }();54 }55};56 57template<typename T>58struct SST {59 T a;60 SST() : a(T()) {61#pragma omp parallel firstprivate(a)62#pragma omp single copyprivate(this->a)63 [&]() {64 [&]() {65 ++this->a;66#pragma omp parallel firstprivate(a)67#pragma omp single copyprivate((this)->a)68 ++(this)->a;69 }();70 }();71 }72};73 74int main() {75 char a;76 char a2[2];77 TestClass &c = tc;78 SST<double> sst;79 SS ss(c.a);80 81#pragma omp single nowait82 a = 2;83#pragma omp single84 a = 2;85#pragma omp single copyprivate(a, c, tc, a2, tc2)86 foo();87 return a;88}89 90 91void parallel_single() {92#pragma omp parallel93#pragma omp single94 foo();95}96#endif97#else98struct St {99 int a, b;100 St() : a(0), b(0) {}101 St &operator=(const St &) { return *this; };102 ~St() {}103};104 105void array_func(int n, int a[n], St s[2]) {106#pragma omp single copyprivate(a, s)107 ;108}109#endif110// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.111// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {112// CHECK1-NEXT: entry:113// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8114// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8115// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8116// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]])117// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8118// CHECK1-NEXT: ret ptr [[TMP2]]119//120//121// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev122// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {123// CHECK1-NEXT: entry:124// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8125// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8126// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8127// CHECK1-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])128// CHECK1-NEXT: ret void129//130//131// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.132// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {133// CHECK1-NEXT: entry:134// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8135// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8136// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8137// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]]) #[[ATTR3:[0-9]+]]138// CHECK1-NEXT: ret void139//140//141// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev142// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {143// CHECK1-NEXT: entry:144// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8145// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8146// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8147// CHECK1-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]]148// CHECK1-NEXT: ret void149//150//151// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.152// CHECK1-SAME: () #[[ATTR0]] {153// CHECK1-NEXT: entry:154// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])155// CHECK1-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc, ptr @.__kmpc_global_ctor_., ptr null, ptr @.__kmpc_global_dtor_.)156// CHECK1-NEXT: ret void157//158//159// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..1160// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] personality ptr @__gxx_personality_v0 {161// CHECK1-NEXT: entry:162// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8163// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8164// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4165// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8166// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8167// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TMP1]], i32 0, i32 0168// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAY_BEGIN]], i64 2169// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]170// CHECK1: arrayctor.loop:171// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]172// CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])173// CHECK1-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]174// CHECK1: invoke.cont:175// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1176// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]177// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]178// CHECK1: arrayctor.cont:179// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8180// CHECK1-NEXT: ret ptr [[TMP2]]181// CHECK1: lpad:182// CHECK1-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 }183// CHECK1-NEXT: cleanup184// CHECK1-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 0185// CHECK1-NEXT: store ptr [[TMP4]], ptr [[EXN_SLOT]], align 8186// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 1187// CHECK1-NEXT: store i32 [[TMP5]], ptr [[EHSELECTOR_SLOT]], align 4188// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]]189// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]190// CHECK1: arraydestroy.body:191// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]192// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1193// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]194// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]195// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]196// CHECK1: arraydestroy.done1:197// CHECK1-NEXT: br label [[EH_RESUME:%.*]]198// CHECK1: eh.resume:199// CHECK1-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8200// CHECK1-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4201// CHECK1-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0202// CHECK1-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1203// CHECK1-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]204//205//206// CHECK1-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..2207// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {208// CHECK1-NEXT: entry:209// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8210// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8211// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8212// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP1]], i64 2213// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]214// CHECK1: arraydestroy.body:215// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]216// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1217// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]218// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[TMP1]]219// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]220// CHECK1: arraydestroy.done1:221// CHECK1-NEXT: ret void222//223//224// CHECK1-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..3225// CHECK1-SAME: () #[[ATTR0]] {226// CHECK1-NEXT: entry:227// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])228// CHECK1-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc2, ptr @.__kmpc_global_ctor_..1, ptr null, ptr @.__kmpc_global_dtor_..2)229// CHECK1-NEXT: ret void230//231//232// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init233// CHECK1-SAME: () #[[ATTR0]] {234// CHECK1-NEXT: entry:235// CHECK1-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc)236// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3]]237// CHECK1-NEXT: ret void238//239//240// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init.4241// CHECK1-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 {242// CHECK1-NEXT: entry:243// CHECK1-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8244// CHECK1-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4245// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]246// CHECK1: arrayctor.loop:247// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]248// CHECK1-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])249// CHECK1-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]250// CHECK1: invoke.cont:251// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1252// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2)253// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]254// CHECK1: arrayctor.cont:255// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]]256// CHECK1-NEXT: ret void257// CHECK1: lpad:258// CHECK1-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 }259// CHECK1-NEXT: cleanup260// CHECK1-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0261// CHECK1-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8262// CHECK1-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1263// CHECK1-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4264// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]]265// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]266// CHECK1: arraydestroy.body:267// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]268// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1269// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]270// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2271// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]272// CHECK1: arraydestroy.done1:273// CHECK1-NEXT: br label [[EH_RESUME:%.*]]274// CHECK1: eh.resume:275// CHECK1-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8276// CHECK1-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4277// CHECK1-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0278// CHECK1-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1279// CHECK1-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]280//281//282// CHECK1-LABEL: define {{[^@]+}}@__cxx_global_array_dtor283// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {284// CHECK1-NEXT: entry:285// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8286// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8287// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]288// CHECK1: arraydestroy.body:289// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]290// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1291// CHECK1-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]292// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2293// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]294// CHECK1: arraydestroy.done1:295// CHECK1-NEXT: ret void296//297//298// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev299// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {300// CHECK1-NEXT: entry:301// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8302// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8303// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8304// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0305// CHECK1-NEXT: store i32 0, ptr [[A]], align 4306// CHECK1-NEXT: ret void307//308//309// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev310// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {311// CHECK1-NEXT: entry:312// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8313// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8314// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8315// CHECK1-NEXT: ret void316//317//318// CHECK1-LABEL: define {{[^@]+}}@_Z3foov319// CHECK1-SAME: () #[[ATTR1]] {320// CHECK1-NEXT: entry:321// CHECK1-NEXT: call void @_Z8mayThrowv()322// CHECK1-NEXT: ret void323//324//325// CHECK1-LABEL: define {{[^@]+}}@main326// CHECK1-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 {327// CHECK1-NEXT: entry:328// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4329// CHECK1-NEXT: [[A:%.*]] = alloca i8, align 1330// CHECK1-NEXT: [[A2:%.*]] = alloca [2 x i8], align 1331// CHECK1-NEXT: [[C:%.*]] = alloca ptr, align 8332// CHECK1-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 8333// CHECK1-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 8334// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4335// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [5 x ptr], align 8336// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])337// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4338// CHECK1-NEXT: store ptr @tc, ptr [[C]], align 8339// CHECK1-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]])340// CHECK1-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(16) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc)341// CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])342// CHECK1-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0343// CHECK1-NEXT: br i1 [[TMP2]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]344// CHECK1: omp_if.then:345// CHECK1-NEXT: store i8 2, ptr [[A]], align 1346// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])347// CHECK1-NEXT: br label [[OMP_IF_END]]348// CHECK1: omp_if.end:349// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])350// CHECK1-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0351// CHECK1-NEXT: br i1 [[TMP4]], label [[OMP_IF_THEN1:%.*]], label [[OMP_IF_END2:%.*]]352// CHECK1: omp_if.then1:353// CHECK1-NEXT: store i8 2, ptr [[A]], align 1354// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])355// CHECK1-NEXT: br label [[OMP_IF_END2]]356// CHECK1: omp_if.end2:357// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])358// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4359// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])360// CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0361// CHECK1-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]]362// CHECK1: omp_if.then3:363// CHECK1-NEXT: invoke void @_Z3foov()364// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]365// CHECK1: invoke.cont:366// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])367// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4368// CHECK1-NEXT: br label [[OMP_IF_END4]]369// CHECK1: omp_if.end4:370// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0371// CHECK1-NEXT: store ptr [[A]], ptr [[TMP7]], align 8372// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1373// CHECK1-NEXT: store ptr @tc, ptr [[TMP8]], align 8374// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2375// CHECK1-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.)376// CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8377// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3378// CHECK1-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8379// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4380// CHECK1-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.)381// CHECK1-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8382// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4383// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]])384// CHECK1-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1385// CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32386// CHECK1-NEXT: ret i32 [[CONV]]387// CHECK1: terminate.lpad:388// CHECK1-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 }389// CHECK1-NEXT: catch ptr null390// CHECK1-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0391// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR11:[0-9]+]]392// CHECK1-NEXT: unreachable393//394//395// CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev396// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {397// CHECK1-NEXT: entry:398// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8399// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8400// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8401// CHECK1-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]])402// CHECK1-NEXT: ret void403//404//405// CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC1ERi406// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {407// CHECK1-NEXT: entry:408// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8409// CHECK1-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8410// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8411// CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8412// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8413// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8414// CHECK1-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])415// CHECK1-NEXT: ret void416//417//418// CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate419// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat {420// CHECK1-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]421// CHECK1-NEXT: call void @_ZSt9terminatev() #[[ATTR11]]422// CHECK1-NEXT: unreachable423//424//425// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func426// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] {427// CHECK1-NEXT: entry:428// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8429// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8430// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8431// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8432// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8433// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8434// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0435// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8436// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 0437// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8438// CHECK1-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 1439// CHECK1-NEXT: store i8 [[TMP8]], ptr [[TMP5]], align 1440// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 1441// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8442// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 1443// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8444// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP10]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP12]])445// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 2446// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8447// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 2448// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8449// CHECK1-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP14]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP16]])450// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 3451// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8452// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 3453// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8454// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP18]], ptr align 1 [[TMP20]], i64 2, i1 false)455// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 4456// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 8457// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 4458// CHECK1-NEXT: [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 8459// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP22]], i64 2460// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP22]], [[TMP25]]461// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]462// CHECK1: omp.arraycpy.body:463// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]464// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP22]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]465// CHECK1-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])466// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1467// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1468// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]469// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]]470// CHECK1: omp.arraycpy.done4:471// CHECK1-NEXT: ret void472//473//474// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_475// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR2]] comdat align 2 {476// CHECK1-NEXT: entry:477// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8478// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8479// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8480// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8481// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8482// CHECK1-NEXT: ret ptr [[THIS1]]483//484//485// CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev486// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {487// CHECK1-NEXT: entry:488// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8489// CHECK1-NEXT: [[A2:%.*]] = alloca ptr, align 8490// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8491// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8492// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8493// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0494// CHECK1-NEXT: store double 0.000000e+00, ptr [[A]], align 8495// CHECK1-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SST]], ptr [[THIS1]], i32 0, i32 0496// CHECK1-NEXT: store ptr [[A3]], ptr [[A2]], align 8497// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A2]], align 8498// CHECK1-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8499// CHECK1-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8500// CHECK1-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8501// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZN3SSTIdEC2Ev.omp_outlined, ptr [[THIS1]], i64 [[TMP2]])502// CHECK1-NEXT: ret void503//504//505// CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev.omp_outlined506// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10:[0-9]+]] personality ptr @__gxx_personality_v0 {507// CHECK1-NEXT: entry:508// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8509// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8510// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8511// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8512// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8513// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8514// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4515// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8516// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 8517// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8518// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8519// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8520// CHECK1-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8521// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8522// CHECK1-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8523// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8524// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 8525// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4526// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8527// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4528// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])529// CHECK1-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0530// CHECK1-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]531// CHECK1: omp_if.then:532// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0533// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8534// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1535// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8536// CHECK1-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8537// CHECK1-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])538// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]539// CHECK1: invoke.cont:540// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])541// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4542// CHECK1-NEXT: br label [[OMP_IF_END]]543// CHECK1: omp_if.end:544// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0545// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8546// CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8547// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4548// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP11]])549// CHECK1-NEXT: ret void550// CHECK1: terminate.lpad:551// CHECK1-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 }552// CHECK1-NEXT: catch ptr null553// CHECK1-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0554// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR11]]555// CHECK1-NEXT: unreachable556//557//558// CHECK1-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv559// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] align 2 {560// CHECK1-NEXT: entry:561// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8562// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8563// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8564// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8565// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0566// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8567// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0568// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8569// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1570// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1571// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8572// CHECK1-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8573// CHECK1-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])574// CHECK1-NEXT: ret void575//576//577// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5578// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {579// CHECK1-NEXT: entry:580// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8581// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8582// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8583// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8584// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8585// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8586// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0587// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8588// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0589// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8590// CHECK1-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8591// CHECK1-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8592// CHECK1-NEXT: ret void593//594//595// CHECK1-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv596// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR2]] align 2 {597// CHECK1-NEXT: entry:598// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8599// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8600// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8601// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8602// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0603// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8604// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1605// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8606// CHECK1-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8607// CHECK1-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00608// CHECK1-NEXT: store double [[INC]], ptr [[TMP3]], align 8609// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1610// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8611// CHECK1-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8612// CHECK1-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8613// CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8614// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP8]])615// CHECK1-NEXT: ret void616//617//618// CHECK1-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined619// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] {620// CHECK1-NEXT: entry:621// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8622// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8623// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8624// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8625// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8626// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8627// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4628// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 8629// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8630// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8631// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8632// CHECK1-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8633// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8634// CHECK1-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8635// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8636// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 8637// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4638// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8639// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4640// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])641// CHECK1-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0642// CHECK1-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]643// CHECK1: omp_if.then:644// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8645// CHECK1-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8646// CHECK1-NEXT: [[INC:%.*]] = fadd double [[TMP7]], 1.000000e+00647// CHECK1-NEXT: store double [[INC]], ptr [[TMP6]], align 8648// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])649// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4650// CHECK1-NEXT: br label [[OMP_IF_END]]651// CHECK1: omp_if.end:652// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0653// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8654// CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8655// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4656// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP10]])657// CHECK1-NEXT: ret void658//659//660// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.6661// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {662// CHECK1-NEXT: entry:663// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8664// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8665// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8666// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8667// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8668// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8669// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0670// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8671// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0672// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8673// CHECK1-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8674// CHECK1-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8675// CHECK1-NEXT: ret void676//677//678// CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC2ERi679// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {680// CHECK1-NEXT: entry:681// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8682// CHECK1-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8683// CHECK1-NEXT: [[A2:%.*]] = alloca ptr, align 8684// CHECK1-NEXT: [[B4:%.*]] = alloca i32, align 4685// CHECK1-NEXT: [[C7:%.*]] = alloca ptr, align 8686// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8687// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8688// CHECK1-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8689// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8690// CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8691// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8692// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 0693// CHECK1-NEXT: store i32 0, ptr [[A]], align 8694// CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 1695// CHECK1-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 4696// CHECK1-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16697// CHECK1-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0698// CHECK1-NEXT: store i8 [[BF_SET]], ptr [[B]], align 4699// CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2700// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8701// CHECK1-NEXT: store ptr [[TMP0]], ptr [[C]], align 8702// CHECK1-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 0703// CHECK1-NEXT: store ptr [[A3]], ptr [[A2]], align 8704// CHECK1-NEXT: [[B5:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 1705// CHECK1-NEXT: [[BF_LOAD6:%.*]] = load i8, ptr [[B5]], align 4706// CHECK1-NEXT: [[BF_SHL:%.*]] = shl i8 [[BF_LOAD6]], 4707// CHECK1-NEXT: [[BF_ASHR:%.*]] = ashr i8 [[BF_SHL]], 4708// CHECK1-NEXT: [[BF_CAST:%.*]] = sext i8 [[BF_ASHR]] to i32709// CHECK1-NEXT: store i32 [[BF_CAST]], ptr [[B4]], align 4710// CHECK1-NEXT: [[C8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2711// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[C8]], align 8712// CHECK1-NEXT: store ptr [[TMP1]], ptr [[C7]], align 8713// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A2]], align 8714// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4715// CHECK1-NEXT: store i32 [[TMP3]], ptr [[A_CASTED]], align 4716// CHECK1-NEXT: [[TMP4:%.*]] = load i64, ptr [[A_CASTED]], align 8717// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[B4]], align 4718// CHECK1-NEXT: store i32 [[TMP5]], ptr [[B_CASTED]], align 4719// CHECK1-NEXT: [[TMP6:%.*]] = load i64, ptr [[B_CASTED]], align 8720// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[C7]], align 8721// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4722// CHECK1-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4723// CHECK1-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8724// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZN2SSC2ERi.omp_outlined, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]])725// CHECK1-NEXT: ret void726//727//728// CHECK1-LABEL: define {{[^@]+}}@_ZN2SSC2ERi.omp_outlined729// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {730// CHECK1-NEXT: entry:731// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8732// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8733// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8734// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8735// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8736// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8737// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8738// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8739// CHECK1-NEXT: [[_TMP2:%.*]] = alloca ptr, align 8740// CHECK1-NEXT: [[_TMP3:%.*]] = alloca ptr, align 8741// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4742// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8743// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 8744// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8745// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8746// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8747// CHECK1-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8748// CHECK1-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 8749// CHECK1-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 8750// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8751// CHECK1-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8752// CHECK1-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 8753// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8754// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 8755// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 8756// CHECK1-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 8757// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4758// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8759// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4760// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])761// CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0762// CHECK1-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]763// CHECK1: omp_if.then:764// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0765// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP7]], align 8766// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1767// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8768// CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8769// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2770// CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8771// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3772// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8773// CHECK1-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8774// CHECK1-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])775// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]776// CHECK1: invoke.cont:777// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])778// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4779// CHECK1-NEXT: br label [[OMP_IF_END]]780// CHECK1: omp_if.end:781// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0782// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8783// CHECK1-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8784// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1785// CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8786// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2787// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8788// CHECK1-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8789// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4790// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP18]])791// CHECK1-NEXT: ret void792// CHECK1: terminate.lpad:793// CHECK1-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 }794// CHECK1-NEXT: catch ptr null795// CHECK1-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0796// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR11]]797// CHECK1-NEXT: unreachable798//799//800// CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv801// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 {802// CHECK1-NEXT: entry:803// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8804// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8805// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8806// CHECK1-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8807// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8808// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8809// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0810// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8811// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1812// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8813// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4814// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1815// CHECK1-NEXT: store i32 [[INC]], ptr [[TMP3]], align 4816// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2817// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8818// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4819// CHECK1-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP7]], -1820// CHECK1-NEXT: store i32 [[DEC]], ptr [[TMP6]], align 4821// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3822// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8823// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4824// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP10]], 1825// CHECK1-NEXT: store i32 [[DIV]], ptr [[TMP9]], align 4826// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1827// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8828// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4829// CHECK1-NEXT: store i32 [[TMP13]], ptr [[A_CASTED]], align 4830// CHECK1-NEXT: [[TMP14:%.*]] = load i64, ptr [[A_CASTED]], align 8831// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2832// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8833// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 4834// CHECK1-NEXT: store i32 [[TMP17]], ptr [[B_CASTED]], align 4835// CHECK1-NEXT: [[TMP18:%.*]] = load i64, ptr [[B_CASTED]], align 8836// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3837// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8838// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4839// CHECK1-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4840// CHECK1-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8841// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]])842// CHECK1-NEXT: ret void843//844//845// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7846// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {847// CHECK1-NEXT: entry:848// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8849// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8850// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8851// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8852// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8853// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8854// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0855// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8856// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 0857// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8858// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4859// CHECK1-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 4860// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 1861// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8862// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 1863// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8864// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4865// CHECK1-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 4866// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 2867// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8868// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2869// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8870// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4871// CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4872// CHECK1-NEXT: ret void873//874//875// CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined876// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] {877// CHECK1-NEXT: entry:878// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8879// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8880// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8881// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8882// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8883// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8884// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8885// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8886// CHECK1-NEXT: [[_TMP2:%.*]] = alloca ptr, align 8887// CHECK1-NEXT: [[_TMP3:%.*]] = alloca ptr, align 8888// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4889// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 8890// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8891// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8892// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8893// CHECK1-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8894// CHECK1-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 8895// CHECK1-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 8896// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8897// CHECK1-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8898// CHECK1-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 8899// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8900// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 8901// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 8902// CHECK1-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 8903// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4904// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8905// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4906// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])907// CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0908// CHECK1-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]909// CHECK1: omp_if.then:910// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP2]], align 8911// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4912// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 1913// CHECK1-NEXT: store i32 [[INC]], ptr [[TMP7]], align 4914// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR]], align 4915// CHECK1-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP9]], -1916// CHECK1-NEXT: store i32 [[DEC]], ptr [[B_ADDR]], align 4917// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP3]], align 8918// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4919// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 1920// CHECK1-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 4921// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])922// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4923// CHECK1-NEXT: br label [[OMP_IF_END]]924// CHECK1: omp_if.end:925// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0926// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP2]], align 8927// CHECK1-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8928// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1929// CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP14]], align 8930// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2931// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8932// CHECK1-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8933// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4934// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.8, i32 [[TMP17]])935// CHECK1-NEXT: ret void936//937//938// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.8939// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {940// CHECK1-NEXT: entry:941// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8942// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8943// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8944// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8945// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8946// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8947// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0948// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8949// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 0950// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8951// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4952// CHECK1-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 4953// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 1954// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8955// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 1956// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8957// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4958// CHECK1-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 4959// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 2960// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8961// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2962// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8963// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4964// CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4965// CHECK1-NEXT: ret void966//967//968// CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev969// CHECK1-SAME: () #[[ATTR2]] {970// CHECK1-NEXT: entry:971// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @_Z15parallel_singlev.omp_outlined)972// CHECK1-NEXT: ret void973//974//975// CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined976// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {977// CHECK1-NEXT: entry:978// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8979// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8980// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8981// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8982// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8983// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4984// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]])985// CHECK1-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0986// CHECK1-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]987// CHECK1: omp_if.then:988// CHECK1-NEXT: invoke void @_Z3foov()989// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]990// CHECK1: invoke.cont:991// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]])992// CHECK1-NEXT: br label [[OMP_IF_END]]993// CHECK1: omp_if.end:994// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]])995// CHECK1-NEXT: ret void996// CHECK1: terminate.lpad:997// CHECK1-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 }998// CHECK1-NEXT: catch ptr null999// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 01000// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR11]]1001// CHECK1-NEXT: unreachable1002//1003//1004// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp1005// CHECK1-SAME: () #[[ATTR0]] {1006// CHECK1-NEXT: entry:1007// CHECK1-NEXT: call void @__cxx_global_var_init()1008// CHECK1-NEXT: call void @__cxx_global_var_init.4()1009// CHECK1-NEXT: call void @.__omp_threadprivate_init_.()1010// CHECK1-NEXT: call void @.__omp_threadprivate_init_..3()1011// CHECK1-NEXT: ret void1012//1013//1014// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init1015// CHECK2-SAME: () #[[ATTR0:[0-9]+]] {1016// CHECK2-NEXT: entry:1017// CHECK2-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc)1018// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]]1019// CHECK2-NEXT: ret void1020//1021//1022// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev1023// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {1024// CHECK2-NEXT: entry:1025// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81026// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81027// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81028// CHECK2-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1029// CHECK2-NEXT: ret void1030//1031//1032// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev1033// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {1034// CHECK2-NEXT: entry:1035// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81036// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81037// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81038// CHECK2-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]]1039// CHECK2-NEXT: ret void1040//1041//1042// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init.11043// CHECK2-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 {1044// CHECK2-NEXT: entry:1045// CHECK2-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 81046// CHECK2-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 41047// CHECK2-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1048// CHECK2: arrayctor.loop:1049// CHECK2-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]1050// CHECK2-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1051// CHECK2-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]1052// CHECK2: invoke.cont:1053// CHECK2-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 11054// CHECK2-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2)1055// CHECK2-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1056// CHECK2: arrayctor.cont:1057// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]]1058// CHECK2-NEXT: ret void1059// CHECK2: lpad:1060// CHECK2-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 }1061// CHECK2-NEXT: cleanup1062// CHECK2-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 01063// CHECK2-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 81064// CHECK2-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 11065// CHECK2-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 41066// CHECK2-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]]1067// CHECK2-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1068// CHECK2: arraydestroy.body:1069// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1070// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11071// CHECK2-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1072// CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc21073// CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]1074// CHECK2: arraydestroy.done1:1075// CHECK2-NEXT: br label [[EH_RESUME:%.*]]1076// CHECK2: eh.resume:1077// CHECK2-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 81078// CHECK2-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 41079// CHECK2-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 01080// CHECK2-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 11081// CHECK2-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]1082//1083//1084// CHECK2-LABEL: define {{[^@]+}}@__cxx_global_array_dtor1085// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1086// CHECK2-NEXT: entry:1087// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81088// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81089// CHECK2-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1090// CHECK2: arraydestroy.body:1091// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1092// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11093// CHECK2-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1094// CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc21095// CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]1096// CHECK2: arraydestroy.done1:1097// CHECK2-NEXT: ret void1098//1099//1100// CHECK2-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.1101// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1102// CHECK2-NEXT: entry:1103// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81104// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81105// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81106// CHECK2-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]])1107// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81108// CHECK2-NEXT: ret ptr [[TMP2]]1109//1110//1111// CHECK2-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.1112// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1113// CHECK2-NEXT: entry:1114// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81115// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81116// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81117// CHECK2-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]]) #[[ATTR3]]1118// CHECK2-NEXT: ret void1119//1120//1121// CHECK2-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.1122// CHECK2-SAME: () #[[ATTR0]] {1123// CHECK2-NEXT: entry:1124// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])1125// CHECK2-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc, ptr @.__kmpc_global_ctor_., ptr null, ptr @.__kmpc_global_dtor_.)1126// CHECK2-NEXT: ret void1127//1128//1129// CHECK2-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..21130// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] personality ptr @__gxx_personality_v0 {1131// CHECK2-NEXT: entry:1132// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81133// CHECK2-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 81134// CHECK2-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 41135// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81136// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81137// CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TMP1]], i32 0, i32 01138// CHECK2-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAY_BEGIN]], i64 21139// CHECK2-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1140// CHECK2: arrayctor.loop:1141// CHECK2-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]1142// CHECK2-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1143// CHECK2-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]1144// CHECK2: invoke.cont:1145// CHECK2-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 11146// CHECK2-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1147// CHECK2-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1148// CHECK2: arrayctor.cont:1149// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81150// CHECK2-NEXT: ret ptr [[TMP2]]1151// CHECK2: lpad:1152// CHECK2-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 }1153// CHECK2-NEXT: cleanup1154// CHECK2-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 01155// CHECK2-NEXT: store ptr [[TMP4]], ptr [[EXN_SLOT]], align 81156// CHECK2-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 11157// CHECK2-NEXT: store i32 [[TMP5]], ptr [[EHSELECTOR_SLOT]], align 41158// CHECK2-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]]1159// CHECK2-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1160// CHECK2: arraydestroy.body:1161// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1162// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11163// CHECK2-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1164// CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1165// CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]1166// CHECK2: arraydestroy.done1:1167// CHECK2-NEXT: br label [[EH_RESUME:%.*]]1168// CHECK2: eh.resume:1169// CHECK2-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 81170// CHECK2-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 41171// CHECK2-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 01172// CHECK2-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 11173// CHECK2-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]1174//1175//1176// CHECK2-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..31177// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1178// CHECK2-NEXT: entry:1179// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81180// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81181// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81182// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP1]], i64 21183// CHECK2-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1184// CHECK2: arraydestroy.body:1185// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1186// CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11187// CHECK2-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1188// CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[TMP1]]1189// CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]1190// CHECK2: arraydestroy.done1:1191// CHECK2-NEXT: ret void1192//1193//1194// CHECK2-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..41195// CHECK2-SAME: () #[[ATTR0]] {1196// CHECK2-NEXT: entry:1197// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1198// CHECK2-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc2, ptr @.__kmpc_global_ctor_..2, ptr null, ptr @.__kmpc_global_dtor_..3)1199// CHECK2-NEXT: ret void1200//1201//1202// CHECK2-LABEL: define {{[^@]+}}@_Z3foov1203// CHECK2-SAME: () #[[ATTR1]] {1204// CHECK2-NEXT: entry:1205// CHECK2-NEXT: call void @_Z8mayThrowv()1206// CHECK2-NEXT: ret void1207//1208//1209// CHECK2-LABEL: define {{[^@]+}}@main1210// CHECK2-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 {1211// CHECK2-NEXT: entry:1212// CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 41213// CHECK2-NEXT: [[A:%.*]] = alloca i8, align 11214// CHECK2-NEXT: [[A2:%.*]] = alloca [2 x i8], align 11215// CHECK2-NEXT: [[C:%.*]] = alloca ptr, align 81216// CHECK2-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 81217// CHECK2-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 81218// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 41219// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [5 x ptr], align 81220// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1221// CHECK2-NEXT: store i32 0, ptr [[RETVAL]], align 41222// CHECK2-NEXT: store ptr @tc, ptr [[C]], align 81223// CHECK2-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]])1224// CHECK2-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(16) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc)1225// CHECK2-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])1226// CHECK2-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 01227// CHECK2-NEXT: br i1 [[TMP2]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1228// CHECK2: omp_if.then:1229// CHECK2-NEXT: store i8 2, ptr [[A]], align 11230// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])1231// CHECK2-NEXT: br label [[OMP_IF_END]]1232// CHECK2: omp_if.end:1233// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])1234// CHECK2-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 01235// CHECK2-NEXT: br i1 [[TMP4]], label [[OMP_IF_THEN1:%.*]], label [[OMP_IF_END2:%.*]]1236// CHECK2: omp_if.then1:1237// CHECK2-NEXT: store i8 2, ptr [[A]], align 11238// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])1239// CHECK2-NEXT: br label [[OMP_IF_END2]]1240// CHECK2: omp_if.end2:1241// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])1242// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41243// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])1244// CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 01245// CHECK2-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]]1246// CHECK2: omp_if.then3:1247// CHECK2-NEXT: invoke void @_Z3foov()1248// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]1249// CHECK2: invoke.cont:1250// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])1251// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41252// CHECK2-NEXT: br label [[OMP_IF_END4]]1253// CHECK2: omp_if.end4:1254// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 01255// CHECK2-NEXT: store ptr [[A]], ptr [[TMP7]], align 81256// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 11257// CHECK2-NEXT: store ptr @tc, ptr [[TMP8]], align 81258// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 21259// CHECK2-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.)1260// CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 81261// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 31262// CHECK2-NEXT: store ptr [[A2]], ptr [[TMP11]], align 81263// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 41264// CHECK2-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.)1265// CHECK2-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 81266// CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41267// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]])1268// CHECK2-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 11269// CHECK2-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i321270// CHECK2-NEXT: ret i32 [[CONV]]1271// CHECK2: terminate.lpad:1272// CHECK2-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 }1273// CHECK2-NEXT: catch ptr null1274// CHECK2-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 01275// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR11:[0-9]+]]1276// CHECK2-NEXT: unreachable1277//1278//1279// CHECK2-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev1280// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1281// CHECK2-NEXT: entry:1282// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81283// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81284// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81285// CHECK2-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]])1286// CHECK2-NEXT: ret void1287//1288//1289// CHECK2-LABEL: define {{[^@]+}}@_ZN2SSC1ERi1290// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1291// CHECK2-NEXT: entry:1292// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81293// CHECK2-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 81294// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81295// CHECK2-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 81296// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81297// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 81298// CHECK2-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])1299// CHECK2-NEXT: ret void1300//1301//1302// CHECK2-LABEL: define {{[^@]+}}@__clang_call_terminate1303// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat {1304// CHECK2-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]1305// CHECK2-NEXT: call void @_ZSt9terminatev() #[[ATTR11]]1306// CHECK2-NEXT: unreachable1307//1308//1309// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func1310// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] {1311// CHECK2-NEXT: entry:1312// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81313// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81314// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81315// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81316// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81317// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81318// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 01319// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81320// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 01321// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81322// CHECK2-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 11323// CHECK2-NEXT: store i8 [[TMP8]], ptr [[TMP5]], align 11324// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 11325// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 81326// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 11327// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81328// CHECK2-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP10]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP12]])1329// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 21330// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81331// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 21332// CHECK2-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 81333// CHECK2-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP14]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP16]])1334// CHECK2-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 31335// CHECK2-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 81336// CHECK2-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 31337// CHECK2-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 81338// CHECK2-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP18]], ptr align 1 [[TMP20]], i64 2, i1 false)1339// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 41340// CHECK2-NEXT: [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 81341// CHECK2-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 41342// CHECK2-NEXT: [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 81343// CHECK2-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP22]], i64 21344// CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP22]], [[TMP25]]1345// CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1346// CHECK2: omp.arraycpy.body:1347// CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1348// CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP22]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1349// CHECK2-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])1350// CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11351// CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11352// CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]1353// CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]]1354// CHECK2: omp.arraycpy.done4:1355// CHECK2-NEXT: ret void1356//1357//1358// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_1359// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR2]] comdat align 2 {1360// CHECK2-NEXT: entry:1361// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81362// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81363// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81364// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81365// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81366// CHECK2-NEXT: ret ptr [[THIS1]]1367//1368//1369// CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_singlev1370// CHECK2-SAME: () #[[ATTR2]] {1371// CHECK2-NEXT: entry:1372// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @_Z15parallel_singlev.omp_outlined)1373// CHECK2-NEXT: ret void1374//1375//1376// CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined1377// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR10:[0-9]+]] personality ptr @__gxx_personality_v0 {1378// CHECK2-NEXT: entry:1379// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81380// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81381// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81382// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81383// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81384// CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41385// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]])1386// CHECK2-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 01387// CHECK2-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1388// CHECK2: omp_if.then:1389// CHECK2-NEXT: invoke void @_Z3foov()1390// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]1391// CHECK2: invoke.cont:1392// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]])1393// CHECK2-NEXT: br label [[OMP_IF_END]]1394// CHECK2: omp_if.end:1395// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]])1396// CHECK2-NEXT: ret void1397// CHECK2: terminate.lpad:1398// CHECK2-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 }1399// CHECK2-NEXT: catch ptr null1400// CHECK2-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 01401// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR11]]1402// CHECK2-NEXT: unreachable1403//1404//1405// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev1406// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {1407// CHECK2-NEXT: entry:1408// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81409// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81410// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81411// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 01412// CHECK2-NEXT: store i32 0, ptr [[A]], align 41413// CHECK2-NEXT: ret void1414//1415//1416// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev1417// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {1418// CHECK2-NEXT: entry:1419// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81420// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81421// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81422// CHECK2-NEXT: ret void1423//1424//1425// CHECK2-LABEL: define {{[^@]+}}@_ZN2SSC2ERi1426// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {1427// CHECK2-NEXT: entry:1428// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81429// CHECK2-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 81430// CHECK2-NEXT: [[A2:%.*]] = alloca ptr, align 81431// CHECK2-NEXT: [[B4:%.*]] = alloca i32, align 41432// CHECK2-NEXT: [[C7:%.*]] = alloca ptr, align 81433// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81434// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 81435// CHECK2-NEXT: [[C_CASTED:%.*]] = alloca i64, align 81436// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81437// CHECK2-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 81438// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81439// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 01440// CHECK2-NEXT: store i32 0, ptr [[A]], align 81441// CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 11442// CHECK2-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 41443// CHECK2-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -161444// CHECK2-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 01445// CHECK2-NEXT: store i8 [[BF_SET]], ptr [[B]], align 41446// CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 21447// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 81448// CHECK2-NEXT: store ptr [[TMP0]], ptr [[C]], align 81449// CHECK2-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 01450// CHECK2-NEXT: store ptr [[A3]], ptr [[A2]], align 81451// CHECK2-NEXT: [[B5:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 11452// CHECK2-NEXT: [[BF_LOAD6:%.*]] = load i8, ptr [[B5]], align 41453// CHECK2-NEXT: [[BF_SHL:%.*]] = shl i8 [[BF_LOAD6]], 41454// CHECK2-NEXT: [[BF_ASHR:%.*]] = ashr i8 [[BF_SHL]], 41455// CHECK2-NEXT: [[BF_CAST:%.*]] = sext i8 [[BF_ASHR]] to i321456// CHECK2-NEXT: store i32 [[BF_CAST]], ptr [[B4]], align 41457// CHECK2-NEXT: [[C8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 21458// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[C8]], align 81459// CHECK2-NEXT: store ptr [[TMP1]], ptr [[C7]], align 81460// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A2]], align 81461// CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41462// CHECK2-NEXT: store i32 [[TMP3]], ptr [[A_CASTED]], align 41463// CHECK2-NEXT: [[TMP4:%.*]] = load i64, ptr [[A_CASTED]], align 81464// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[B4]], align 41465// CHECK2-NEXT: store i32 [[TMP5]], ptr [[B_CASTED]], align 41466// CHECK2-NEXT: [[TMP6:%.*]] = load i64, ptr [[B_CASTED]], align 81467// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[C7]], align 81468// CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41469// CHECK2-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 41470// CHECK2-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 81471// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZN2SSC2ERi.omp_outlined, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]])1472// CHECK2-NEXT: ret void1473//1474//1475// CHECK2-LABEL: define {{[^@]+}}@_ZN2SSC2ERi.omp_outlined1476// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {1477// CHECK2-NEXT: entry:1478// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81479// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81480// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81481// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81482// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 81483// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 81484// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 81485// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 81486// CHECK2-NEXT: [[_TMP2:%.*]] = alloca ptr, align 81487// CHECK2-NEXT: [[_TMP3:%.*]] = alloca ptr, align 81488// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 41489// CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 81490// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 81491// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81492// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81493// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81494// CHECK2-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81495// CHECK2-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 81496// CHECK2-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 81497// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81498// CHECK2-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 81499// CHECK2-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 81500// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 81501// CHECK2-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 81502// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 81503// CHECK2-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 81504// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41505// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81506// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 41507// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])1508// CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 01509// CHECK2-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1510// CHECK2: omp_if.then:1511// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 01512// CHECK2-NEXT: store ptr [[TMP0]], ptr [[TMP7]], align 81513// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 11514// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 81515// CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 81516// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 21517// CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 81518// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 31519// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 81520// CHECK2-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 81521// CHECK2-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])1522// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]1523// CHECK2: invoke.cont:1524// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])1525// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41526// CHECK2-NEXT: br label [[OMP_IF_END]]1527// CHECK2: omp_if.end:1528// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 01529// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 81530// CHECK2-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 81531// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 11532// CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 81533// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 21534// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 81535// CHECK2-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 81536// CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41537// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP18]])1538// CHECK2-NEXT: ret void1539// CHECK2: terminate.lpad:1540// CHECK2-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 }1541// CHECK2-NEXT: catch ptr null1542// CHECK2-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 01543// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR11]]1544// CHECK2-NEXT: unreachable1545//1546//1547// CHECK2-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv1548// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 {1549// CHECK2-NEXT: entry:1550// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81551// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81552// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 81553// CHECK2-NEXT: [[C_CASTED:%.*]] = alloca i64, align 81554// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81555// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81556// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 01557// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81558// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 11559// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 81560// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 41561// CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 11562// CHECK2-NEXT: store i32 [[INC]], ptr [[TMP3]], align 41563// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 21564// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 81565// CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 41566// CHECK2-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP7]], -11567// CHECK2-NEXT: store i32 [[DEC]], ptr [[TMP6]], align 41568// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 31569// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81570// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 41571// CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP10]], 11572// CHECK2-NEXT: store i32 [[DIV]], ptr [[TMP9]], align 41573// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 11574// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81575// CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 41576// CHECK2-NEXT: store i32 [[TMP13]], ptr [[A_CASTED]], align 41577// CHECK2-NEXT: [[TMP14:%.*]] = load i64, ptr [[A_CASTED]], align 81578// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 21579// CHECK2-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 81580// CHECK2-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 41581// CHECK2-NEXT: store i32 [[TMP17]], ptr [[B_CASTED]], align 41582// CHECK2-NEXT: [[TMP18:%.*]] = load i64, ptr [[B_CASTED]], align 81583// CHECK2-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 31584// CHECK2-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 81585// CHECK2-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41586// CHECK2-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 41587// CHECK2-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 81588// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]])1589// CHECK2-NEXT: ret void1590//1591//1592// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.51593// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {1594// CHECK2-NEXT: entry:1595// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81596// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81597// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81598// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81599// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81600// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81601// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 01602// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81603// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 01604// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81605// CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41606// CHECK2-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 41607// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 11608// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 81609// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 11610// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81611// CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 41612// CHECK2-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 41613// CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 21614// CHECK2-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 81615// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 21616// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 81617// CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 41618// CHECK2-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 41619// CHECK2-NEXT: ret void1620//1621//1622// CHECK2-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined1623// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] {1624// CHECK2-NEXT: entry:1625// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81626// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81627// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81628// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81629// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 81630// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 81631// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 81632// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 81633// CHECK2-NEXT: [[_TMP2:%.*]] = alloca ptr, align 81634// CHECK2-NEXT: [[_TMP3:%.*]] = alloca ptr, align 81635// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 41636// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 81637// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81638// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81639// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81640// CHECK2-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81641// CHECK2-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 81642// CHECK2-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 81643// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81644// CHECK2-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 81645// CHECK2-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 81646// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 81647// CHECK2-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 81648// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 81649// CHECK2-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 81650// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41651// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81652// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 41653// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])1654// CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 01655// CHECK2-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1656// CHECK2: omp_if.then:1657// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP2]], align 81658// CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41659// CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 11660// CHECK2-NEXT: store i32 [[INC]], ptr [[TMP7]], align 41661// CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR]], align 41662// CHECK2-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP9]], -11663// CHECK2-NEXT: store i32 [[DEC]], ptr [[B_ADDR]], align 41664// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP3]], align 81665// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 41666// CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 11667// CHECK2-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 41668// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])1669// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41670// CHECK2-NEXT: br label [[OMP_IF_END]]1671// CHECK2: omp_if.end:1672// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 01673// CHECK2-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP2]], align 81674// CHECK2-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 81675// CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 11676// CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP14]], align 81677// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 21678// CHECK2-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 81679// CHECK2-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 81680// CHECK2-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41681// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP17]])1682// CHECK2-NEXT: ret void1683//1684//1685// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.61686// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {1687// CHECK2-NEXT: entry:1688// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81689// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81690// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81691// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81692// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81693// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81694// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 01695// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81696// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 01697// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81698// CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41699// CHECK2-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 41700// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 11701// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 81702// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 11703// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81704// CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 41705// CHECK2-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 41706// CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 21707// CHECK2-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 81708// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 21709// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 81710// CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 41711// CHECK2-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 41712// CHECK2-NEXT: ret void1713//1714//1715// CHECK2-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev1716// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {1717// CHECK2-NEXT: entry:1718// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81719// CHECK2-NEXT: [[A2:%.*]] = alloca ptr, align 81720// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81721// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81722// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81723// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 01724// CHECK2-NEXT: store double 0.000000e+00, ptr [[A]], align 81725// CHECK2-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SST]], ptr [[THIS1]], i32 0, i32 01726// CHECK2-NEXT: store ptr [[A3]], ptr [[A2]], align 81727// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A2]], align 81728// CHECK2-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 81729// CHECK2-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 81730// CHECK2-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 81731// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZN3SSTIdEC2Ev.omp_outlined, ptr [[THIS1]], i64 [[TMP2]])1732// CHECK2-NEXT: ret void1733//1734//1735// CHECK2-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev.omp_outlined1736// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {1737// CHECK2-NEXT: entry:1738// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81739// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81740// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81741// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81742// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 81743// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 81744// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 41745// CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 81746// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 81747// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81748// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81749// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81750// CHECK2-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81751// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81752// CHECK2-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 81753// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 81754// CHECK2-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 81755// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41756// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81757// CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41758// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])1759// CHECK2-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 01760// CHECK2-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1761// CHECK2: omp_if.then:1762// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 01763// CHECK2-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 81764// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 11765// CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 81766// CHECK2-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 81767// CHECK2-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])1768// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]1769// CHECK2: invoke.cont:1770// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])1771// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41772// CHECK2-NEXT: br label [[OMP_IF_END]]1773// CHECK2: omp_if.end:1774// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 01775// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 81776// CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 81777// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41778// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP11]])1779// CHECK2-NEXT: ret void1780// CHECK2: terminate.lpad:1781// CHECK2-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 }1782// CHECK2-NEXT: catch ptr null1783// CHECK2-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 01784// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR11]]1785// CHECK2-NEXT: unreachable1786//1787//1788// CHECK2-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv1789// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] align 2 {1790// CHECK2-NEXT: entry:1791// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81792// CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 81793// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81794// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81795// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 01796// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81797// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 01798// CHECK2-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 81799// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 11800// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 11801// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81802// CHECK2-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 81803// CHECK2-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])1804// CHECK2-NEXT: ret void1805//1806//1807// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.71808// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {1809// CHECK2-NEXT: entry:1810// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81811// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81812// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81813// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81814// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81815// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81816// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01817// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81818// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01819// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81820// CHECK2-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 81821// CHECK2-NEXT: store double [[TMP8]], ptr [[TMP5]], align 81822// CHECK2-NEXT: ret void1823//1824//1825// CHECK2-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv1826// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR2]] align 2 {1827// CHECK2-NEXT: entry:1828// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81829// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81830// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81831// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81832// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 01833// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81834// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 11835// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 81836// CHECK2-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 81837// CHECK2-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+001838// CHECK2-NEXT: store double [[INC]], ptr [[TMP3]], align 81839// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 11840// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 81841// CHECK2-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 81842// CHECK2-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 81843// CHECK2-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 81844// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP8]])1845// CHECK2-NEXT: ret void1846//1847//1848// CHECK2-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined1849// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] {1850// CHECK2-NEXT: entry:1851// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81852// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81853// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81854// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81855// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 81856// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 81857// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 41858// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 81859// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81860// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81861// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81862// CHECK2-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81863// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81864// CHECK2-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 81865// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 81866// CHECK2-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 81867// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41868// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81869// CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41870// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])1871// CHECK2-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 01872// CHECK2-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]1873// CHECK2: omp_if.then:1874// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 81875// CHECK2-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 81876// CHECK2-NEXT: [[INC:%.*]] = fadd double [[TMP7]], 1.000000e+001877// CHECK2-NEXT: store double [[INC]], ptr [[TMP6]], align 81878// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])1879// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41880// CHECK2-NEXT: br label [[OMP_IF_END]]1881// CHECK2: omp_if.end:1882// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 01883// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 81884// CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 81885// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 41886// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.8, i32 [[TMP10]])1887// CHECK2-NEXT: ret void1888//1889//1890// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.81891// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {1892// CHECK2-NEXT: entry:1893// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81894// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81895// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81896// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81897// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81898// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81899// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01900// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81901// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01902// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81903// CHECK2-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 81904// CHECK2-NEXT: store double [[TMP8]], ptr [[TMP5]], align 81905// CHECK2-NEXT: ret void1906//1907//1908// CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp1909// CHECK2-SAME: () #[[ATTR0]] {1910// CHECK2-NEXT: entry:1911// CHECK2-NEXT: call void @__cxx_global_var_init()1912// CHECK2-NEXT: call void @__cxx_global_var_init.1()1913// CHECK2-NEXT: call void @.__omp_threadprivate_init_.()1914// CHECK2-NEXT: call void @.__omp_threadprivate_init_..4()1915// CHECK2-NEXT: ret void1916//1917//1918// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init1919// CHECK4-SAME: () #[[ATTR0:[0-9]+]] {1920// CHECK4-NEXT: entry:1921// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])1922// CHECK4-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc, ptr @.__kmpc_global_ctor_., ptr null, ptr @.__kmpc_global_dtor_.)1923// CHECK4-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc)1924// CHECK4-NEXT: [[TMP1:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3:[0-9]+]]1925// CHECK4-NEXT: ret void1926//1927//1928// CHECK4-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.1929// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1930// CHECK4-NEXT: entry:1931// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81932// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81933// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81934// CHECK4-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]])1935// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81936// CHECK4-NEXT: ret ptr [[TMP2]]1937//1938//1939// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev1940// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {1941// CHECK4-NEXT: entry:1942// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81943// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81944// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81945// CHECK4-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1946// CHECK4-NEXT: ret void1947//1948//1949// CHECK4-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.1950// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {1951// CHECK4-NEXT: entry:1952// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81953// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81954// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 81955// CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]]) #[[ATTR3]]1956// CHECK4-NEXT: ret void1957//1958//1959// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev1960// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] comdat align 2 {1961// CHECK4-NEXT: entry:1962// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81963// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81964// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81965// CHECK4-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]]1966// CHECK4-NEXT: ret void1967//1968//1969// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_var_init.11970// CHECK4-SAME: () #[[ATTR0]] personality ptr @__gxx_personality_v0 {1971// CHECK4-NEXT: entry:1972// CHECK4-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 81973// CHECK4-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 41974// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1975// CHECK4-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc2, ptr @.__kmpc_global_ctor_..2, ptr null, ptr @.__kmpc_global_dtor_..3)1976// CHECK4-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1977// CHECK4: arrayctor.loop:1978// CHECK4-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]1979// CHECK4-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1980// CHECK4-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]1981// CHECK4: invoke.cont:1982// CHECK4-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 11983// CHECK4-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2)1984// CHECK4-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1985// CHECK4: arrayctor.cont:1986// CHECK4-NEXT: [[TMP1:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]]1987// CHECK4-NEXT: ret void1988// CHECK4: lpad:1989// CHECK4-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 }1990// CHECK4-NEXT: cleanup1991// CHECK4-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 01992// CHECK4-NEXT: store ptr [[TMP3]], ptr [[EXN_SLOT]], align 81993// CHECK4-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP2]], 11994// CHECK4-NEXT: store i32 [[TMP4]], ptr [[EHSELECTOR_SLOT]], align 41995// CHECK4-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]]1996// CHECK4-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1997// CHECK4: arraydestroy.body:1998// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1999// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12000// CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2001// CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc22002// CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]2003// CHECK4: arraydestroy.done1:2004// CHECK4-NEXT: br label [[EH_RESUME:%.*]]2005// CHECK4: eh.resume:2006// CHECK4-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 82007// CHECK4-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 42008// CHECK4-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 02009// CHECK4-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 12010// CHECK4-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]2011//2012//2013// CHECK4-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..22014// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] personality ptr @__gxx_personality_v0 {2015// CHECK4-NEXT: entry:2016// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82017// CHECK4-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 82018// CHECK4-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 42019// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82020// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 82021// CHECK4-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TMP1]], i32 0, i32 02022// CHECK4-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAY_BEGIN]], i64 22023// CHECK4-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]2024// CHECK4: arrayctor.loop:2025// CHECK4-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ]2026// CHECK4-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2027// CHECK4-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]]2028// CHECK4: invoke.cont:2029// CHECK4-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 12030// CHECK4-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]2031// CHECK4-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]2032// CHECK4: arrayctor.cont:2033// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82034// CHECK4-NEXT: ret ptr [[TMP2]]2035// CHECK4: lpad:2036// CHECK4-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 }2037// CHECK4-NEXT: cleanup2038// CHECK4-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 02039// CHECK4-NEXT: store ptr [[TMP4]], ptr [[EXN_SLOT]], align 82040// CHECK4-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 12041// CHECK4-NEXT: store i32 [[TMP5]], ptr [[EHSELECTOR_SLOT]], align 42042// CHECK4-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]]2043// CHECK4-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]]2044// CHECK4: arraydestroy.body:2045// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2046// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12047// CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2048// CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]2049// CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]]2050// CHECK4: arraydestroy.done1:2051// CHECK4-NEXT: br label [[EH_RESUME:%.*]]2052// CHECK4: eh.resume:2053// CHECK4-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 82054// CHECK4-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 42055// CHECK4-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 02056// CHECK4-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 12057// CHECK4-NEXT: resume { ptr, i32 } [[LPAD_VAL2]]2058//2059//2060// CHECK4-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..32061// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {2062// CHECK4-NEXT: entry:2063// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82064// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82065// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 82066// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP1]], i64 22067// CHECK4-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2068// CHECK4: arraydestroy.body:2069// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2070// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12071// CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2072// CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[TMP1]]2073// CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]2074// CHECK4: arraydestroy.done1:2075// CHECK4-NEXT: ret void2076//2077//2078// CHECK4-LABEL: define {{[^@]+}}@__cxx_global_array_dtor2079// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] {2080// CHECK4-NEXT: entry:2081// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82082// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82083// CHECK4-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2084// CHECK4: arraydestroy.body:2085// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2086// CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12087// CHECK4-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2088// CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc22089// CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]]2090// CHECK4: arraydestroy.done1:2091// CHECK4-NEXT: ret void2092//2093//2094// CHECK4-LABEL: define {{[^@]+}}@_Z3foov2095// CHECK4-SAME: () #[[ATTR1]] {2096// CHECK4-NEXT: entry:2097// CHECK4-NEXT: call void @_Z8mayThrowv()2098// CHECK4-NEXT: ret void2099//2100//2101// CHECK4-LABEL: define {{[^@]+}}@main2102// CHECK4-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 {2103// CHECK4-NEXT: entry:2104// CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 42105// CHECK4-NEXT: [[A:%.*]] = alloca i8, align 12106// CHECK4-NEXT: [[A2:%.*]] = alloca [2 x i8], align 12107// CHECK4-NEXT: [[C:%.*]] = alloca ptr, align 82108// CHECK4-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 82109// CHECK4-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 82110// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 42111// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [5 x ptr], align 82112// CHECK4-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2113// CHECK4-NEXT: store i32 0, ptr [[RETVAL]], align 42114// CHECK4-NEXT: store ptr @tc, ptr [[C]], align 82115// CHECK4-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]])2116// CHECK4-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(16) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc)2117// CHECK4-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])2118// CHECK4-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 02119// CHECK4-NEXT: br i1 [[TMP2]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2120// CHECK4: omp_if.then:2121// CHECK4-NEXT: store i8 2, ptr [[A]], align 12122// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])2123// CHECK4-NEXT: br label [[OMP_IF_END]]2124// CHECK4: omp_if.end:2125// CHECK4-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])2126// CHECK4-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 02127// CHECK4-NEXT: br i1 [[TMP4]], label [[OMP_IF_THEN1:%.*]], label [[OMP_IF_END2:%.*]]2128// CHECK4: omp_if.then1:2129// CHECK4-NEXT: store i8 2, ptr [[A]], align 12130// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])2131// CHECK4-NEXT: br label [[OMP_IF_END2]]2132// CHECK4: omp_if.end2:2133// CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])2134// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42135// CHECK4-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])2136// CHECK4-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 02137// CHECK4-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]]2138// CHECK4: omp_if.then3:2139// CHECK4-NEXT: invoke void @_Z3foov()2140// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]2141// CHECK4: invoke.cont:2142// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])2143// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42144// CHECK4-NEXT: br label [[OMP_IF_END4]]2145// CHECK4: omp_if.end4:2146// CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 02147// CHECK4-NEXT: store ptr [[A]], ptr [[TMP7]], align 82148// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 12149// CHECK4-NEXT: store ptr @tc, ptr [[TMP8]], align 82150// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 22151// CHECK4-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.)2152// CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 82153// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 32154// CHECK4-NEXT: store ptr [[A2]], ptr [[TMP11]], align 82155// CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 42156// CHECK4-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.)2157// CHECK4-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82158// CHECK4-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42159// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]])2160// CHECK4-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 12161// CHECK4-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i322162// CHECK4-NEXT: ret i32 [[CONV]]2163// CHECK4: terminate.lpad:2164// CHECK4-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 }2165// CHECK4-NEXT: catch ptr null2166// CHECK4-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 02167// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR11:[0-9]+]]2168// CHECK4-NEXT: unreachable2169//2170//2171// CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev2172// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2173// CHECK4-NEXT: entry:2174// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82175// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82176// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82177// CHECK4-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]])2178// CHECK4-NEXT: ret void2179//2180//2181// CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC1ERi2182// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2183// CHECK4-NEXT: entry:2184// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82185// CHECK4-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 82186// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82187// CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 82188// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82189// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 82190// CHECK4-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]])2191// CHECK4-NEXT: ret void2192//2193//2194// CHECK4-LABEL: define {{[^@]+}}@__clang_call_terminate2195// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] comdat {2196// CHECK4-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]2197// CHECK4-NEXT: call void @_ZSt9terminatev() #[[ATTR11]]2198// CHECK4-NEXT: unreachable2199//2200//2201// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func2202// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] {2203// CHECK4-NEXT: entry:2204// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82205// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82206// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82207// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82208// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82209// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82210// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 02211// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82212// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 02213// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82214// CHECK4-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 12215// CHECK4-NEXT: store i8 [[TMP8]], ptr [[TMP5]], align 12216// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 12217// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 82218// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 12219// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 82220// CHECK4-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP10]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP12]])2221// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 22222// CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 82223// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 22224// CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 82225// CHECK4-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP14]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP16]])2226// CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 32227// CHECK4-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 82228// CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 32229// CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 82230// CHECK4-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP18]], ptr align 1 [[TMP20]], i64 2, i1 false)2231// CHECK4-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 42232// CHECK4-NEXT: [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 82233// CHECK4-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 42234// CHECK4-NEXT: [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 82235// CHECK4-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP22]], i64 22236// CHECK4-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP22]], [[TMP25]]2237// CHECK4-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2238// CHECK4: omp.arraycpy.body:2239// CHECK4-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2240// CHECK4-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP22]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2241// CHECK4-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2242// CHECK4-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12243// CHECK4-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12244// CHECK4-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]2245// CHECK4-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]]2246// CHECK4: omp.arraycpy.done4:2247// CHECK4-NEXT: ret void2248//2249//2250// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_2251// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR2]] comdat align 2 {2252// CHECK4-NEXT: entry:2253// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82254// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82255// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82256// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82257// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82258// CHECK4-NEXT: ret ptr [[THIS1]]2259//2260//2261// CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev2262// CHECK4-SAME: () #[[ATTR2]] {2263// CHECK4-NEXT: entry:2264// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @_Z15parallel_singlev.omp_outlined)2265// CHECK4-NEXT: ret void2266//2267//2268// CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined2269// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR10:[0-9]+]] personality ptr @__gxx_personality_v0 {2270// CHECK4-NEXT: entry:2271// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82272// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82273// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82274// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82275// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82276// CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42277// CHECK4-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]])2278// CHECK4-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 02279// CHECK4-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2280// CHECK4: omp_if.then:2281// CHECK4-NEXT: invoke void @_Z3foov()2282// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]2283// CHECK4: invoke.cont:2284// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]])2285// CHECK4-NEXT: br label [[OMP_IF_END]]2286// CHECK4: omp_if.end:2287// CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]])2288// CHECK4-NEXT: ret void2289// CHECK4: terminate.lpad:2290// CHECK4-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 }2291// CHECK4-NEXT: catch ptr null2292// CHECK4-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 02293// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR11]]2294// CHECK4-NEXT: unreachable2295//2296//2297// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev2298// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {2299// CHECK4-NEXT: entry:2300// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82301// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82302// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82303// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 02304// CHECK4-NEXT: store i32 0, ptr [[A]], align 42305// CHECK4-NEXT: ret void2306//2307//2308// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev2309// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {2310// CHECK4-NEXT: entry:2311// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82312// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82313// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82314// CHECK4-NEXT: ret void2315//2316//2317// CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC2ERi2318// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {2319// CHECK4-NEXT: entry:2320// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82321// CHECK4-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 82322// CHECK4-NEXT: [[A2:%.*]] = alloca ptr, align 82323// CHECK4-NEXT: [[B4:%.*]] = alloca i32, align 42324// CHECK4-NEXT: [[C7:%.*]] = alloca ptr, align 82325// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 82326// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i64, align 82327// CHECK4-NEXT: [[C_CASTED:%.*]] = alloca i64, align 82328// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82329// CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 82330// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82331// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 02332// CHECK4-NEXT: store i32 0, ptr [[A]], align 82333// CHECK4-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 12334// CHECK4-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 42335// CHECK4-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -162336// CHECK4-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 02337// CHECK4-NEXT: store i8 [[BF_SET]], ptr [[B]], align 42338// CHECK4-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 22339// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 82340// CHECK4-NEXT: store ptr [[TMP0]], ptr [[C]], align 82341// CHECK4-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02342// CHECK4-NEXT: store ptr [[A3]], ptr [[A2]], align 82343// CHECK4-NEXT: [[B5:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 12344// CHECK4-NEXT: [[BF_LOAD6:%.*]] = load i8, ptr [[B5]], align 42345// CHECK4-NEXT: [[BF_SHL:%.*]] = shl i8 [[BF_LOAD6]], 42346// CHECK4-NEXT: [[BF_ASHR:%.*]] = ashr i8 [[BF_SHL]], 42347// CHECK4-NEXT: [[BF_CAST:%.*]] = sext i8 [[BF_ASHR]] to i322348// CHECK4-NEXT: store i32 [[BF_CAST]], ptr [[B4]], align 42349// CHECK4-NEXT: [[C8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 22350// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[C8]], align 82351// CHECK4-NEXT: store ptr [[TMP1]], ptr [[C7]], align 82352// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A2]], align 82353// CHECK4-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42354// CHECK4-NEXT: store i32 [[TMP3]], ptr [[A_CASTED]], align 42355// CHECK4-NEXT: [[TMP4:%.*]] = load i64, ptr [[A_CASTED]], align 82356// CHECK4-NEXT: [[TMP5:%.*]] = load i32, ptr [[B4]], align 42357// CHECK4-NEXT: store i32 [[TMP5]], ptr [[B_CASTED]], align 42358// CHECK4-NEXT: [[TMP6:%.*]] = load i64, ptr [[B_CASTED]], align 82359// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[C7]], align 82360// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42361// CHECK4-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 42362// CHECK4-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 82363// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZN2SSC2ERi.omp_outlined, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]])2364// CHECK4-NEXT: ret void2365//2366//2367// CHECK4-LABEL: define {{[^@]+}}@_ZN2SSC2ERi.omp_outlined2368// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {2369// CHECK4-NEXT: entry:2370// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82371// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82372// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82373// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 82374// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 82375// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 82376// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 82377// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82378// CHECK4-NEXT: [[_TMP2:%.*]] = alloca ptr, align 82379// CHECK4-NEXT: [[_TMP3:%.*]] = alloca ptr, align 82380// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 42381// CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 82382// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 82383// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82384// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82385// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82386// CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 82387// CHECK4-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 82388// CHECK4-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 82389// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82390// CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 82391// CHECK4-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 82392// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82393// CHECK4-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 82394// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82395// CHECK4-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 82396// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42397// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82398// CHECK4-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 42399// CHECK4-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])2400// CHECK4-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 02401// CHECK4-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2402// CHECK4: omp_if.then:2403// CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 02404// CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP7]], align 82405// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 12406// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 82407// CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 82408// CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 22409// CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 82410// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 32411// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 82412// CHECK4-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 82413// CHECK4-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])2414// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]2415// CHECK4: invoke.cont:2416// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])2417// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42418// CHECK4-NEXT: br label [[OMP_IF_END]]2419// CHECK4: omp_if.end:2420// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 02421// CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 82422// CHECK4-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 82423// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 12424// CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 82425// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 22426// CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 82427// CHECK4-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 82428// CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42429// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.4, i32 [[TMP18]])2430// CHECK4-NEXT: ret void2431// CHECK4: terminate.lpad:2432// CHECK4-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 }2433// CHECK4-NEXT: catch ptr null2434// CHECK4-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 02435// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR11]]2436// CHECK4-NEXT: unreachable2437//2438//2439// CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv2440// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 {2441// CHECK4-NEXT: entry:2442// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82443// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 82444// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i64, align 82445// CHECK4-NEXT: [[C_CASTED:%.*]] = alloca i64, align 82446// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82447// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82448// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 02449// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 82450// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 12451// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 82452// CHECK4-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 42453// CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 12454// CHECK4-NEXT: store i32 [[INC]], ptr [[TMP3]], align 42455// CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 22456// CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 82457// CHECK4-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 42458// CHECK4-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP7]], -12459// CHECK4-NEXT: store i32 [[DEC]], ptr [[TMP6]], align 42460// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 32461// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 82462// CHECK4-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 42463// CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP10]], 12464// CHECK4-NEXT: store i32 [[DIV]], ptr [[TMP9]], align 42465// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 12466// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 82467// CHECK4-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 42468// CHECK4-NEXT: store i32 [[TMP13]], ptr [[A_CASTED]], align 42469// CHECK4-NEXT: [[TMP14:%.*]] = load i64, ptr [[A_CASTED]], align 82470// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 22471// CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 82472// CHECK4-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 42473// CHECK4-NEXT: store i32 [[TMP17]], ptr [[B_CASTED]], align 42474// CHECK4-NEXT: [[TMP18:%.*]] = load i64, ptr [[B_CASTED]], align 82475// CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 32476// CHECK4-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 82477// CHECK4-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42478// CHECK4-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 42479// CHECK4-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 82480// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]])2481// CHECK4-NEXT: ret void2482//2483//2484// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.42485// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {2486// CHECK4-NEXT: entry:2487// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82488// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82489// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82490// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82491// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82492// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82493// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 02494// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82495// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 02496// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82497// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42498// CHECK4-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 42499// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 12500// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 82501// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 12502// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 82503// CHECK4-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 42504// CHECK4-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 42505// CHECK4-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 22506// CHECK4-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 82507// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 22508// CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 82509// CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 42510// CHECK4-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 42511// CHECK4-NEXT: ret void2512//2513//2514// CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined2515// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] {2516// CHECK4-NEXT: entry:2517// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82518// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82519// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82520// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 82521// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 82522// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 82523// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 82524// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82525// CHECK4-NEXT: [[_TMP2:%.*]] = alloca ptr, align 82526// CHECK4-NEXT: [[_TMP3:%.*]] = alloca ptr, align 82527// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 42528// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 82529// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82530// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82531// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82532// CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 82533// CHECK4-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 82534// CHECK4-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 82535// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82536// CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 82537// CHECK4-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 82538// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82539// CHECK4-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 82540// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82541// CHECK4-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 82542// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42543// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82544// CHECK4-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 42545// CHECK4-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP4]])2546// CHECK4-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 02547// CHECK4-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2548// CHECK4: omp_if.then:2549// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP2]], align 82550// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42551// CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 12552// CHECK4-NEXT: store i32 [[INC]], ptr [[TMP7]], align 42553// CHECK4-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR]], align 42554// CHECK4-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP9]], -12555// CHECK4-NEXT: store i32 [[DEC]], ptr [[B_ADDR]], align 42556// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP3]], align 82557// CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 42558// CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 12559// CHECK4-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 42560// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]])2561// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42562// CHECK4-NEXT: br label [[OMP_IF_END]]2563// CHECK4: omp_if.end:2564// CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 02565// CHECK4-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP2]], align 82566// CHECK4-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82567// CHECK4-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 12568// CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP14]], align 82569// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 22570// CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 82571// CHECK4-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 82572// CHECK4-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42573// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP17]])2574// CHECK4-NEXT: ret void2575//2576//2577// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.52578// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {2579// CHECK4-NEXT: entry:2580// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82581// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82582// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82583// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82584// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82585// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82586// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 02587// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82588// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 02589// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82590// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42591// CHECK4-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 42592// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 12593// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 82594// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 12595// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 82596// CHECK4-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 42597// CHECK4-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 42598// CHECK4-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 22599// CHECK4-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 82600// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 22601// CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 82602// CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 42603// CHECK4-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 42604// CHECK4-NEXT: ret void2605//2606//2607// CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev2608// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 {2609// CHECK4-NEXT: entry:2610// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82611// CHECK4-NEXT: [[A2:%.*]] = alloca ptr, align 82612// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 82613// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82614// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82615// CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 02616// CHECK4-NEXT: store double 0.000000e+00, ptr [[A]], align 82617// CHECK4-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SST]], ptr [[THIS1]], i32 0, i32 02618// CHECK4-NEXT: store ptr [[A3]], ptr [[A2]], align 82619// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A2]], align 82620// CHECK4-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 82621// CHECK4-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 82622// CHECK4-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 82623// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZN3SSTIdEC2Ev.omp_outlined, ptr [[THIS1]], i64 [[TMP2]])2624// CHECK4-NEXT: ret void2625//2626//2627// CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev.omp_outlined2628// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 {2629// CHECK4-NEXT: entry:2630// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82631// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82632// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82633// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 82634// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 82635// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82636// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 42637// CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 82638// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 82639// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82640// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82641// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82642// CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 82643// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82644// CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 82645// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82646// CHECK4-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82647// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42648// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82649// CHECK4-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42650// CHECK4-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])2651// CHECK4-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 02652// CHECK4-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2653// CHECK4: omp_if.then:2654// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 02655// CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 82656// CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 12657// CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 82658// CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 82659// CHECK4-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])2660// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]2661// CHECK4: invoke.cont:2662// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])2663// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42664// CHECK4-NEXT: br label [[OMP_IF_END]]2665// CHECK4: omp_if.end:2666// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 02667// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 82668// CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 82669// CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42670// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP11]])2671// CHECK4-NEXT: ret void2672// CHECK4: terminate.lpad:2673// CHECK4-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 }2674// CHECK4-NEXT: catch ptr null2675// CHECK4-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 02676// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR11]]2677// CHECK4-NEXT: unreachable2678//2679//2680// CHECK4-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv2681// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] align 2 {2682// CHECK4-NEXT: entry:2683// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82684// CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 82685// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82686// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82687// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 02688// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 82689// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 02690// CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 82691// CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 12692// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 12693// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82694// CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 82695// CHECK4-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])2696// CHECK4-NEXT: ret void2697//2698//2699// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.62700// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {2701// CHECK4-NEXT: entry:2702// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82703// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82704// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82705// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82706// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82707// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82708// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02709// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82710// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02711// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82712// CHECK4-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 82713// CHECK4-NEXT: store double [[TMP8]], ptr [[TMP5]], align 82714// CHECK4-NEXT: ret void2715//2716//2717// CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv2718// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR2]] align 2 {2719// CHECK4-NEXT: entry:2720// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82721// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 82722// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82723// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82724// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 02725// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 82726// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 12727// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 82728// CHECK4-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 82729// CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+002730// CHECK4-NEXT: store double [[INC]], ptr [[TMP3]], align 82731// CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 12732// CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 82733// CHECK4-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 82734// CHECK4-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 82735// CHECK4-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 82736// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP8]])2737// CHECK4-NEXT: ret void2738//2739//2740// CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined2741// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] {2742// CHECK4-NEXT: entry:2743// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82744// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82745// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82746// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 82747// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 82748// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82749// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 42750// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 82751// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82752// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82753// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82754// CHECK4-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 82755// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82756// CHECK4-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 82757// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82758// CHECK4-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82759// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42760// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82761// CHECK4-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42762// CHECK4-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP3]])2763// CHECK4-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 02764// CHECK4-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]2765// CHECK4: omp_if.then:2766// CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 82767// CHECK4-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 82768// CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP7]], 1.000000e+002769// CHECK4-NEXT: store double [[INC]], ptr [[TMP6]], align 82770// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]])2771// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42772// CHECK4-NEXT: br label [[OMP_IF_END]]2773// CHECK4: omp_if.end:2774// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 02775// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 82776// CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 82777// CHECK4-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 42778// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP10]])2779// CHECK4-NEXT: ret void2780//2781//2782// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.72783// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] {2784// CHECK4-NEXT: entry:2785// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82786// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82787// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82788// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82789// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82790// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82791// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02792// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82793// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02794// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82795// CHECK4-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 82796// CHECK4-NEXT: store double [[TMP8]], ptr [[TMP5]], align 82797// CHECK4-NEXT: ret void2798//2799//2800// CHECK4-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp2801// CHECK4-SAME: () #[[ATTR0]] {2802// CHECK4-NEXT: entry:2803// CHECK4-NEXT: call void @__cxx_global_var_init()2804// CHECK4-NEXT: call void @__cxx_global_var_init.1()2805// CHECK4-NEXT: ret void2806//2807//2808// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_.2809// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG6:![0-9]+]] {2810// CHECK5-NEXT: entry:2811// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82812// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82813// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG10:![0-9]+]]2814// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]]), !dbg [[DBG11:![0-9]+]]2815// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG10]]2816// CHECK5-NEXT: ret ptr [[TMP2]], !dbg [[DBG10]]2817//2818//2819// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC1Ev2820// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 !dbg [[DBG12:![0-9]+]] {2821// CHECK5-NEXT: entry:2822// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82823// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82824// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82825// CHECK5-NEXT: call void @_ZN9TestClassC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]), !dbg [[DBG13:![0-9]+]]2826// CHECK5-NEXT: ret void, !dbg [[DBG14:![0-9]+]]2827//2828//2829// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_.2830// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG15:![0-9]+]] {2831// CHECK5-NEXT: entry:2832// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82833// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82834// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG16:![0-9]+]]2835// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TMP1]]) #[[ATTR3:[0-9]+]], !dbg [[DBG16]]2836// CHECK5-NEXT: ret void, !dbg [[DBG17:![0-9]+]]2837//2838//2839// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD1Ev2840// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2:[0-9]+]] align 2 !dbg [[DBG18:![0-9]+]] {2841// CHECK5-NEXT: entry:2842// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82843// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82844// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82845// CHECK5-NEXT: call void @_ZN9TestClassD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR3]], !dbg [[DBG19:![0-9]+]]2846// CHECK5-NEXT: ret void, !dbg [[DBG20:![0-9]+]]2847//2848//2849// CHECK5-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_.2850// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG21:![0-9]+]] {2851// CHECK5-NEXT: entry:2852// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]]), !dbg [[DBG22:![0-9]+]]2853// CHECK5-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB1]], ptr @tc, ptr @.__kmpc_global_ctor_., ptr null, ptr @.__kmpc_global_dtor_.), !dbg [[DBG22]]2854// CHECK5-NEXT: ret void, !dbg [[DBG22]]2855//2856//2857// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_ctor_..12858// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality ptr @__gxx_personality_v0 !dbg [[DBG23:![0-9]+]] {2859// CHECK5-NEXT: entry:2860// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82861// CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 82862// CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 42863// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82864// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG24:![0-9]+]]2865// CHECK5-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %class.TestClass], ptr [[TMP1]], i32 0, i32 0, !dbg [[DBG25:![0-9]+]]2866// CHECK5-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAY_BEGIN]], i64 2, !dbg [[DBG25]]2867// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG25]]2868// CHECK5: arrayctor.loop:2869// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG25]]2870// CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2871// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG25]]2872// CHECK5: invoke.cont:2873// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG25]]2874// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]], !dbg [[DBG25]]2875// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG25]]2876// CHECK5: arrayctor.cont:2877// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG24]]2878// CHECK5-NEXT: ret ptr [[TMP2]], !dbg [[DBG24]]2879// CHECK5: lpad:2880// CHECK5-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 }2881// CHECK5-NEXT: cleanup, !dbg [[DBG26:![0-9]+]]2882// CHECK5-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 0, !dbg [[DBG26]]2883// CHECK5-NEXT: store ptr [[TMP4]], ptr [[EXN_SLOT]], align 8, !dbg [[DBG26]]2884// CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 1, !dbg [[DBG26]]2885// CHECK5-NEXT: store i32 [[TMP5]], ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG26]]2886// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[ARRAYCTOR_CUR]], !dbg [[DBG25]]2887// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG25]]2888// CHECK5: arraydestroy.body:2889// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG25]]2890// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG25]]2891// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG25]]2892// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]], !dbg [[DBG25]]2893// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG25]]2894// CHECK5: arraydestroy.done1:2895// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG25]]2896// CHECK5: eh.resume:2897// CHECK5-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8, !dbg [[DBG25]]2898// CHECK5-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG25]]2899// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0, !dbg [[DBG25]]2900// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG25]]2901// CHECK5-NEXT: resume { ptr, i32 } [[LPAD_VAL2]], !dbg [[DBG25]]2902//2903//2904// CHECK5-LABEL: define {{[^@]+}}@.__kmpc_global_dtor_..22905// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG27:![0-9]+]] {2906// CHECK5-NEXT: entry:2907// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82908// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82909// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG28:![0-9]+]]2910// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP1]], i64 2, !dbg [[DBG28]]2911// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG28]]2912// CHECK5: arraydestroy.body:2913// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG28]]2914// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG28]]2915// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG28]]2916// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[TMP1]], !dbg [[DBG28]]2917// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG28]]2918// CHECK5: arraydestroy.done1:2919// CHECK5-NEXT: ret void, !dbg [[DBG29:![0-9]+]]2920//2921//2922// CHECK5-LABEL: define {{[^@]+}}@.__omp_threadprivate_init_..32923// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG30:![0-9]+]] {2924// CHECK5-NEXT: entry:2925// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB3:[0-9]+]]), !dbg [[DBG31:![0-9]+]]2926// CHECK5-NEXT: call void @__kmpc_threadprivate_register(ptr @[[GLOB3]], ptr @tc2, ptr @.__kmpc_global_ctor_..1, ptr null, ptr @.__kmpc_global_dtor_..2), !dbg [[DBG31]]2927// CHECK5-NEXT: ret void, !dbg [[DBG31]]2928//2929//2930// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init2931// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG32:![0-9]+]] {2932// CHECK5-NEXT: entry:2933// CHECK5-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG33:![0-9]+]]2934// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN9TestClassD1Ev, ptr @tc, ptr @__dso_handle) #[[ATTR3]], !dbg [[DBG35:![0-9]+]]2935// CHECK5-NEXT: ret void, !dbg [[DBG33]]2936//2937//2938// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_var_init.42939// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" personality ptr @__gxx_personality_v0 !dbg [[DBG36:![0-9]+]] {2940// CHECK5-NEXT: entry:2941// CHECK5-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 82942// CHECK5-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 42943// CHECK5-NEXT: br label [[ARRAYCTOR_LOOP:%.*]], !dbg [[DBG37:![0-9]+]]2944// CHECK5: arrayctor.loop:2945// CHECK5-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ @tc2, [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[INVOKE_CONT:%.*]] ], !dbg [[DBG37]]2946// CHECK5-NEXT: invoke void @_ZN9TestClassC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2947// CHECK5-NEXT: to label [[INVOKE_CONT]] unwind label [[LPAD:%.*]], !dbg [[DBG37]]2948// CHECK5: invoke.cont:2949// CHECK5-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[ARRAYCTOR_CUR]], i64 1, !dbg [[DBG37]]2950// CHECK5-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], getelementptr inbounds ([[CLASS_TESTCLASS]], ptr @tc2, i64 2), !dbg [[DBG37]]2951// CHECK5-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]], !dbg [[DBG37]]2952// CHECK5: arrayctor.cont:2953// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @__cxx_global_array_dtor, ptr null, ptr @__dso_handle) #[[ATTR3]], !dbg [[DBG39:![0-9]+]]2954// CHECK5-NEXT: ret void, !dbg [[DBG39]]2955// CHECK5: lpad:2956// CHECK5-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 }2957// CHECK5-NEXT: cleanup, !dbg [[DBG40:![0-9]+]]2958// CHECK5-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0, !dbg [[DBG40]]2959// CHECK5-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8, !dbg [[DBG40]]2960// CHECK5-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1, !dbg [[DBG40]]2961// CHECK5-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG40]]2962// CHECK5-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr @tc2, [[ARRAYCTOR_CUR]], !dbg [[DBG37]]2963// CHECK5-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG37]]2964// CHECK5: arraydestroy.body:2965// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[ARRAYCTOR_CUR]], [[LPAD]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG37]]2966// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG37]]2967// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG37]]2968// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG37]]2969// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG37]]2970// CHECK5: arraydestroy.done1:2971// CHECK5-NEXT: br label [[EH_RESUME:%.*]], !dbg [[DBG37]]2972// CHECK5: eh.resume:2973// CHECK5-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8, !dbg [[DBG37]]2974// CHECK5-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4, !dbg [[DBG37]]2975// CHECK5-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } poison, ptr [[EXN]], 0, !dbg [[DBG37]]2976// CHECK5-NEXT: [[LPAD_VAL2:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[SEL]], 1, !dbg [[DBG37]]2977// CHECK5-NEXT: resume { ptr, i32 } [[LPAD_VAL2]], !dbg [[DBG37]]2978//2979//2980// CHECK5-LABEL: define {{[^@]+}}@__cxx_global_array_dtor2981// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG41:![0-9]+]] {2982// CHECK5-NEXT: entry:2983// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82984// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82985// CHECK5-NEXT: br label [[ARRAYDESTROY_BODY:%.*]], !dbg [[DBG42:![0-9]+]]2986// CHECK5: arraydestroy.body:2987// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ getelementptr inbounds ([[CLASS_TESTCLASS:%.*]], ptr @tc2, i64 2), [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ], !dbg [[DBG42]]2988// CHECK5-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1, !dbg [[DBG42]]2989// CHECK5-NEXT: call void @_ZN9TestClassD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]], !dbg [[DBG42]]2990// CHECK5-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], @tc2, !dbg [[DBG42]]2991// CHECK5-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]], !dbg [[DBG42]]2992// CHECK5: arraydestroy.done1:2993// CHECK5-NEXT: ret void, !dbg [[DBG42]]2994//2995//2996// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev2997// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG43:![0-9]+]] {2998// CHECK5-NEXT: entry:2999// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83000// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83001// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83002// CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG44:![0-9]+]]3003// CHECK5-NEXT: store i32 0, ptr [[A]], align 4, !dbg [[DBG44]]3004// CHECK5-NEXT: ret void, !dbg [[DBG45:![0-9]+]]3005//3006//3007// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassD2Ev3008// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG46:![0-9]+]] {3009// CHECK5-NEXT: entry:3010// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83011// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83012// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83013// CHECK5-NEXT: ret void, !dbg [[DBG47:![0-9]+]]3014//3015//3016// CHECK5-LABEL: define {{[^@]+}}@_Z3foov3017// CHECK5-SAME: () #[[ATTR1]] !dbg [[DBG48:![0-9]+]] {3018// CHECK5-NEXT: entry:3019// CHECK5-NEXT: call void @_Z8mayThrowv(), !dbg [[DBG49:![0-9]+]]3020// CHECK5-NEXT: ret void, !dbg [[DBG50:![0-9]+]]3021//3022//3023// CHECK5-LABEL: define {{[^@]+}}@main3024// CHECK5-SAME: () #[[ATTR5:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG51:![0-9]+]] {3025// CHECK5-NEXT: entry:3026// CHECK5-NEXT: [[RETVAL:%.*]] = alloca i32, align 43027// CHECK5-NEXT: [[A:%.*]] = alloca i8, align 13028// CHECK5-NEXT: [[A2:%.*]] = alloca [2 x i8], align 13029// CHECK5-NEXT: [[C:%.*]] = alloca ptr, align 83030// CHECK5-NEXT: [[SST:%.*]] = alloca [[STRUCT_SST:%.*]], align 83031// CHECK5-NEXT: [[SS:%.*]] = alloca [[STRUCT_SS:%.*]], align 83032// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43033// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [5 x ptr], align 83034// CHECK5-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB5:[0-9]+]]), !dbg [[DBG52:![0-9]+]]3035// CHECK5-NEXT: store i32 0, ptr [[RETVAL]], align 43036// CHECK5-NEXT: store ptr @tc, ptr [[C]], align 8, !dbg [[DBG53:![0-9]+]]3037// CHECK5-NEXT: call void @_ZN3SSTIdEC1Ev(ptr noundef nonnull align 8 dereferenceable(8) [[SST]]), !dbg [[DBG54:![0-9]+]]3038// CHECK5-NEXT: call void @_ZN2SSC1ERi(ptr noundef nonnull align 8 dereferenceable(16) [[SS]], ptr noundef nonnull align 4 dereferenceable(4) @tc), !dbg [[DBG55:![0-9]+]]3039// CHECK5-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB5]], i32 [[TMP0]]), !dbg [[DBG52]]3040// CHECK5-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !dbg [[DBG52]]3041// CHECK5-NEXT: br i1 [[TMP2]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG52]]3042// CHECK5: omp_if.then:3043// CHECK5-NEXT: store i8 2, ptr [[A]], align 1, !dbg [[DBG56:![0-9]+]]3044// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB5]], i32 [[TMP0]]), !dbg [[DBG57:![0-9]+]]3045// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG57]]3046// CHECK5: omp_if.end:3047// CHECK5-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB7:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG58:![0-9]+]]3048// CHECK5-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0, !dbg [[DBG58]]3049// CHECK5-NEXT: br i1 [[TMP4]], label [[OMP_IF_THEN1:%.*]], label [[OMP_IF_END2:%.*]], !dbg [[DBG58]]3050// CHECK5: omp_if.then1:3051// CHECK5-NEXT: store i8 2, ptr [[A]], align 1, !dbg [[DBG59:![0-9]+]]3052// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB7]], i32 [[TMP0]]), !dbg [[DBG60:![0-9]+]]3053// CHECK5-NEXT: br label [[OMP_IF_END2]], !dbg [[DBG60]]3054// CHECK5: omp_if.end2:3055// CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB8:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG61:![0-9]+]]3056// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG62:![0-9]+]]3057// CHECK5-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB10:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG62]]3058// CHECK5-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG62]]3059// CHECK5-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]], !dbg [[DBG62]]3060// CHECK5: omp_if.then3:3061// CHECK5-NEXT: invoke void @_Z3foov()3062// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG63:![0-9]+]]3063// CHECK5: invoke.cont:3064// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB10]], i32 [[TMP0]]), !dbg [[DBG63]]3065// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]]3066// CHECK5-NEXT: br label [[OMP_IF_END4]], !dbg [[DBG63]]3067// CHECK5: omp_if.end4:3068// CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG63]]3069// CHECK5-NEXT: store ptr [[A]], ptr [[TMP7]], align 8, !dbg [[DBG63]]3070// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG63]]3071// CHECK5-NEXT: store ptr @tc, ptr [[TMP8]], align 8, !dbg [[DBG63]]3072// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG63]]3073// CHECK5-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB12:[0-9]+]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.), !dbg [[DBG64:![0-9]+]]3074// CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG63]]3075// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3, !dbg [[DBG63]]3076// CHECK5-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8, !dbg [[DBG63]]3077// CHECK5-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4, !dbg [[DBG63]]3078// CHECK5-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB14:[0-9]+]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.), !dbg [[DBG65:![0-9]+]]3079// CHECK5-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !dbg [[DBG63]]3080// CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]]3081// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB10]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]), !dbg [[DBG63]]3082// CHECK5-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG66:![0-9]+]]3083// CHECK5-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32, !dbg [[DBG66]]3084// CHECK5-NEXT: ret i32 [[CONV]], !dbg [[DBG67:![0-9]+]]3085// CHECK5: terminate.lpad:3086// CHECK5-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 }3087// CHECK5-NEXT: catch ptr null, !dbg [[DBG63]]3088// CHECK5-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0, !dbg [[DBG63]]3089// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR11:[0-9]+]], !dbg [[DBG63]]3090// CHECK5-NEXT: unreachable, !dbg [[DBG63]]3091//3092//3093// CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev3094// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG68:![0-9]+]] {3095// CHECK5-NEXT: entry:3096// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83097// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83098// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83099// CHECK5-NEXT: call void @_ZN3SSTIdEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) [[THIS1]]), !dbg [[DBG69:![0-9]+]]3100// CHECK5-NEXT: ret void, !dbg [[DBG70:![0-9]+]]3101//3102//3103// CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC1ERi3104// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG71:![0-9]+]] {3105// CHECK5-NEXT: entry:3106// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83107// CHECK5-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 83108// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83109// CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 83110// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83111// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG72:![0-9]+]]3112// CHECK5-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG72]]3113// CHECK5-NEXT: ret void, !dbg [[DBG73:![0-9]+]]3114//3115//3116// CHECK5-LABEL: define {{[^@]+}}@__clang_call_terminate3117// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] {3118// CHECK5-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]]3119// CHECK5-NEXT: call void @_ZSt9terminatev() #[[ATTR11]]3120// CHECK5-NEXT: unreachable3121//3122//3123// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func3124// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] !dbg [[DBG74:![0-9]+]] {3125// CHECK5-NEXT: entry:3126// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83127// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83128// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83129// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83130// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG75:![0-9]+]]3131// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG75]]3132// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG75]]3133// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG75]]3134// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG75]]3135// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG75]]3136// CHECK5-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 1, !dbg [[DBG76:![0-9]+]]3137// CHECK5-NEXT: store i8 [[TMP8]], ptr [[TMP5]], align 1, !dbg [[DBG76]]3138// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 1, !dbg [[DBG75]]3139// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8, !dbg [[DBG75]]3140// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 1, !dbg [[DBG75]]3141// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8, !dbg [[DBG75]]3142// CHECK5-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP10]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP12]]), !dbg [[DBG77:![0-9]+]]3143// CHECK5-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 2, !dbg [[DBG75]]3144// CHECK5-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8, !dbg [[DBG75]]3145// CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG75]]3146// CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8, !dbg [[DBG75]]3147// CHECK5-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP14]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP16]]), !dbg [[DBG78:![0-9]+]]3148// CHECK5-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 3, !dbg [[DBG75]]3149// CHECK5-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP17]], align 8, !dbg [[DBG75]]3150// CHECK5-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 3, !dbg [[DBG75]]3151// CHECK5-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8, !dbg [[DBG75]]3152// CHECK5-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP18]], ptr align 1 [[TMP20]], i64 2, i1 false), !dbg [[DBG75]]3153// CHECK5-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 4, !dbg [[DBG75]]3154// CHECK5-NEXT: [[TMP22:%.*]] = load ptr, ptr [[TMP21]], align 8, !dbg [[DBG75]]3155// CHECK5-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP3]], i64 0, i64 4, !dbg [[DBG75]]3156// CHECK5-NEXT: [[TMP24:%.*]] = load ptr, ptr [[TMP23]], align 8, !dbg [[DBG75]]3157// CHECK5-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP22]], i64 2, !dbg [[DBG75]]3158// CHECK5-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP22]], [[TMP25]], !dbg [[DBG75]]3159// CHECK5-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]], !dbg [[DBG75]]3160// CHECK5: omp.arraycpy.body:3161// CHECK5-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ], !dbg [[DBG75]]3162// CHECK5-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP22]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ], !dbg [[DBG75]]3163// CHECK5-NEXT: [[CALL3:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN9TestClassaSERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]]), !dbg [[DBG79:![0-9]+]]3164// CHECK5-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1, !dbg [[DBG75]]3165// CHECK5-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1, !dbg [[DBG75]]3166// CHECK5-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]], !dbg [[DBG75]]3167// CHECK5-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]], !dbg [[DBG75]]3168// CHECK5: omp.arraycpy.done4:3169// CHECK5-NEXT: ret void, !dbg [[DBG79]]3170//3171//3172// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_3173// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG80:![0-9]+]] {3174// CHECK5-NEXT: entry:3175// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83176// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83177// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83178// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83179// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83180// CHECK5-NEXT: ret ptr [[THIS1]], !dbg [[DBG81:![0-9]+]]3181//3182//3183// CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev3184// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG82:![0-9]+]] {3185// CHECK5-NEXT: entry:3186// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83187// CHECK5-NEXT: [[A2:%.*]] = alloca ptr, align 83188// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 83189// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83190// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83191// CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SST:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG83:![0-9]+]]3192// CHECK5-NEXT: store double 0.000000e+00, ptr [[A]], align 8, !dbg [[DBG83]]3193// CHECK5-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SST]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG84:![0-9]+]]3194// CHECK5-NEXT: store ptr [[A3]], ptr [[A2]], align 8, !dbg [[DBG84]]3195// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A2]], align 8, !dbg [[DBG85:![0-9]+]]3196// CHECK5-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8, !dbg [[DBG86:![0-9]+]]3197// CHECK5-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8, !dbg [[DBG86]]3198// CHECK5-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG86]]3199// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB18:[0-9]+]], i32 2, ptr @_ZN3SSTIdEC2Ev.omp_outlined, ptr [[THIS1]], i64 [[TMP2]]), !dbg [[DBG86]]3200// CHECK5-NEXT: ret void, !dbg [[DBG87:![0-9]+]]3201//3202//3203// CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC2Ev.omp_outlined3204// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG88:![0-9]+]] {3205// CHECK5-NEXT: entry:3206// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83207// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83208// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83209// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 83210// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 83211// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83212// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43213// CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 83214// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 83215// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83216// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83217// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83218// CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 83219// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG89:![0-9]+]]3220// CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG89]]3221// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG90:![0-9]+]]3222// CHECK5-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 8, !dbg [[DBG91:![0-9]+]]3223// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG91]]3224// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG91]]3225// CHECK5-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG91]]3226// CHECK5-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB16:[0-9]+]], i32 [[TMP3]]), !dbg [[DBG91]]3227// CHECK5-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0, !dbg [[DBG91]]3228// CHECK5-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG91]]3229// CHECK5: omp_if.then:3230// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG92:![0-9]+]]3231// CHECK5-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8, !dbg [[DBG92]]3232// CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG92]]3233// CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG93:![0-9]+]]3234// CHECK5-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8, !dbg [[DBG92]]3235// CHECK5-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])3236// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG92]]3237// CHECK5: invoke.cont:3238// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB16]], i32 [[TMP3]]), !dbg [[DBG92]]3239// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]]3240// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG92]]3241// CHECK5: omp_if.end:3242// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG92]]3243// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG94:![0-9]+]]3244// CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG92]]3245// CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]]3246// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB16]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP11]]), !dbg [[DBG92]]3247// CHECK5-NEXT: ret void, !dbg [[DBG95:![0-9]+]]3248// CHECK5: terminate.lpad:3249// CHECK5-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 }3250// CHECK5-NEXT: catch ptr null, !dbg [[DBG92]]3251// CHECK5-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0, !dbg [[DBG92]]3252// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR11]], !dbg [[DBG92]]3253// CHECK5-NEXT: unreachable, !dbg [[DBG92]]3254//3255//3256// CHECK5-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv3257// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] align 2 !dbg [[DBG96:![0-9]+]] {3258// CHECK5-NEXT: entry:3259// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83260// CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 83261// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83262// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83263// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 03264// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 83265// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG97:![0-9]+]]3266// CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8, !dbg [[DBG97]]3267// CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG97]]3268// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG98:![0-9]+]]3269// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG98]]3270// CHECK5-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8, !dbg [[DBG97]]3271// CHECK5-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]), !dbg [[DBG97]]3272// CHECK5-NEXT: ret void, !dbg [[DBG99:![0-9]+]]3273//3274//3275// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.53276// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG100:![0-9]+]] {3277// CHECK5-NEXT: entry:3278// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83279// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83280// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83281// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83282// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG101:![0-9]+]]3283// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG101]]3284// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG101]]3285// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG101]]3286// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG101]]3287// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG101]]3288// CHECK5-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8, !dbg [[DBG102:![0-9]+]]3289// CHECK5-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8, !dbg [[DBG102]]3290// CHECK5-NEXT: ret void, !dbg [[DBG102]]3291//3292//3293// CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv3294// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG105:![0-9]+]] {3295// CHECK5-NEXT: entry:3296// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83297// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 83298// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83299// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83300// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 03301// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 83302// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG106:![0-9]+]]3303// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG106]]3304// CHECK5-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8, !dbg [[DBG107:![0-9]+]]3305// CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00, !dbg [[DBG107]]3306// CHECK5-NEXT: store double [[INC]], ptr [[TMP3]], align 8, !dbg [[DBG107]]3307// CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG108:![0-9]+]]3308// CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG108]]3309// CHECK5-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8, !dbg [[DBG109:![0-9]+]]3310// CHECK5-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8, !dbg [[DBG109]]3311// CHECK5-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG109]]3312// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB22:[0-9]+]], i32 2, ptr @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP8]]), !dbg [[DBG109]]3313// CHECK5-NEXT: ret void, !dbg [[DBG110:![0-9]+]]3314//3315//3316// CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv.omp_outlined3317// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR10]] !dbg [[DBG111:![0-9]+]] {3318// CHECK5-NEXT: entry:3319// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83320// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83321// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83322// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 83323// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 83324// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83325// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43326// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [1 x ptr], align 83327// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83328// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83329// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83330// CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 83331// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG112:![0-9]+]]3332// CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG112]]3333// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG113:![0-9]+]]3334// CHECK5-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 8, !dbg [[DBG114:![0-9]+]]3335// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG114]]3336// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG114]]3337// CHECK5-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG114]]3338// CHECK5-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB20:[0-9]+]], i32 [[TMP3]]), !dbg [[DBG114]]3339// CHECK5-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0, !dbg [[DBG114]]3340// CHECK5-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG114]]3341// CHECK5: omp_if.then:3342// CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG113]]3343// CHECK5-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8, !dbg [[DBG115:![0-9]+]]3344// CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP7]], 1.000000e+00, !dbg [[DBG115]]3345// CHECK5-NEXT: store double [[INC]], ptr [[TMP6]], align 8, !dbg [[DBG115]]3346// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB20]], i32 [[TMP3]]), !dbg [[DBG115]]3347// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG115]]3348// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG115]]3349// CHECK5: omp_if.end:3350// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG115]]3351// CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG116:![0-9]+]]3352// CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG115]]3353// CHECK5-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG115]]3354// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB20]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP10]]), !dbg [[DBG115]]3355// CHECK5-NEXT: ret void, !dbg [[DBG117:![0-9]+]]3356//3357//3358// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.63359// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG118:![0-9]+]] {3360// CHECK5-NEXT: entry:3361// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83362// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83363// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83364// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83365// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG119:![0-9]+]]3366// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG119]]3367// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG119]]3368// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG119]]3369// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG119]]3370// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG119]]3371// CHECK5-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8, !dbg [[DBG120:![0-9]+]]3372// CHECK5-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8, !dbg [[DBG120]]3373// CHECK5-NEXT: ret void, !dbg [[DBG120]]3374//3375//3376// CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC2ERi3377// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) unnamed_addr #[[ATTR2]] align 2 !dbg [[DBG121:![0-9]+]] {3378// CHECK5-NEXT: entry:3379// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83380// CHECK5-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 83381// CHECK5-NEXT: [[A2:%.*]] = alloca ptr, align 83382// CHECK5-NEXT: [[B4:%.*]] = alloca i32, align 43383// CHECK5-NEXT: [[C7:%.*]] = alloca ptr, align 83384// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 83385// CHECK5-NEXT: [[B_CASTED:%.*]] = alloca i64, align 83386// CHECK5-NEXT: [[C_CASTED:%.*]] = alloca i64, align 83387// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83388// CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 83389// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83390// CHECK5-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG122:![0-9]+]]3391// CHECK5-NEXT: store i32 0, ptr [[A]], align 8, !dbg [[DBG122]]3392// CHECK5-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG123:![0-9]+]]3393// CHECK5-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 4, !dbg [[DBG123]]3394// CHECK5-NEXT: [[BF_CLEAR:%.*]] = and i8 [[BF_LOAD]], -16, !dbg [[DBG123]]3395// CHECK5-NEXT: [[BF_SET:%.*]] = or i8 [[BF_CLEAR]], 0, !dbg [[DBG123]]3396// CHECK5-NEXT: store i8 [[BF_SET]], ptr [[B]], align 4, !dbg [[DBG123]]3397// CHECK5-NEXT: [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG124:![0-9]+]]3398// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG125:![0-9]+]]3399// CHECK5-NEXT: store ptr [[TMP0]], ptr [[C]], align 8, !dbg [[DBG124]]3400// CHECK5-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 0, !dbg [[DBG126:![0-9]+]]3401// CHECK5-NEXT: store ptr [[A3]], ptr [[A2]], align 8, !dbg [[DBG126]]3402// CHECK5-NEXT: [[B5:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG127:![0-9]+]]3403// CHECK5-NEXT: [[BF_LOAD6:%.*]] = load i8, ptr [[B5]], align 4, !dbg [[DBG127]]3404// CHECK5-NEXT: [[BF_SHL:%.*]] = shl i8 [[BF_LOAD6]], 4, !dbg [[DBG127]]3405// CHECK5-NEXT: [[BF_ASHR:%.*]] = ashr i8 [[BF_SHL]], 4, !dbg [[DBG127]]3406// CHECK5-NEXT: [[BF_CAST:%.*]] = sext i8 [[BF_ASHR]] to i32, !dbg [[DBG127]]3407// CHECK5-NEXT: store i32 [[BF_CAST]], ptr [[B4]], align 4, !dbg [[DBG127]]3408// CHECK5-NEXT: [[C8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG128:![0-9]+]]3409// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[C8]], align 8, !dbg [[DBG128]]3410// CHECK5-NEXT: store ptr [[TMP1]], ptr [[C7]], align 8, !dbg [[DBG128]]3411// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A2]], align 8, !dbg [[DBG129:![0-9]+]]3412// CHECK5-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG130:![0-9]+]]3413// CHECK5-NEXT: store i32 [[TMP3]], ptr [[A_CASTED]], align 4, !dbg [[DBG130]]3414// CHECK5-NEXT: [[TMP4:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG130]]3415// CHECK5-NEXT: [[TMP5:%.*]] = load i32, ptr [[B4]], align 4, !dbg [[DBG130]]3416// CHECK5-NEXT: store i32 [[TMP5]], ptr [[B_CASTED]], align 4, !dbg [[DBG130]]3417// CHECK5-NEXT: [[TMP6:%.*]] = load i64, ptr [[B_CASTED]], align 8, !dbg [[DBG130]]3418// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[C7]], align 8, !dbg [[DBG131:![0-9]+]]3419// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG130]]3420// CHECK5-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4, !dbg [[DBG130]]3421// CHECK5-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG130]]3422// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB26:[0-9]+]], i32 4, ptr @_ZN2SSC2ERi.omp_outlined, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]), !dbg [[DBG130]]3423// CHECK5-NEXT: ret void, !dbg [[DBG132:![0-9]+]]3424//3425//3426// CHECK5-LABEL: define {{[^@]+}}@_ZN2SSC2ERi.omp_outlined3427// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 !dbg [[DBG133:![0-9]+]] {3428// CHECK5-NEXT: entry:3429// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83430// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83431// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83432// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 83433// CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 83434// CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 83435// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 83436// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83437// CHECK5-NEXT: [[_TMP2:%.*]] = alloca ptr, align 83438// CHECK5-NEXT: [[_TMP3:%.*]] = alloca ptr, align 83439// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43440// CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 83441// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 83442// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83443// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83444// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83445// CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 83446// CHECK5-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 83447// CHECK5-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 83448// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG134:![0-9]+]]3449// CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG134]]3450// CHECK5-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 8, !dbg [[DBG134]]3451// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG135:![0-9]+]]3452// CHECK5-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 8, !dbg [[DBG136:![0-9]+]]3453// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG137:![0-9]+]]3454// CHECK5-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 8, !dbg [[DBG136]]3455// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG136]]3456// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG136]]3457// CHECK5-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4, !dbg [[DBG136]]3458// CHECK5-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB24:[0-9]+]], i32 [[TMP4]]), !dbg [[DBG136]]3459// CHECK5-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG136]]3460// CHECK5-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG136]]3461// CHECK5: omp_if.then:3462// CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG138:![0-9]+]]3463// CHECK5-NEXT: store ptr [[TMP0]], ptr [[TMP7]], align 8, !dbg [[DBG138]]3464// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG138]]3465// CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG139:![0-9]+]]3466// CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG138]]3467// CHECK5-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG138]]3468// CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8, !dbg [[DBG138]]3469// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3, !dbg [[DBG138]]3470// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG139]]3471// CHECK5-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8, !dbg [[DBG138]]3472// CHECK5-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])3473// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG138]]3474// CHECK5: invoke.cont:3475// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB24]], i32 [[TMP4]]), !dbg [[DBG138]]3476// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]]3477// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG138]]3478// CHECK5: omp_if.end:3479// CHECK5-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG138]]3480// CHECK5-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG140:![0-9]+]]3481// CHECK5-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8, !dbg [[DBG138]]3482// CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG138]]3483// CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8, !dbg [[DBG138]]3484// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG138]]3485// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG141:![0-9]+]]3486// CHECK5-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8, !dbg [[DBG138]]3487// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]]3488// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB24]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP18]]), !dbg [[DBG138]]3489// CHECK5-NEXT: ret void, !dbg [[DBG142:![0-9]+]]3490// CHECK5: terminate.lpad:3491// CHECK5-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 }3492// CHECK5-NEXT: catch ptr null, !dbg [[DBG138]]3493// CHECK5-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0, !dbg [[DBG138]]3494// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR11]], !dbg [[DBG138]]3495// CHECK5-NEXT: unreachable, !dbg [[DBG138]]3496//3497//3498// CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv3499// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR2]] align 2 !dbg [[DBG143:![0-9]+]] {3500// CHECK5-NEXT: entry:3501// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83502// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 83503// CHECK5-NEXT: [[B_CASTED:%.*]] = alloca i64, align 83504// CHECK5-NEXT: [[C_CASTED:%.*]] = alloca i64, align 83505// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83506// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83507// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 03508// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 83509// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG144:![0-9]+]]3510// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG144]]3511// CHECK5-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4, !dbg [[DBG145:![0-9]+]]3512// CHECK5-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1, !dbg [[DBG145]]3513// CHECK5-NEXT: store i32 [[INC]], ptr [[TMP3]], align 4, !dbg [[DBG145]]3514// CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG146:![0-9]+]]3515// CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG146]]3516// CHECK5-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4, !dbg [[DBG147:![0-9]+]]3517// CHECK5-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP7]], -1, !dbg [[DBG147]]3518// CHECK5-NEXT: store i32 [[DEC]], ptr [[TMP6]], align 4, !dbg [[DBG147]]3519// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG148:![0-9]+]]3520// CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8, !dbg [[DBG148]]3521// CHECK5-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4, !dbg [[DBG149:![0-9]+]]3522// CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP10]], 1, !dbg [[DBG149]]3523// CHECK5-NEXT: store i32 [[DIV]], ptr [[TMP9]], align 4, !dbg [[DBG149]]3524// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG150:![0-9]+]]3525// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8, !dbg [[DBG150]]3526// CHECK5-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4, !dbg [[DBG151:![0-9]+]]3527// CHECK5-NEXT: store i32 [[TMP13]], ptr [[A_CASTED]], align 4, !dbg [[DBG151]]3528// CHECK5-NEXT: [[TMP14:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG151]]3529// CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 2, !dbg [[DBG152:![0-9]+]]3530// CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 8, !dbg [[DBG152]]3531// CHECK5-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 4, !dbg [[DBG151]]3532// CHECK5-NEXT: store i32 [[TMP17]], ptr [[B_CASTED]], align 4, !dbg [[DBG151]]3533// CHECK5-NEXT: [[TMP18:%.*]] = load i64, ptr [[B_CASTED]], align 8, !dbg [[DBG151]]3534// CHECK5-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 3, !dbg [[DBG153:![0-9]+]]3535// CHECK5-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP19]], align 8, !dbg [[DBG153]]3536// CHECK5-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4, !dbg [[DBG151]]3537// CHECK5-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4, !dbg [[DBG151]]3538// CHECK5-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG151]]3539// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB30:[0-9]+]], i32 4, ptr @_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]), !dbg [[DBG151]]3540// CHECK5-NEXT: ret void, !dbg [[DBG154:![0-9]+]]3541//3542//3543// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.73544// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG155:![0-9]+]] {3545// CHECK5-NEXT: entry:3546// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83547// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83548// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83549// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83550// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG156:![0-9]+]]3551// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG156]]3552// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG156]]3553// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG156]]3554// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG156]]3555// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG156]]3556// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG157:![0-9]+]]3557// CHECK5-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 4, !dbg [[DBG157]]3558// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 1, !dbg [[DBG156]]3559// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8, !dbg [[DBG156]]3560// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 1, !dbg [[DBG156]]3561// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8, !dbg [[DBG156]]3562// CHECK5-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4, !dbg [[DBG158:![0-9]+]]3563// CHECK5-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 4, !dbg [[DBG158]]3564// CHECK5-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 2, !dbg [[DBG156]]3565// CHECK5-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8, !dbg [[DBG156]]3566// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG156]]3567// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG156]]3568// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG159:![0-9]+]]3569// CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG159]]3570// CHECK5-NEXT: ret void, !dbg [[DBG159]]3571//3572//3573// CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv.omp_outlined3574// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR10]] !dbg [[DBG160:![0-9]+]] {3575// CHECK5-NEXT: entry:3576// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83577// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83578// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83579// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 83580// CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 83581// CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 83582// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 83583// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83584// CHECK5-NEXT: [[_TMP2:%.*]] = alloca ptr, align 83585// CHECK5-NEXT: [[_TMP3:%.*]] = alloca ptr, align 83586// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43587// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [3 x ptr], align 83588// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83589// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83590// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83591// CHECK5-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 83592// CHECK5-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 83593// CHECK5-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 83594// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8, !dbg [[DBG161:![0-9]+]]3595// CHECK5-NEXT: store ptr [[A_ADDR]], ptr [[TMP]], align 8, !dbg [[DBG161]]3596// CHECK5-NEXT: store ptr [[C_ADDR]], ptr [[_TMP1]], align 8, !dbg [[DBG161]]3597// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8, !dbg [[DBG162:![0-9]+]]3598// CHECK5-NEXT: store ptr [[TMP1]], ptr [[_TMP2]], align 8, !dbg [[DBG163:![0-9]+]]3599// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG164:![0-9]+]]3600// CHECK5-NEXT: store ptr [[TMP2]], ptr [[_TMP3]], align 8, !dbg [[DBG163]]3601// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG163]]3602// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG163]]3603// CHECK5-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4, !dbg [[DBG163]]3604// CHECK5-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB28:[0-9]+]], i32 [[TMP4]]), !dbg [[DBG163]]3605// CHECK5-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG163]]3606// CHECK5-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG163]]3607// CHECK5: omp_if.then:3608// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG162]]3609// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG165:![0-9]+]]3610// CHECK5-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 1, !dbg [[DBG165]]3611// CHECK5-NEXT: store i32 [[INC]], ptr [[TMP7]], align 4, !dbg [[DBG165]]3612// CHECK5-NEXT: [[TMP9:%.*]] = load i32, ptr [[B_ADDR]], align 4, !dbg [[DBG166:![0-9]+]]3613// CHECK5-NEXT: [[DEC:%.*]] = add nsw i32 [[TMP9]], -1, !dbg [[DBG166]]3614// CHECK5-NEXT: store i32 [[DEC]], ptr [[B_ADDR]], align 4, !dbg [[DBG166]]3615// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG164]]3616// CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG167:![0-9]+]]3617// CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP11]], 1, !dbg [[DBG167]]3618// CHECK5-NEXT: store i32 [[DIV]], ptr [[TMP10]], align 4, !dbg [[DBG167]]3619// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB28]], i32 [[TMP4]]), !dbg [[DBG165]]3620// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG165]]3621// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG165]]3622// CHECK5: omp_if.end:3623// CHECK5-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG165]]3624// CHECK5-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG168:![0-9]+]]3625// CHECK5-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !dbg [[DBG165]]3626// CHECK5-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG165]]3627// CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP14]], align 8, !dbg [[DBG165]]3628// CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG165]]3629// CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG169:![0-9]+]]3630// CHECK5-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8, !dbg [[DBG165]]3631// CHECK5-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG165]]3632// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB28]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.8, i32 [[TMP17]]), !dbg [[DBG165]]3633// CHECK5-NEXT: ret void, !dbg [[DBG170:![0-9]+]]3634//3635//3636// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.83637// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG171:![0-9]+]] {3638// CHECK5-NEXT: entry:3639// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83640// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83641// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83642// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83643// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG172:![0-9]+]]3644// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG172]]3645// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG172]]3646// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG172]]3647// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG172]]3648// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG172]]3649// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG173:![0-9]+]]3650// CHECK5-NEXT: store i32 [[TMP8]], ptr [[TMP5]], align 4, !dbg [[DBG173]]3651// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 1, !dbg [[DBG172]]3652// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8, !dbg [[DBG172]]3653// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 1, !dbg [[DBG172]]3654// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 8, !dbg [[DBG172]]3655// CHECK5-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4, !dbg [[DBG174:![0-9]+]]3656// CHECK5-NEXT: store i32 [[TMP13]], ptr [[TMP10]], align 4, !dbg [[DBG174]]3657// CHECK5-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 2, !dbg [[DBG172]]3658// CHECK5-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8, !dbg [[DBG172]]3659// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG172]]3660// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG172]]3661// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG175:![0-9]+]]3662// CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG175]]3663// CHECK5-NEXT: ret void, !dbg [[DBG175]]3664//3665//3666// CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev3667// CHECK5-SAME: () #[[ATTR2]] !dbg [[DBG176:![0-9]+]] {3668// CHECK5-NEXT: entry:3669// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB35:[0-9]+]], i32 0, ptr @_Z15parallel_singlev.omp_outlined), !dbg [[DBG177:![0-9]+]]3670// CHECK5-NEXT: ret void, !dbg [[DBG178:![0-9]+]]3671//3672//3673// CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev.omp_outlined3674// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR10]] personality ptr @__gxx_personality_v0 !dbg [[DBG179:![0-9]+]] {3675// CHECK5-NEXT: entry:3676// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83677// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83678// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83679// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83680// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG180:![0-9]+]]3681// CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG180]]3682// CHECK5-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB32:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG180]]3683// CHECK5-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0, !dbg [[DBG180]]3684// CHECK5-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG180]]3685// CHECK5: omp_if.then:3686// CHECK5-NEXT: invoke void @_Z3foov()3687// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG181:![0-9]+]]3688// CHECK5: invoke.cont:3689// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB32]], i32 [[TMP1]]), !dbg [[DBG181]]3690// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG181]]3691// CHECK5: omp_if.end:3692// CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB33:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG182:![0-9]+]]3693// CHECK5-NEXT: ret void, !dbg [[DBG182]]3694// CHECK5: terminate.lpad:3695// CHECK5-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 }3696// CHECK5-NEXT: catch ptr null, !dbg [[DBG181]]3697// CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0, !dbg [[DBG181]]3698// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR11]], !dbg [[DBG181]]3699// CHECK5-NEXT: unreachable, !dbg [[DBG181]]3700//3701//3702// CHECK5-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp3703// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG183:![0-9]+]] {3704// CHECK5-NEXT: entry:3705// CHECK5-NEXT: call void @__cxx_global_var_init(), !dbg [[DBG184:![0-9]+]]3706// CHECK5-NEXT: call void @__cxx_global_var_init.4(), !dbg [[DBG184]]3707// CHECK5-NEXT: call void @.__omp_threadprivate_init_.(), !dbg [[DBG184]]3708// CHECK5-NEXT: call void @.__omp_threadprivate_init_..3(), !dbg [[DBG184]]3709// CHECK5-NEXT: ret void3710//3711//3712// CHECK6-LABEL: define {{[^@]+}}@_Z10array_funciPiP2St3713// CHECK6-SAME: (i32 noundef [[N:%.*]], ptr noundef [[A:%.*]], ptr noundef [[S:%.*]]) #[[ATTR0:[0-9]+]] {3714// CHECK6-NEXT: entry:3715// CHECK6-NEXT: [[N_ADDR:%.*]] = alloca i32, align 43716// CHECK6-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 83717// CHECK6-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 83718// CHECK6-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 43719// CHECK6-NEXT: [[DOTOMP_COPYPRIVATE_CPR_LIST:%.*]] = alloca [2 x ptr], align 83720// CHECK6-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])3721// CHECK6-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 43722// CHECK6-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 83723// CHECK6-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 83724// CHECK6-NEXT: [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 43725// CHECK6-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i643726// CHECK6-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 43727// CHECK6-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]])3728// CHECK6-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 03729// CHECK6-NEXT: br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]3730// CHECK6: omp_if.then:3731// CHECK6-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]])3732// CHECK6-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 43733// CHECK6-NEXT: br label [[OMP_IF_END]]3734// CHECK6: omp_if.end:3735// CHECK6-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 03736// CHECK6-NEXT: store ptr [[A_ADDR]], ptr [[TMP5]], align 83737// CHECK6-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 13738// CHECK6-NEXT: store ptr [[S_ADDR]], ptr [[TMP6]], align 83739// CHECK6-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 43740// CHECK6-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 16, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP7]])3741// CHECK6-NEXT: ret void3742//3743//3744// CHECK6-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func3745// CHECK6-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {3746// CHECK6-NEXT: entry:3747// CHECK6-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83748// CHECK6-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83749// CHECK6-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83750// CHECK6-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83751// CHECK6-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83752// CHECK6-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83753// CHECK6-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 03754// CHECK6-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83755// CHECK6-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 03756// CHECK6-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83757// CHECK6-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 83758// CHECK6-NEXT: store ptr [[TMP8]], ptr [[TMP5]], align 83759// CHECK6-NEXT: [[TMP9:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 13760// CHECK6-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 83761// CHECK6-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 13762// CHECK6-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 83763// CHECK6-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 83764// CHECK6-NEXT: store ptr [[TMP13]], ptr [[TMP10]], align 83765// CHECK6-NEXT: ret void3766//3767