Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
clang/test/OpenMP/single_codegen.cpp
Show First 20 Lines • Show All 355 Lines • ▼ Show 20 Lines | |||||
// CHECK1-NEXT: br label [[OMP_IF_END2]] | // CHECK1-NEXT: br label [[OMP_IF_END2]] | ||||
// CHECK1: omp_if.end2: | // CHECK1: omp_if.end2: | ||||
// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | ||||
// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | // CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | ||||
// CHECK1-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | // CHECK1-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | ||||
// CHECK1: omp_if.then3: | // CHECK1: omp_if.then3: | ||||
// CHECK1-NEXT: invoke void @_Z3foov() | // CHECK1-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK1: invoke.cont: | |||||
// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: br label [[OMP_IF_END4]] | // CHECK1-NEXT: br label [[OMP_IF_END4]] | ||||
// CHECK1: omp_if.end4: | // CHECK1: omp_if.end4: | ||||
// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK1-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | // CHECK1-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | ||||
// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK1-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | // CHECK1-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | ||||
// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK1-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | // CHECK1-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | ||||
// CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | // CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | ||||
// CHECK1-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | // CHECK1-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | ||||
// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | ||||
// CHECK1-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | // CHECK1-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | ||||
// CHECK1-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | // CHECK1-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | ||||
// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | // CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | ||||
// CHECK1-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | // CHECK1-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | ||||
// CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | // CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | ||||
// CHECK1-NEXT: ret i32 [[CONV]] | // CHECK1-NEXT: ret i32 [[CONV]] | ||||
// CHECK1: terminate.lpad: | |||||
// CHECK1-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK1-NEXT: catch ptr null | |||||
// CHECK1-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0 | |||||
// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR13:[0-9]+]] | |||||
// CHECK1-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | // CHECK1-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | ||||
// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
Show All 9 Lines | |||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | ||||
// CHECK1-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | // CHECK1-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate | |||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR8:[0-9]+]] comdat { | |||||
// CHECK1-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] | |||||
// CHECK1-NEXT: call void @_ZSt9terminatev() #[[ATTR13]] | |||||
// CHECK1-NEXT: unreachable | |||||
// | |||||
// | |||||
// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | // CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | ||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] { | // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 32 Lines | |||||
// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | ||||
// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | ||||
// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | ||||
// CHECK1: omp.arraycpy.done4: | // CHECK1: omp.arraycpy.done4: | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | // CHECK1-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | ||||
// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] comdat align 2 { | // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] comdat align 2 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: ret ptr [[THIS1]] | // CHECK1-NEXT: ret ptr [[THIS1]] | ||||
// | // | ||||
Show All 14 Lines | |||||
// CHECK1-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | // CHECK1-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | ||||
// CHECK1-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | // CHECK1-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined., ptr [[THIS1]], i64 [[TMP2]]) | // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined., ptr [[THIS1]], i64 [[TMP2]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined. | // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined. | ||||
// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12:[0-9]+]] personality ptr @__gxx_personality_v0 { | // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11:[0-9]+]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 14 Lines | |||||
// CHECK1-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | // CHECK1-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | ||||
// CHECK1-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK1-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK1: omp_if.then: | // CHECK1: omp_if.then: | ||||
// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | ||||
// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | // CHECK1-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | ||||
// CHECK1-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK1-NEXT: call unwindabort void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK1: invoke.cont: | |||||
// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | // CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | ||||
// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: br label [[OMP_IF_END]] | // CHECK1-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK1: omp_if.end: | // CHECK1: omp_if.end: | ||||
// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK1-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// 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]]) | // 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]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// CHECK1: terminate.lpad: | |||||
// CHECK1-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK1-NEXT: catch ptr null | |||||
// CHECK1-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0 | |||||
// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR13]] | |||||
// CHECK1-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | // CHECK1-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | ||||
// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 | // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 | ||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | // CHECK1-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | ||||
// CHECK1-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK1-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | // CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | ||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | ||||
// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | // CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | ||||
// CHECK1-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | // CHECK1-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | ||||
// CHECK1-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | // CHECK1-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | // CHECK1-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | ||||
// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | // CHECK1-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | ||||
// CHECK1-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | // CHECK1-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | ||||
// CHECK1-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | // CHECK1-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | ||||
// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | // CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | ||||
// CHECK1-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | // CHECK1-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | ||||
// CHECK1-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | // CHECK1-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | ||||
// CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP8]]) | // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP8]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6 | // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6 | ||||
// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] { | // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK1-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 25 Lines | |||||
// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP10]]) | // CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP10]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | // CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | ||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | |||||
// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | ||||
// CHECK1-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | // CHECK1-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | ||||
// CHECK1-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK1-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..8 | // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..8 | ||||
// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
Show All 28 Lines | |||||
// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK1-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2 | // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2 | ||||
// CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | // CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | ||||
// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3 | // CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3 | ||||
// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | // CHECK1-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | ||||
// CHECK1-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | // CHECK1-NEXT: call unwindabort void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | ||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK1: invoke.cont: | |||||
// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | // CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | ||||
// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: br label [[OMP_IF_END]] | // CHECK1-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK1: omp_if.end: | // CHECK1: omp_if.end: | ||||
// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | // CHECK1-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | ||||
// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | // CHECK1-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | ||||
// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | // CHECK1-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | ||||
// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP18]]) | // CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP18]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// CHECK1: terminate.lpad: | |||||
// CHECK1-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK1-NEXT: catch ptr null | |||||
// CHECK1-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0 | |||||
// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR13]] | |||||
// CHECK1-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | // CHECK1-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | ||||
// CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK1-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
Show All 28 Lines | |||||
// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | // CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | ||||
// CHECK1-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | // CHECK1-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | ||||
// CHECK1-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK1-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | // CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | ||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 13 Lines | |||||
// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | ||||
// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | // CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | ||||
// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | // CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | ||||
// CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | // CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10 | // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10 | ||||
// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] { | // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | // CHECK1-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | ||||
// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP17]]) | // CHECK1-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP17]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | // CHECK1-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | ||||
// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 13 Lines | |||||
// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | ||||
// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | // CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | ||||
// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | // CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | ||||
// CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | // CHECK1-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev | // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_singlev | ||||
// CHECK1-SAME: () #[[ATTR10]] { | // CHECK1-SAME: () #[[ATTR9]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined..12) | // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined..12) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..12 | // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..12 | ||||
// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | // CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | ||||
// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK1-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | // CHECK1-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | ||||
// CHECK1-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK1-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK1: omp_if.then: | // CHECK1: omp_if.then: | ||||
// CHECK1-NEXT: invoke void @_Z3foov() | // CHECK1-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK1: invoke.cont: | |||||
// CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK1-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK1-NEXT: br label [[OMP_IF_END]] | // CHECK1-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK1: omp_if.end: | // CHECK1: omp_if.end: | ||||
// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | ||||
// CHECK1-NEXT: ret void | // CHECK1-NEXT: ret void | ||||
// CHECK1: terminate.lpad: | |||||
// CHECK1-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK1-NEXT: catch ptr null | |||||
// CHECK1-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0 | |||||
// CHECK1-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR13]] | |||||
// CHECK1-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp | // CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp | ||||
// CHECK1-SAME: () #[[ATTR0]] { | // CHECK1-SAME: () #[[ATTR0]] { | ||||
// CHECK1-NEXT: entry: | // CHECK1-NEXT: entry: | ||||
// CHECK1-NEXT: call void @__cxx_global_var_init() | // CHECK1-NEXT: call void @__cxx_global_var_init() | ||||
// CHECK1-NEXT: call void @__cxx_global_var_init.4() | // CHECK1-NEXT: call void @__cxx_global_var_init.4() | ||||
// CHECK1-NEXT: call void @.__omp_threadprivate_init_.() | // CHECK1-NEXT: call void @.__omp_threadprivate_init_.() | ||||
▲ Show 20 Lines • Show All 229 Lines • ▼ Show 20 Lines | |||||
// CHECK2-NEXT: br label [[OMP_IF_END2]] | // CHECK2-NEXT: br label [[OMP_IF_END2]] | ||||
// CHECK2: omp_if.end2: | // CHECK2: omp_if.end2: | ||||
// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | // CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | ||||
// CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | // CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | ||||
// CHECK2-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | // CHECK2-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | ||||
// CHECK2: omp_if.then3: | // CHECK2: omp_if.then3: | ||||
// CHECK2-NEXT: invoke void @_Z3foov() | // CHECK2-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK2: invoke.cont: | |||||
// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: br label [[OMP_IF_END4]] | // CHECK2-NEXT: br label [[OMP_IF_END4]] | ||||
// CHECK2: omp_if.end4: | // CHECK2: omp_if.end4: | ||||
// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK2-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | // CHECK2-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | ||||
// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK2-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | // CHECK2-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | ||||
// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK2-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | // CHECK2-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | ||||
// CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | // CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | ||||
// CHECK2-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | // CHECK2-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | ||||
// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | ||||
// CHECK2-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | // CHECK2-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | ||||
// CHECK2-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | // CHECK2-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | ||||
// CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | // CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | ||||
// CHECK2-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | // CHECK2-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | ||||
// CHECK2-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | // CHECK2-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | ||||
// CHECK2-NEXT: ret i32 [[CONV]] | // CHECK2-NEXT: ret i32 [[CONV]] | ||||
// CHECK2: terminate.lpad: | |||||
// CHECK2-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK2-NEXT: catch ptr null | |||||
// CHECK2-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0 | |||||
// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR13:[0-9]+]] | |||||
// CHECK2-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | // CHECK2-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | ||||
// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
Show All 9 Lines | |||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | // CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | ||||
// CHECK2-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | // CHECK2-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@__clang_call_terminate | |||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR8:[0-9]+]] comdat { | |||||
// CHECK2-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] | |||||
// CHECK2-NEXT: call void @_ZSt9terminatev() #[[ATTR13]] | |||||
// CHECK2-NEXT: unreachable | |||||
// | |||||
// | |||||
// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | // CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | ||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] { | // CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 32 Lines | |||||
// CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | ||||
// CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | ||||
// CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | ||||
// CHECK2: omp.arraycpy.done4: | // CHECK2: omp.arraycpy.done4: | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | // CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | ||||
// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] comdat align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] comdat align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: ret ptr [[THIS1]] | // CHECK2-NEXT: ret ptr [[THIS1]] | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_singlev | // CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_singlev | ||||
// CHECK2-SAME: () #[[ATTR10]] { | // CHECK2-SAME: () #[[ATTR9]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined.) | // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined.) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined. | // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined. | ||||
// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR12:[0-9]+]] personality ptr @__gxx_personality_v0 { | // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR11:[0-9]+]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | // CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | // CHECK2-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | ||||
// CHECK2-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK2-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK2: omp_if.then: | // CHECK2: omp_if.then: | ||||
// CHECK2-NEXT: invoke void @_Z3foov() | // CHECK2-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK2: invoke.cont: | |||||
// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK2-NEXT: br label [[OMP_IF_END]] | // CHECK2-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK2: omp_if.end: | // CHECK2: omp_if.end: | ||||
// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | // CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// CHECK2: terminate.lpad: | |||||
// CHECK2-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK2-NEXT: catch ptr null | |||||
// CHECK2-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0 | |||||
// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR13]] | |||||
// CHECK2-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev | // CHECK2-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev | ||||
// CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
// CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | ||||
// CHECK2-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | // CHECK2-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | ||||
// CHECK2-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK2-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..5, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..5, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5 | // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5 | ||||
// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
Show All 28 Lines | |||||
// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2 | // CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2 | ||||
// CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | // CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | ||||
// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3 | // CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3 | ||||
// CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | // CHECK2-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | ||||
// CHECK2-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | // CHECK2-NEXT: call unwindabort void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | ||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK2: invoke.cont: | |||||
// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | // CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | ||||
// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: br label [[OMP_IF_END]] | // CHECK2-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK2: omp_if.end: | // CHECK2: omp_if.end: | ||||
// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | // CHECK2-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | ||||
// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | // CHECK2-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | ||||
// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | // CHECK2-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | ||||
// CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP18]]) | // CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.6, i32 [[TMP18]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// CHECK2: terminate.lpad: | |||||
// CHECK2-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK2-NEXT: catch ptr null | |||||
// CHECK2-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0 | |||||
// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR13]] | |||||
// CHECK2-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | // CHECK2-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | ||||
// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
Show All 28 Lines | |||||
// CHECK2-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | // CHECK2-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | ||||
// CHECK2-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | // CHECK2-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | ||||
// CHECK2-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK2-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..7, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..7, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.6 | // CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.6 | ||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 13 Lines | |||||
// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | ||||
// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | // CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | ||||
// CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | // CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | ||||
// CHECK2-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | // CHECK2-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7 | // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7 | ||||
// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] { | // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
// CHECK2-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK2-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | // CHECK2-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | ||||
// CHECK2-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.8, i32 [[TMP17]]) | // CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.8, i32 [[TMP17]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.8 | // CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.8 | ||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 33 Lines | |||||
// CHECK2-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | // CHECK2-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | ||||
// CHECK2-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | // CHECK2-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..9, ptr [[THIS1]], i64 [[TMP2]]) | // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..9, ptr [[THIS1]], i64 [[TMP2]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..9 | // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..9 | ||||
// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 14 Lines | |||||
// CHECK2-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | // CHECK2-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | ||||
// CHECK2-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK2-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK2: omp_if.then: | // CHECK2: omp_if.then: | ||||
// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | ||||
// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | // CHECK2-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | ||||
// CHECK2-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK2-NEXT: call unwindabort void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK2-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK2: invoke.cont: | |||||
// CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | // CHECK2-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | ||||
// CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: br label [[OMP_IF_END]] | // CHECK2-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK2: omp_if.end: | // CHECK2: omp_if.end: | ||||
// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK2-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.10, i32 [[TMP11]]) | // CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.10, i32 [[TMP11]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// CHECK2: terminate.lpad: | |||||
// CHECK2-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK2-NEXT: catch ptr null | |||||
// CHECK2-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0 | |||||
// CHECK2-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR13]] | |||||
// CHECK2-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | // CHECK2-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | ||||
// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 | // CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | // CHECK2-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | ||||
// CHECK2-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK2-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.10 | // CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.10 | ||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
// CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | ||||
// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | // CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | ||||
// CHECK2-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | // CHECK2-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | ||||
// CHECK2-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | // CHECK2-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | // CHECK2-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | ||||
// CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK2-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK2-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | // CHECK2-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | ||||
// CHECK2-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | // CHECK2-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | ||||
// CHECK2-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | // CHECK2-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | ||||
// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | // CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | // CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | ||||
// CHECK2-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | // CHECK2-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | ||||
// CHECK2-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | // CHECK2-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | ||||
// CHECK2-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK2-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..11, ptr [[TMP1]], i64 [[TMP8]]) | // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..11, ptr [[TMP1]], i64 [[TMP8]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11 | // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11 | ||||
// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] { | // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK2-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 25 Lines | |||||
// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK2-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.12, i32 [[TMP10]]) | // CHECK2-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.12, i32 [[TMP10]]) | ||||
// CHECK2-NEXT: ret void | // CHECK2-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.12 | // CHECK2-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.12 | ||||
// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK2-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK2-NEXT: entry: | // CHECK2-NEXT: entry: | ||||
// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
▲ Show 20 Lines • Show All 231 Lines • ▼ Show 20 Lines | |||||
// CHECK4-NEXT: br label [[OMP_IF_END2]] | // CHECK4-NEXT: br label [[OMP_IF_END2]] | ||||
// CHECK4: omp_if.end2: | // CHECK4: omp_if.end2: | ||||
// CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]]) | ||||
// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK4-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK4-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | // CHECK4-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0 | ||||
// CHECK4-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | // CHECK4-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]] | ||||
// CHECK4: omp_if.then3: | // CHECK4: omp_if.then3: | ||||
// CHECK4-NEXT: invoke void @_Z3foov() | // CHECK4-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK4: invoke.cont: | |||||
// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | // CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP0]]) | ||||
// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: br label [[OMP_IF_END4]] | // CHECK4-NEXT: br label [[OMP_IF_END4]] | ||||
// CHECK4: omp_if.end4: | // CHECK4: omp_if.end4: | ||||
// CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK4-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | // CHECK4-NEXT: store ptr [[A]], ptr [[TMP7]], align 8 | ||||
// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK4-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | // CHECK4-NEXT: store ptr @tc, ptr [[TMP8]], align 8 | ||||
// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK4-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | // CHECK4-NEXT: [[TMP10:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc, i64 4, ptr @tc.cache.) | ||||
// CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | // CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3 | ||||
// CHECK4-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | // CHECK4-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8 | ||||
// CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | // CHECK4-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4 | ||||
// CHECK4-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | // CHECK4-NEXT: [[TMP13:%.*]] = call ptr @__kmpc_threadprivate_cached(ptr @[[GLOB1]], i32 [[TMP0]], ptr @tc2, i64 8, ptr @tc2.cache.) | ||||
// CHECK4-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | // CHECK4-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8 | ||||
// CHECK4-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | // CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP0]], i64 40, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func, i32 [[TMP14]]) | ||||
// CHECK4-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | // CHECK4-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1 | ||||
// CHECK4-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | // CHECK4-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32 | ||||
// CHECK4-NEXT: ret i32 [[CONV]] | // CHECK4-NEXT: ret i32 [[CONV]] | ||||
// CHECK4: terminate.lpad: | |||||
// CHECK4-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK4-NEXT: catch ptr null | |||||
// CHECK4-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0 | |||||
// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR13:[0-9]+]] | |||||
// CHECK4-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | // CHECK4-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | ||||
// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
Show All 9 Lines | |||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8 | ||||
// CHECK4-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | // CHECK4-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@__clang_call_terminate | |||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR8:[0-9]+]] comdat { | |||||
// CHECK4-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] | |||||
// CHECK4-NEXT: call void @_ZSt9terminatev() #[[ATTR13]] | |||||
// CHECK4-NEXT: unreachable | |||||
// | |||||
// | |||||
// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | // CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | ||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] { | // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 32 Lines | |||||
// CHECK4-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | // CHECK4-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 | ||||
// CHECK4-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | // CHECK4-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]] | ||||
// CHECK4-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | // CHECK4-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] | ||||
// CHECK4: omp.arraycpy.done4: | // CHECK4: omp.arraycpy.done4: | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | ||||
// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] comdat align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] comdat align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: ret ptr [[THIS1]] | // CHECK4-NEXT: ret ptr [[THIS1]] | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev | // CHECK4-LABEL: define {{[^@]+}}@_Z15parallel_singlev | ||||
// CHECK4-SAME: () #[[ATTR10]] { | // CHECK4-SAME: () #[[ATTR9]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined.) | // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @.omp_outlined.) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined. | // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined. | ||||
// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR12:[0-9]+]] personality ptr @__gxx_personality_v0 { | // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR11:[0-9]+]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | // CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | // CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK4-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | // CHECK4-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 | ||||
// CHECK4-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK4-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK4: omp_if.then: | // CHECK4: omp_if.then: | ||||
// CHECK4-NEXT: invoke void @_Z3foov() | // CHECK4-NEXT: call unwindabort void @_Z3foov() | ||||
// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK4: invoke.cont: | |||||
// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | // CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP1]]) | ||||
// CHECK4-NEXT: br label [[OMP_IF_END]] | // CHECK4-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK4: omp_if.end: | // CHECK4: omp_if.end: | ||||
// CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | // CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP1]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// CHECK4: terminate.lpad: | |||||
// CHECK4-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK4-NEXT: catch ptr null | |||||
// CHECK4-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0 | |||||
// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR13]] | |||||
// CHECK4-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev | // CHECK4-LABEL: define {{[^@]+}}@_ZN9TestClassC2Ev | ||||
// CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR2]] comdat align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | // CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4 | ||||
// CHECK4-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | // CHECK4-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4 | ||||
// CHECK4-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK4-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..4, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..4, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..4 | // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..4 | ||||
// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
Show All 28 Lines | |||||
// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2 | // CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 2 | ||||
// CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | // CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8 | ||||
// CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3 | // CHECK4-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 3 | ||||
// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | // CHECK4-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8 | ||||
// CHECK4-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | // CHECK4-NEXT: call unwindabort void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | ||||
// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK4: invoke.cont: | |||||
// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | // CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP4]]) | ||||
// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: br label [[OMP_IF_END]] | // CHECK4-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK4: omp_if.end: | // CHECK4: omp_if.end: | ||||
// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | // CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | // CHECK4-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8 | ||||
// CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | // CHECK4-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1 | ||||
// CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | // CHECK4-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8 | ||||
// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | // CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2 | ||||
// CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | // CHECK4-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8 | ||||
// CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP18]]) | // CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.5, i32 [[TMP18]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// CHECK4: terminate.lpad: | |||||
// CHECK4-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK4-NEXT: catch ptr null | |||||
// CHECK4-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0 | |||||
// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR13]] | |||||
// CHECK4-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | // CHECK4-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | ||||
// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
Show All 28 Lines | |||||
// CHECK4-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | // CHECK4-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4 | ||||
// CHECK4-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | // CHECK4-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4 | ||||
// CHECK4-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | // CHECK4-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8 | ||||
// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | // CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | ||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 13 Lines | |||||
// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | // CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2 | ||||
// CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | // CHECK4-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8 | ||||
// CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | // CHECK4-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4 | ||||
// CHECK4-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | // CHECK4-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4 | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..6 | // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..6 | ||||
// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] { | // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
// CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | // CHECK4-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | // CHECK4-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 | ||||
// CHECK4-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP17]]) | // CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP17]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | // CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | ||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
Show All 33 Lines | |||||
// CHECK4-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | // CHECK4-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8 | ||||
// CHECK4-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | // CHECK4-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP2]]) | // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP2]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..8 | // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..8 | ||||
// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 { | // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 14 Lines | |||||
// CHECK4-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | // CHECK4-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 | ||||
// CHECK4-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | // CHECK4-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] | ||||
// CHECK4: omp_if.then: | // CHECK4: omp_if.then: | ||||
// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8 | ||||
// CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK4-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | // CHECK4-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8 | ||||
// CHECK4-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK4-NEXT: call unwindabort void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK4-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] | |||||
// CHECK4: invoke.cont: | |||||
// CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | // CHECK4-NEXT: call void @__kmpc_end_single(ptr @[[GLOB1]], i32 [[TMP3]]) | ||||
// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: br label [[OMP_IF_END]] | // CHECK4-NEXT: br label [[OMP_IF_END]] | ||||
// CHECK4: omp_if.end: | // CHECK4: omp_if.end: | ||||
// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0 | ||||
// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | // CHECK4-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8 | ||||
// CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP11]]) | // CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP11]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// CHECK4: terminate.lpad: | |||||
// CHECK4-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK4-NEXT: catch ptr null | |||||
// CHECK4-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0 | |||||
// CHECK4-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR13]] | |||||
// CHECK4-NEXT: unreachable | |||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | // CHECK4-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | ||||
// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 | // CHECK4-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 | // CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 0 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | // CHECK4-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8 | ||||
// CHECK4-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK4-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | // CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | ||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | // CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8 | ||||
// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0 | ||||
// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | // CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8 | ||||
// CHECK4-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | // CHECK4-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8 | ||||
// CHECK4-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | // CHECK4-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8 | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | // CHECK4-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | ||||
// CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR10]] align 2 { | // CHECK4-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR9]] align 2 { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK4-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK4-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | // CHECK4-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8 | ||||
// CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | // CHECK4-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00 | ||||
// CHECK4-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | // CHECK4-NEXT: store double [[INC]], ptr [[TMP3]], align 8 | ||||
// CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | // CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[THIS1]], i32 0, i32 1 | ||||
// CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | // CHECK4-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8 | ||||
// CHECK4-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | // CHECK4-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8 | ||||
// CHECK4-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | // CHECK4-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8 | ||||
// CHECK4-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | // CHECK4-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8 | ||||
// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP8]]) | // CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP8]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..10 | // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..10 | ||||
// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] { | // CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK4-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK4-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 25 Lines | |||||
// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | // CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | // CHECK4-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8 | ||||
// CHECK4-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | // CHECK4-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4 | ||||
// CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP10]]) | // CHECK4-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB1]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP10]]) | ||||
// CHECK4-NEXT: ret void | // CHECK4-NEXT: ret void | ||||
// | // | ||||
// | // | ||||
// CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | // CHECK4-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | ||||
// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] { | // CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] { | ||||
// CHECK4-NEXT: entry: | // CHECK4-NEXT: entry: | ||||
// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | // CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8 | ||||
// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8 | ||||
// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | // CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0 | ||||
▲ Show 20 Lines • Show All 261 Lines • ▼ Show 20 Lines | |||||
// CHECK5-NEXT: br label [[OMP_IF_END2]], !dbg [[DBG60]] | // CHECK5-NEXT: br label [[OMP_IF_END2]], !dbg [[DBG60]] | ||||
// CHECK5: omp_if.end2: | // CHECK5: omp_if.end2: | ||||
// CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB8:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG61:![0-9]+]] | // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB8:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG61:![0-9]+]] | ||||
// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG62:![0-9]+]] | // CHECK5-NEXT: store i32 0, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG62:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB10:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG62]] | // CHECK5-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB10:[0-9]+]], i32 [[TMP0]]), !dbg [[DBG62]] | ||||
// CHECK5-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG62]] | // CHECK5-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG62]] | ||||
// CHECK5-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]], !dbg [[DBG62]] | // CHECK5-NEXT: br i1 [[TMP6]], label [[OMP_IF_THEN3:%.*]], label [[OMP_IF_END4:%.*]], !dbg [[DBG62]] | ||||
// CHECK5: omp_if.then3: | // CHECK5: omp_if.then3: | ||||
// CHECK5-NEXT: invoke void @_Z3foov() | // CHECK5-NEXT: call unwindabort void @_Z3foov(), !dbg [[DBG63:![0-9]+]] | ||||
// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG63:![0-9]+]] | |||||
// CHECK5: invoke.cont: | |||||
// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB10]], i32 [[TMP0]]), !dbg [[DBG63]] | // CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB10]], i32 [[TMP0]]), !dbg [[DBG63]] | ||||
// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]] | // CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: br label [[OMP_IF_END4]], !dbg [[DBG63]] | // CHECK5-NEXT: br label [[OMP_IF_END4]], !dbg [[DBG63]] | ||||
// CHECK5: omp_if.end4: | // CHECK5: omp_if.end4: | ||||
// CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: store ptr [[A]], ptr [[TMP7]], align 8, !dbg [[DBG63]] | // CHECK5-NEXT: store ptr [[A]], ptr [[TMP7]], align 8, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: store ptr @tc, ptr [[TMP8]], align 8, !dbg [[DBG63]] | // CHECK5-NEXT: store ptr @tc, ptr [[TMP8]], align 8, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG63]] | ||||
// 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]+]] | // 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]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG63]] | // CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 3, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8, !dbg [[DBG63]] | // CHECK5-NEXT: store ptr [[A2]], ptr [[TMP11]], align 8, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 4, !dbg [[DBG63]] | ||||
// 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]+]] | // 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]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !dbg [[DBG63]] | // CHECK5-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !dbg [[DBG63]] | ||||
// CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]] | // CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG63]] | ||||
// 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]] | // 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]] | ||||
// CHECK5-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG66:![0-9]+]] | // CHECK5-NEXT: [[TMP15:%.*]] = load i8, ptr [[A]], align 1, !dbg [[DBG66:![0-9]+]] | ||||
// CHECK5-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32, !dbg [[DBG66]] | // CHECK5-NEXT: [[CONV:%.*]] = sext i8 [[TMP15]] to i32, !dbg [[DBG66]] | ||||
// CHECK5-NEXT: ret i32 [[CONV]], !dbg [[DBG67:![0-9]+]] | // CHECK5-NEXT: ret i32 [[CONV]], !dbg [[DBG67:![0-9]+]] | ||||
// CHECK5: terminate.lpad: | |||||
// CHECK5-NEXT: [[TMP16:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK5-NEXT: catch ptr null, !dbg [[DBG63]] | |||||
// CHECK5-NEXT: [[TMP17:%.*]] = extractvalue { ptr, i32 } [[TMP16]], 0, !dbg [[DBG63]] | |||||
// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP17]]) #[[ATTR13:[0-9]+]], !dbg [[DBG63]] | |||||
// CHECK5-NEXT: unreachable, !dbg [[DBG63]] | |||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | // CHECK5-LABEL: define {{[^@]+}}@_ZN3SSTIdEC1Ev | ||||
// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG68:![0-9]+]] { | // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 !dbg [[DBG68:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
Show All 9 Lines | |||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG72:![0-9]+]] | // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8, !dbg [[DBG72:![0-9]+]] | ||||
// CHECK5-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG72]] | // CHECK5-NEXT: call void @_ZN2SSC2ERi(ptr noundef nonnull align 8 dereferenceable(16) [[THIS1]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0]]), !dbg [[DBG72]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG73:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG73:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@__clang_call_terminate | |||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]]) #[[ATTR8:[0-9]+]] { | |||||
// CHECK5-NEXT: [[TMP2:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP0]]) #[[ATTR3]] | |||||
// CHECK5-NEXT: call void @_ZSt9terminatev() #[[ATTR13]] | |||||
// CHECK5-NEXT: unreachable | |||||
// | |||||
// | |||||
// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | // CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func | ||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9:[0-9]+]] !dbg [[DBG74:![0-9]+]] { | // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] !dbg [[DBG74:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG75:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG75:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG75]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG75]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG75]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [5 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG75]] | ||||
Show All 32 Lines | |||||
// CHECK5-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1, !dbg [[DBG75]] | // CHECK5-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[CLASS_TESTCLASS]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1, !dbg [[DBG75]] | ||||
// CHECK5-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]], !dbg [[DBG75]] | // CHECK5-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]], !dbg [[DBG75]] | ||||
// CHECK5-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]], !dbg [[DBG75]] | // CHECK5-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]], !dbg [[DBG75]] | ||||
// CHECK5: omp.arraycpy.done4: | // CHECK5: omp.arraycpy.done4: | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG79]] | // CHECK5-NEXT: ret void, !dbg [[DBG79]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | // CHECK5-LABEL: define {{[^@]+}}@_ZN9TestClassaSERKS_ | ||||
// CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] align 2 !dbg [[DBG80:![0-9]+]] { | // CHECK5-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] align 2 !dbg [[DBG80:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: ret ptr [[THIS1]], !dbg [[DBG81:![0-9]+]] | // CHECK5-NEXT: ret ptr [[THIS1]], !dbg [[DBG81:![0-9]+]] | ||||
// | // | ||||
Show All 14 Lines | |||||
// CHECK5-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8, !dbg [[DBG86:![0-9]+]] | // CHECK5-NEXT: [[TMP1:%.*]] = load double, ptr [[TMP0]], align 8, !dbg [[DBG86:![0-9]+]] | ||||
// CHECK5-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8, !dbg [[DBG86]] | // CHECK5-NEXT: store double [[TMP1]], ptr [[A_CASTED]], align 8, !dbg [[DBG86]] | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG86]] | // CHECK5-NEXT: [[TMP2:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG86]] | ||||
// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB18:[0-9]+]], i32 2, ptr @.omp_outlined., ptr [[THIS1]], i64 [[TMP2]]), !dbg [[DBG86]] | // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB18:[0-9]+]], i32 2, ptr @.omp_outlined., ptr [[THIS1]], i64 [[TMP2]]), !dbg [[DBG86]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG87:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG87:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp_outlined. | // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined. | ||||
// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG88:![0-9]+]] { | // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11:[0-9]+]] personality ptr @__gxx_personality_v0 !dbg [[DBG88:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 14 Lines | |||||
// CHECK5-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0, !dbg [[DBG91]] | // CHECK5-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0, !dbg [[DBG91]] | ||||
// CHECK5-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG91]] | // CHECK5-NEXT: br i1 [[TMP5]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG91]] | ||||
// CHECK5: omp_if.then: | // CHECK5: omp_if.then: | ||||
// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG92:![0-9]+]] | // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG92:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8, !dbg [[DBG92]] | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[TMP6]], align 8, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG92]] | // CHECK5-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG93:![0-9]+]] | // CHECK5-NEXT: [[TMP8:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG93:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8, !dbg [[DBG92]] | // CHECK5-NEXT: store ptr [[TMP8]], ptr [[TMP7]], align 8, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: invoke void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]) | // CHECK5-NEXT: call unwindabort void @_ZZN3SSTIdEC1EvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]), !dbg [[DBG92]] | ||||
// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG92]] | |||||
// CHECK5: invoke.cont: | |||||
// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB16]], i32 [[TMP3]]), !dbg [[DBG92]] | // CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB16]], i32 [[TMP3]]), !dbg [[DBG92]] | ||||
// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]] | // CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG92]] | // CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG92]] | ||||
// CHECK5: omp_if.end: | // CHECK5: omp_if.end: | ||||
// CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG92]] | // CHECK5-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG94:![0-9]+]] | // CHECK5-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG94:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG92]] | // CHECK5-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 8, !dbg [[DBG92]] | ||||
// CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]] | // CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG92]] | ||||
// 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]] | // 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]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG95:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG95:![0-9]+]] | ||||
// CHECK5: terminate.lpad: | |||||
// CHECK5-NEXT: [[TMP12:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK5-NEXT: catch ptr null, !dbg [[DBG92]] | |||||
// CHECK5-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i32 } [[TMP12]], 0, !dbg [[DBG92]] | |||||
// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP13]]) #[[ATTR13]], !dbg [[DBG92]] | |||||
// CHECK5-NEXT: unreachable, !dbg [[DBG92]] | |||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | // CHECK5-LABEL: define {{[^@]+}}@_ZZN3SSTIdEC1EvENKUlvE_clEv | ||||
// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 !dbg [[DBG96:![0-9]+]] { | // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR4]] align 2 !dbg [[DBG96:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 | // CHECK5-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8 | ||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG97:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0, !dbg [[DBG97:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8, !dbg [[DBG97]] | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[TMP2]], align 8, !dbg [[DBG97]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG97]] | // CHECK5-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG97]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG98:![0-9]+]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG98:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG98]] | // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG98]] | ||||
// CHECK5-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8, !dbg [[DBG97]] | // CHECK5-NEXT: store ptr [[TMP5]], ptr [[TMP3]], align 8, !dbg [[DBG97]] | ||||
// CHECK5-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]), !dbg [[DBG97]] | // CHECK5-NEXT: call void @_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]]), !dbg [[DBG97]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG99:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG99:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | // CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.5 | ||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] !dbg [[DBG100:![0-9]+]] { | // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG100:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG101:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG101:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG101]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG101]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG101]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG101]] | ||||
// CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG101]] | // CHECK5-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !dbg [[DBG101]] | ||||
// CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG101]] | // CHECK5-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0, !dbg [[DBG101]] | ||||
// CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG101]] | // CHECK5-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8, !dbg [[DBG101]] | ||||
// CHECK5-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8, !dbg [[DBG102:![0-9]+]] | // CHECK5-NEXT: [[TMP8:%.*]] = load double, ptr [[TMP7]], align 8, !dbg [[DBG102:![0-9]+]] | ||||
// CHECK5-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8, !dbg [[DBG102]] | // CHECK5-NEXT: store double [[TMP8]], ptr [[TMP5]], align 8, !dbg [[DBG102]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG102]] | // CHECK5-NEXT: ret void, !dbg [[DBG102]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | // CHECK5-LABEL: define {{[^@]+}}@_ZZZN3SSTIdEC1EvENKUlvE_clEvENKUlvE_clEv | ||||
// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR10]] align 2 !dbg [[DBG105:![0-9]+]] { | // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(16) [[THIS:%.*]]) #[[ATTR9]] align 2 !dbg [[DBG105:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_0:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
// CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | // CHECK5-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG106:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG106:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG106]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP2]], align 8, !dbg [[DBG106]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8, !dbg [[DBG107:![0-9]+]] | // CHECK5-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 8, !dbg [[DBG107:![0-9]+]] | ||||
// CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00, !dbg [[DBG107]] | // CHECK5-NEXT: [[INC:%.*]] = fadd double [[TMP4]], 1.000000e+00, !dbg [[DBG107]] | ||||
// CHECK5-NEXT: store double [[INC]], ptr [[TMP3]], align 8, !dbg [[DBG107]] | // CHECK5-NEXT: store double [[INC]], ptr [[TMP3]], align 8, !dbg [[DBG107]] | ||||
// CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG108:![0-9]+]] | // CHECK5-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], ptr [[THIS1]], i32 0, i32 1, !dbg [[DBG108:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG108]] | // CHECK5-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 8, !dbg [[DBG108]] | ||||
// CHECK5-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8, !dbg [[DBG109:![0-9]+]] | // CHECK5-NEXT: [[TMP7:%.*]] = load double, ptr [[TMP6]], align 8, !dbg [[DBG109:![0-9]+]] | ||||
// CHECK5-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8, !dbg [[DBG109]] | // CHECK5-NEXT: store double [[TMP7]], ptr [[A_CASTED]], align 8, !dbg [[DBG109]] | ||||
// CHECK5-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG109]] | // CHECK5-NEXT: [[TMP8:%.*]] = load i64, ptr [[A_CASTED]], align 8, !dbg [[DBG109]] | ||||
// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB22:[0-9]+]], i32 2, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP8]]), !dbg [[DBG109]] | // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB22:[0-9]+]], i32 2, ptr @.omp_outlined..6, ptr [[TMP1]], i64 [[TMP8]]), !dbg [[DBG109]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG110:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG110:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..6 | // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..6 | ||||
// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR12]] !dbg [[DBG111:![0-9]+]] { | // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]]) #[[ATTR11]] !dbg [[DBG111:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | // CHECK5-NEXT: [[DOTOMP_COPYPRIVATE_DID_IT:%.*]] = alloca i32, align 4 | ||||
Show All 25 Lines | |||||
// CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG116:![0-9]+]] | // CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP1]], align 8, !dbg [[DBG116:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG115]] | // CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG115]] | ||||
// CHECK5-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG115]] | // CHECK5-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG115]] | ||||
// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB20]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP10]]), !dbg [[DBG115]] | // CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB20]], i32 [[TMP3]], i64 8, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.7, i32 [[TMP10]]), !dbg [[DBG115]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG117:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG117:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | // CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.7 | ||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] !dbg [[DBG118:![0-9]+]] { | // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG118:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG119:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG119:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG119]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG119]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG119]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG119]] | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | |||||
// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG130]] | // CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG130]] | ||||
// CHECK5-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4, !dbg [[DBG130]] | // CHECK5-NEXT: store i32 [[TMP8]], ptr [[C_CASTED]], align 4, !dbg [[DBG130]] | ||||
// CHECK5-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG130]] | // CHECK5-NEXT: [[TMP9:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG130]] | ||||
// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB26:[0-9]+]], i32 4, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]), !dbg [[DBG130]] | // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB26:[0-9]+]], i32 4, ptr @.omp_outlined..8, ptr [[THIS1]], i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP9]]), !dbg [[DBG130]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG132:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG132:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..8 | // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..8 | ||||
// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 !dbg [[DBG133:![0-9]+]] { | // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 !dbg [[DBG133:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
Show All 28 Lines | |||||
// CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 1, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG139:![0-9]+]] | // CHECK5-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG139:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 2, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP10]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], ptr [[REF_TMP]], i32 0, i32 3, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG139]] | // CHECK5-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG139]] | ||||
// CHECK5-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: invoke void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]) | // CHECK5-NEXT: call unwindabort void @_ZZN2SSC1ERiENKUlvE_clEv(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]), !dbg [[DBG138]] | ||||
// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG138]] | |||||
// CHECK5: invoke.cont: | |||||
// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB24]], i32 [[TMP4]]), !dbg [[DBG138]] | // CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB24]], i32 [[TMP4]]), !dbg [[DBG138]] | ||||
// CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]] | // CHECK5-NEXT: store i32 1, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG138]] | // CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG138]] | ||||
// CHECK5: omp_if.end: | // CHECK5: omp_if.end: | ||||
// CHECK5-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 0, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG140:![0-9]+]] | // CHECK5-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP2]], align 8, !dbg [[DBG140:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 1, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[B_ADDR]], ptr [[TMP15]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], i64 0, i64 2, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG141:![0-9]+]] | // CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG141:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8, !dbg [[DBG138]] | // CHECK5-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 8, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]] | // CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG138]] | ||||
// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB24]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP18]]), !dbg [[DBG138]] | // CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB24]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.9, i32 [[TMP18]]), !dbg [[DBG138]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG142:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG142:![0-9]+]] | ||||
// CHECK5: terminate.lpad: | |||||
// CHECK5-NEXT: [[TMP19:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK5-NEXT: catch ptr null, !dbg [[DBG138]] | |||||
// CHECK5-NEXT: [[TMP20:%.*]] = extractvalue { ptr, i32 } [[TMP19]], 0, !dbg [[DBG138]] | |||||
// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP20]]) #[[ATTR13]], !dbg [[DBG138]] | |||||
// CHECK5-NEXT: unreachable, !dbg [[DBG138]] | |||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | // CHECK5-LABEL: define {{[^@]+}}@_ZZN2SSC1ERiENKUlvE_clEv | ||||
// CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR10]] align 2 !dbg [[DBG143:![0-9]+]] { | // CHECK5-SAME: (ptr noundef nonnull align 8 dereferenceable(32) [[THIS:%.*]]) #[[ATTR9]] align 2 !dbg [[DBG143:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[B_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[C_CASTED:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | // CHECK5-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 | ||||
// CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | // CHECK5-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON_1:%.*]], ptr [[THIS1]], i32 0, i32 0 | ||||
Show All 28 Lines | |||||
// CHECK5-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4, !dbg [[DBG151]] | // CHECK5-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4, !dbg [[DBG151]] | ||||
// CHECK5-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4, !dbg [[DBG151]] | // CHECK5-NEXT: store i32 [[TMP21]], ptr [[C_CASTED]], align 4, !dbg [[DBG151]] | ||||
// CHECK5-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG151]] | // CHECK5-NEXT: [[TMP22:%.*]] = load i64, ptr [[C_CASTED]], align 8, !dbg [[DBG151]] | ||||
// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB30:[0-9]+]], i32 4, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]), !dbg [[DBG151]] | // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB30:[0-9]+]], i32 4, ptr @.omp_outlined..10, ptr [[TMP1]], i64 [[TMP14]], i64 [[TMP18]], i64 [[TMP22]]), !dbg [[DBG151]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG154:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG154:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | // CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.9 | ||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] !dbg [[DBG155:![0-9]+]] { | // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG155:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG156:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG156:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG156]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG156]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG156]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG156]] | ||||
Show All 13 Lines | |||||
// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG156]] | // CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG156]] | ||||
// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG156]] | // CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG156]] | ||||
// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG159:![0-9]+]] | // CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG159:![0-9]+]] | ||||
// CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG159]] | // CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG159]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG159]] | // CHECK5-NEXT: ret void, !dbg [[DBG159]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..10 | // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..10 | ||||
// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR12]] !dbg [[DBG160:![0-9]+]] { | // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) #[[ATTR11]] !dbg [[DBG160:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | // CHECK5-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8 | ||||
// CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[TMP:%.*]] = alloca ptr, align 8 | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
// CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG169:![0-9]+]] | // CHECK5-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP3]], align 8, !dbg [[DBG169:![0-9]+]] | ||||
// CHECK5-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8, !dbg [[DBG165]] | // CHECK5-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8, !dbg [[DBG165]] | ||||
// CHECK5-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG165]] | // CHECK5-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_COPYPRIVATE_DID_IT]], align 4, !dbg [[DBG165]] | ||||
// CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB28]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP17]]), !dbg [[DBG165]] | // CHECK5-NEXT: call void @__kmpc_copyprivate(ptr @[[GLOB28]], i32 [[TMP4]], i64 24, ptr [[DOTOMP_COPYPRIVATE_CPR_LIST]], ptr @.omp.copyprivate.copy_func.11, i32 [[TMP17]]), !dbg [[DBG165]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG170:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG170:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | // CHECK5-LABEL: define {{[^@]+}}@.omp.copyprivate.copy_func.11 | ||||
// CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR9]] !dbg [[DBG171:![0-9]+]] { | // CHECK5-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR8]] !dbg [[DBG171:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | // CHECK5-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | // CHECK5-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8 | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG172:![0-9]+]] | // CHECK5-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8, !dbg [[DBG172:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG172]] | // CHECK5-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8, !dbg [[DBG172]] | ||||
// CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG172]] | // CHECK5-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 0, !dbg [[DBG172]] | ||||
Show All 13 Lines | |||||
// CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG172]] | // CHECK5-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 2, !dbg [[DBG172]] | ||||
// CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG172]] | // CHECK5-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8, !dbg [[DBG172]] | ||||
// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG175:![0-9]+]] | // CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4, !dbg [[DBG175:![0-9]+]] | ||||
// CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG175]] | // CHECK5-NEXT: store i32 [[TMP18]], ptr [[TMP15]], align 4, !dbg [[DBG175]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG175]] | // CHECK5-NEXT: ret void, !dbg [[DBG175]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev | // CHECK5-LABEL: define {{[^@]+}}@_Z15parallel_singlev | ||||
// CHECK5-SAME: () #[[ATTR10]] !dbg [[DBG176:![0-9]+]] { | // CHECK5-SAME: () #[[ATTR9]] !dbg [[DBG176:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB35:[0-9]+]], i32 0, ptr @.omp_outlined..12), !dbg [[DBG177:![0-9]+]] | // CHECK5-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB35:[0-9]+]], i32 0, ptr @.omp_outlined..12), !dbg [[DBG177:![0-9]+]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG178:![0-9]+]] | // CHECK5-NEXT: ret void, !dbg [[DBG178:![0-9]+]] | ||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..12 | // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..12 | ||||
// CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR12]] personality ptr @__gxx_personality_v0 !dbg [[DBG179:![0-9]+]] { | // CHECK5-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR11]] personality ptr @__gxx_personality_v0 !dbg [[DBG179:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | // CHECK5-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 | ||||
// CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | // CHECK5-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 | ||||
// CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | // CHECK5-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 | ||||
// CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG180:![0-9]+]] | // CHECK5-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8, !dbg [[DBG180:![0-9]+]] | ||||
// CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG180]] | // CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG180]] | ||||
// CHECK5-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB32:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG180]] | // CHECK5-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_single(ptr @[[GLOB32:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG180]] | ||||
// CHECK5-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0, !dbg [[DBG180]] | // CHECK5-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0, !dbg [[DBG180]] | ||||
// CHECK5-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG180]] | // CHECK5-NEXT: br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]], !dbg [[DBG180]] | ||||
// CHECK5: omp_if.then: | // CHECK5: omp_if.then: | ||||
// CHECK5-NEXT: invoke void @_Z3foov() | // CHECK5-NEXT: call unwindabort void @_Z3foov(), !dbg [[DBG181:![0-9]+]] | ||||
// CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !dbg [[DBG181:![0-9]+]] | |||||
// CHECK5: invoke.cont: | |||||
// CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB32]], i32 [[TMP1]]), !dbg [[DBG181]] | // CHECK5-NEXT: call void @__kmpc_end_single(ptr @[[GLOB32]], i32 [[TMP1]]), !dbg [[DBG181]] | ||||
// CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG181]] | // CHECK5-NEXT: br label [[OMP_IF_END]], !dbg [[DBG181]] | ||||
// CHECK5: omp_if.end: | // CHECK5: omp_if.end: | ||||
// CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB33:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG182:![0-9]+]] | // CHECK5-NEXT: call void @__kmpc_barrier(ptr @[[GLOB33:[0-9]+]], i32 [[TMP1]]), !dbg [[DBG182:![0-9]+]] | ||||
// CHECK5-NEXT: ret void, !dbg [[DBG182]] | // CHECK5-NEXT: ret void, !dbg [[DBG182]] | ||||
// CHECK5: terminate.lpad: | |||||
// CHECK5-NEXT: [[TMP4:%.*]] = landingpad { ptr, i32 } | |||||
// CHECK5-NEXT: catch ptr null, !dbg [[DBG181]] | |||||
// CHECK5-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP4]], 0, !dbg [[DBG181]] | |||||
// CHECK5-NEXT: call void @__clang_call_terminate(ptr [[TMP5]]) #[[ATTR13]], !dbg [[DBG181]] | |||||
// CHECK5-NEXT: unreachable, !dbg [[DBG181]] | |||||
// | // | ||||
// | // | ||||
// CHECK5-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp | // CHECK5-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_single_codegen.cpp | ||||
// CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG183:![0-9]+]] { | // CHECK5-SAME: () #[[ATTR0]] section "__TEXT,__StaticInit,regular,pure_instructions" !dbg [[DBG183:![0-9]+]] { | ||||
// CHECK5-NEXT: entry: | // CHECK5-NEXT: entry: | ||||
// CHECK5-NEXT: call void @__cxx_global_var_init(), !dbg [[DBG184:![0-9]+]] | // CHECK5-NEXT: call void @__cxx_global_var_init(), !dbg [[DBG184:![0-9]+]] | ||||
// CHECK5-NEXT: call void @__cxx_global_var_init.4(), !dbg [[DBG184]] | // CHECK5-NEXT: call void @__cxx_global_var_init.4(), !dbg [[DBG184]] | ||||
// CHECK5-NEXT: call void @.__omp_threadprivate_init_.(), !dbg [[DBG184]] | // CHECK5-NEXT: call void @.__omp_threadprivate_init_.(), !dbg [[DBG184]] | ||||
▲ Show 20 Lines • Show All 59 Lines • Show Last 20 Lines |