1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals 2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM 3; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM 4; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM 5; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM 6 7target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 8 9%struct.ident_t = type { i32, i32, i32, i32, i8* } 10 11@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 12@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8 13@2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8 14 15; %a is write only, %b is read only, neither is captured or freed, or ... 16; FIXME: %a and %b are *not* readnone! 17 18;. 19; CHECK: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [23 x i8] c" 20; CHECK: @[[GLOB1:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 514, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @[[GLOB0]], i32 0, i32 0) }, align 8 21; CHECK: @[[GLOB2:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @[[GLOB0]], i32 0, i32 0) }, align 8 22;. 23define dso_local void @func(float* nocapture %a, float* %b, i32 %N) local_unnamed_addr #0 { 24; IS__TUNIT_OPM: Function Attrs: nounwind uwtable 25; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@func 26; IS__TUNIT_OPM-SAME: (float* nocapture nofree writeonly [[A:%.*]], float* nocapture nofree readonly [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { 27; IS__TUNIT_OPM-NEXT: entry: 28; IS__TUNIT_OPM-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8 29; IS__TUNIT_OPM-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8 30; IS__TUNIT_OPM-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4 31; IS__TUNIT_OPM-NEXT: store float* [[A]], float** [[A_ADDR]], align 8 32; IS__TUNIT_OPM-NEXT: store float* [[B]], float** [[B_ADDR]], align 8 33; IS__TUNIT_OPM-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef, float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]]) 34; IS__TUNIT_OPM-NEXT: ret void 35; 36; IS__TUNIT_NPM: Function Attrs: nounwind uwtable 37; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@func 38; IS__TUNIT_NPM-SAME: (float* nocapture nofree writeonly [[A:%.*]], float* nocapture nofree readonly [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { 39; IS__TUNIT_NPM-NEXT: entry: 40; IS__TUNIT_NPM-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8 41; IS__TUNIT_NPM-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8 42; IS__TUNIT_NPM-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4 43; IS__TUNIT_NPM-NEXT: store float* [[A]], float** [[A_ADDR]], align 8 44; IS__TUNIT_NPM-NEXT: store float* [[B]], float** [[B_ADDR]], align 8 45; IS__TUNIT_NPM-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef, float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]]) 46; IS__TUNIT_NPM-NEXT: ret void 47; 48; IS__CGSCC____: Function Attrs: nounwind uwtable 49; IS__CGSCC____-LABEL: define {{[^@]+}}@func 50; IS__CGSCC____-SAME: (float* nocapture nofree [[A:%.*]], float* nofree [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { 51; IS__CGSCC____-NEXT: entry: 52; IS__CGSCC____-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8 53; IS__CGSCC____-NEXT: [[B_ADDR:%.*]] = alloca float*, align 8 54; IS__CGSCC____-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4 55; IS__CGSCC____-NEXT: store float* [[A]], float** [[A_ADDR]], align 8 56; IS__CGSCC____-NEXT: store float* [[B]], float** [[B_ADDR]], align 8 57; IS__CGSCC____-NEXT: store i32 199, i32* [[N_ADDR]], align 4 58; IS__CGSCC____-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nofree noundef nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float** nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]]) 59; IS__CGSCC____-NEXT: ret void 60; 61entry: 62 %a.addr = alloca float*, align 8 63 %b.addr = alloca float*, align 8 64 %N.addr = alloca i32, align 4 65 store float* %a, float** %a.addr, align 8 66 store float* %b, float** %b.addr, align 8 67 store i32 199, i32* %N.addr, align 4 68 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @2, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull %N.addr, float** nonnull %a.addr, float** nonnull %b.addr) 69 ret void 70} 71 72; FIXME: %N should not be loaded but 199 should be used. 73 74define internal void @.omp_outlined.(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %N, float** nocapture nonnull readonly align 8 dereferenceable(8) %a, float** nocapture nonnull readonly align 8 dereferenceable(8) %b) #1 { 75; IS__TUNIT_OPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable 76; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@.omp_outlined. 77; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[N:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] { 78; IS__TUNIT_OPM-NEXT: entry: 79; IS__TUNIT_OPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 80; IS__TUNIT_OPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 81; IS__TUNIT_OPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 82; IS__TUNIT_OPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 83; IS__TUNIT_OPM-NEXT: br label [[OMP_PRECOND_THEN:%.*]] 84; IS__TUNIT_OPM: omp.precond.then: 85; IS__TUNIT_OPM-NEXT: [[TMP0:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8* 86; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 87; IS__TUNIT_OPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 88; IS__TUNIT_OPM-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8* 89; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 90; IS__TUNIT_OPM-NEXT: store i32 197, i32* [[DOTOMP_UB]], align 4 91; IS__TUNIT_OPM-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8* 92; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 93; IS__TUNIT_OPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 94; IS__TUNIT_OPM-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8* 95; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 96; IS__TUNIT_OPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 97; IS__TUNIT_OPM-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 98; IS__TUNIT_OPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1) 99; IS__TUNIT_OPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 100; IS__TUNIT_OPM-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP5]], 197 101; IS__TUNIT_OPM-NEXT: [[COND:%.*]] = select i1 [[CMP4]], i32 197, i32 [[TMP5]] 102; IS__TUNIT_OPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 103; IS__TUNIT_OPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 104; IS__TUNIT_OPM-NEXT: [[CMP513:%.*]] = icmp sgt i32 [[TMP6]], [[COND]] 105; IS__TUNIT_OPM-NEXT: br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]] 106; IS__TUNIT_OPM: omp.inner.for.body.lr.ph: 107; IS__TUNIT_OPM-NEXT: [[TMP7:%.*]] = load float*, float** [[B]], align 8 108; IS__TUNIT_OPM-NEXT: [[TMP8:%.*]] = load float*, float** [[A]], align 8 109; IS__TUNIT_OPM-NEXT: [[TMP9:%.*]] = sext i32 [[TMP6]] to i64 110; IS__TUNIT_OPM-NEXT: [[TMP10:%.*]] = sext i32 [[COND]] to i64 111; IS__TUNIT_OPM-NEXT: br label [[OMP_INNER_FOR_BODY:%.*]] 112; IS__TUNIT_OPM: omp.inner.for.body: 113; IS__TUNIT_OPM-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP9]], [[OMP_INNER_FOR_BODY_LR_PH]] ] 114; IS__TUNIT_OPM-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1 115; IS__TUNIT_OPM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP7]], i64 [[INDVARS_IV_NEXT]] 116; IS__TUNIT_OPM-NEXT: [[TMP11:%.*]] = load float, float* [[ARRAYIDX]], align 4 117; IS__TUNIT_OPM-NEXT: [[CONV7:%.*]] = fadd float [[TMP11]], 1.000000e+00 118; IS__TUNIT_OPM-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]] 119; IS__TUNIT_OPM-NEXT: store float [[CONV7]], float* [[ARRAYIDX9]], align 4 120; IS__TUNIT_OPM-NEXT: [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP10]] 121; IS__TUNIT_OPM-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]] 122; IS__TUNIT_OPM: omp.loop.exit: 123; IS__TUNIT_OPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]]) 124; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 125; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 126; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 127; IS__TUNIT_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 128; IS__TUNIT_OPM-NEXT: br label [[OMP_PRECOND_END:%.*]] 129; IS__TUNIT_OPM: omp.precond.end: 130; IS__TUNIT_OPM-NEXT: ret void 131; 132; IS__TUNIT_NPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable 133; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@.omp_outlined. 134; IS__TUNIT_NPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[N:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] { 135; IS__TUNIT_NPM-NEXT: entry: 136; IS__TUNIT_NPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 137; IS__TUNIT_NPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 138; IS__TUNIT_NPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 139; IS__TUNIT_NPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 140; IS__TUNIT_NPM-NEXT: br label [[OMP_PRECOND_THEN:%.*]] 141; IS__TUNIT_NPM: omp.precond.then: 142; IS__TUNIT_NPM-NEXT: [[TMP0:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8* 143; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 144; IS__TUNIT_NPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 145; IS__TUNIT_NPM-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8* 146; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 147; IS__TUNIT_NPM-NEXT: store i32 197, i32* [[DOTOMP_UB]], align 4 148; IS__TUNIT_NPM-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8* 149; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 150; IS__TUNIT_NPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 151; IS__TUNIT_NPM-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8* 152; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 153; IS__TUNIT_NPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 154; IS__TUNIT_NPM-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 155; IS__TUNIT_NPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1) 156; IS__TUNIT_NPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 157; IS__TUNIT_NPM-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP5]], 197 158; IS__TUNIT_NPM-NEXT: [[COND:%.*]] = select i1 [[CMP4]], i32 197, i32 [[TMP5]] 159; IS__TUNIT_NPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 160; IS__TUNIT_NPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 161; IS__TUNIT_NPM-NEXT: [[CMP513:%.*]] = icmp sgt i32 [[TMP6]], [[COND]] 162; IS__TUNIT_NPM-NEXT: br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]] 163; IS__TUNIT_NPM: omp.inner.for.body.lr.ph: 164; IS__TUNIT_NPM-NEXT: [[TMP7:%.*]] = load float*, float** [[B]], align 8 165; IS__TUNIT_NPM-NEXT: [[TMP8:%.*]] = load float*, float** [[A]], align 8 166; IS__TUNIT_NPM-NEXT: [[TMP9:%.*]] = sext i32 [[TMP6]] to i64 167; IS__TUNIT_NPM-NEXT: [[TMP10:%.*]] = sext i32 [[COND]] to i64 168; IS__TUNIT_NPM-NEXT: br label [[OMP_INNER_FOR_BODY:%.*]] 169; IS__TUNIT_NPM: omp.inner.for.body: 170; IS__TUNIT_NPM-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP9]], [[OMP_INNER_FOR_BODY_LR_PH]] ] 171; IS__TUNIT_NPM-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1 172; IS__TUNIT_NPM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP7]], i64 [[INDVARS_IV_NEXT]] 173; IS__TUNIT_NPM-NEXT: [[TMP11:%.*]] = load float, float* [[ARRAYIDX]], align 4 174; IS__TUNIT_NPM-NEXT: [[CONV7:%.*]] = fadd float [[TMP11]], 1.000000e+00 175; IS__TUNIT_NPM-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]] 176; IS__TUNIT_NPM-NEXT: store float [[CONV7]], float* [[ARRAYIDX9]], align 4 177; IS__TUNIT_NPM-NEXT: [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP10]] 178; IS__TUNIT_NPM-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]] 179; IS__TUNIT_NPM: omp.loop.exit: 180; IS__TUNIT_NPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]]) 181; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 182; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 183; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 184; IS__TUNIT_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]]) 185; IS__TUNIT_NPM-NEXT: br label [[OMP_PRECOND_END:%.*]] 186; IS__TUNIT_NPM: omp.precond.end: 187; IS__TUNIT_NPM-NEXT: ret void 188; 189; IS__CGSCC_OPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable 190; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@.omp_outlined. 191; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] { 192; IS__CGSCC_OPM-NEXT: entry: 193; IS__CGSCC_OPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 194; IS__CGSCC_OPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 195; IS__CGSCC_OPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 196; IS__CGSCC_OPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 197; IS__CGSCC_OPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[N]], align 4 198; IS__CGSCC_OPM-NEXT: [[SUB2:%.*]] = add nsw i32 [[TMP0]], -2 199; IS__CGSCC_OPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP0]], 1 200; IS__CGSCC_OPM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 201; IS__CGSCC_OPM: omp.precond.then: 202; IS__CGSCC_OPM-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8* 203; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 204; IS__CGSCC_OPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 205; IS__CGSCC_OPM-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8* 206; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 207; IS__CGSCC_OPM-NEXT: store i32 [[SUB2]], i32* [[DOTOMP_UB]], align 4 208; IS__CGSCC_OPM-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8* 209; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 210; IS__CGSCC_OPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 211; IS__CGSCC_OPM-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8* 212; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]]) 213; IS__CGSCC_OPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 214; IS__CGSCC_OPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 215; IS__CGSCC_OPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1) 216; IS__CGSCC_OPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 217; IS__CGSCC_OPM-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP6]], [[SUB2]] 218; IS__CGSCC_OPM-NEXT: [[COND:%.*]] = select i1 [[CMP4]], i32 [[SUB2]], i32 [[TMP6]] 219; IS__CGSCC_OPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 220; IS__CGSCC_OPM-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 221; IS__CGSCC_OPM-NEXT: [[CMP513:%.*]] = icmp sgt i32 [[TMP7]], [[COND]] 222; IS__CGSCC_OPM-NEXT: br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]] 223; IS__CGSCC_OPM: omp.inner.for.body.lr.ph: 224; IS__CGSCC_OPM-NEXT: [[TMP8:%.*]] = load float*, float** [[B]], align 8 225; IS__CGSCC_OPM-NEXT: [[TMP9:%.*]] = load float*, float** [[A]], align 8 226; IS__CGSCC_OPM-NEXT: [[TMP10:%.*]] = sext i32 [[TMP7]] to i64 227; IS__CGSCC_OPM-NEXT: [[TMP11:%.*]] = sext i32 [[COND]] to i64 228; IS__CGSCC_OPM-NEXT: br label [[OMP_INNER_FOR_BODY:%.*]] 229; IS__CGSCC_OPM: omp.inner.for.body: 230; IS__CGSCC_OPM-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP10]], [[OMP_INNER_FOR_BODY_LR_PH]] ] 231; IS__CGSCC_OPM-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1 232; IS__CGSCC_OPM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]] 233; IS__CGSCC_OPM-NEXT: [[TMP12:%.*]] = load float, float* [[ARRAYIDX]], align 4 234; IS__CGSCC_OPM-NEXT: [[CONV7:%.*]] = fadd float [[TMP12]], 1.000000e+00 235; IS__CGSCC_OPM-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP9]], i64 [[INDVARS_IV_NEXT]] 236; IS__CGSCC_OPM-NEXT: store float [[CONV7]], float* [[ARRAYIDX9]], align 4 237; IS__CGSCC_OPM-NEXT: [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP11]] 238; IS__CGSCC_OPM-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]] 239; IS__CGSCC_OPM: omp.loop.exit: 240; IS__CGSCC_OPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]]) 241; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]]) 242; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 243; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 244; IS__CGSCC_OPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 245; IS__CGSCC_OPM-NEXT: br label [[OMP_PRECOND_END]] 246; IS__CGSCC_OPM: omp.precond.end: 247; IS__CGSCC_OPM-NEXT: ret void 248; 249; IS__CGSCC_NPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable 250; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@.omp_outlined. 251; IS__CGSCC_NPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] { 252; IS__CGSCC_NPM-NEXT: entry: 253; IS__CGSCC_NPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 254; IS__CGSCC_NPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 255; IS__CGSCC_NPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 256; IS__CGSCC_NPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 257; IS__CGSCC_NPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[N]], align 4 258; IS__CGSCC_NPM-NEXT: [[SUB2:%.*]] = add nsw i32 [[TMP0]], -2 259; IS__CGSCC_NPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP0]], 1 260; IS__CGSCC_NPM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 261; IS__CGSCC_NPM: omp.precond.then: 262; IS__CGSCC_NPM-NEXT: [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8* 263; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 264; IS__CGSCC_NPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 265; IS__CGSCC_NPM-NEXT: [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8* 266; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 267; IS__CGSCC_NPM-NEXT: store i32 [[SUB2]], i32* [[DOTOMP_UB]], align 4 268; IS__CGSCC_NPM-NEXT: [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8* 269; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 270; IS__CGSCC_NPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 271; IS__CGSCC_NPM-NEXT: [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8* 272; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]]) 273; IS__CGSCC_NPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 274; IS__CGSCC_NPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 275; IS__CGSCC_NPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1) 276; IS__CGSCC_NPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 277; IS__CGSCC_NPM-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP6]], [[SUB2]] 278; IS__CGSCC_NPM-NEXT: [[COND:%.*]] = select i1 [[CMP4]], i32 [[SUB2]], i32 [[TMP6]] 279; IS__CGSCC_NPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 280; IS__CGSCC_NPM-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 281; IS__CGSCC_NPM-NEXT: [[CMP513:%.*]] = icmp sgt i32 [[TMP7]], [[COND]] 282; IS__CGSCC_NPM-NEXT: br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]] 283; IS__CGSCC_NPM: omp.inner.for.body.lr.ph: 284; IS__CGSCC_NPM-NEXT: [[TMP8:%.*]] = load float*, float** [[B]], align 8 285; IS__CGSCC_NPM-NEXT: [[TMP9:%.*]] = load float*, float** [[A]], align 8 286; IS__CGSCC_NPM-NEXT: [[TMP10:%.*]] = sext i32 [[TMP7]] to i64 287; IS__CGSCC_NPM-NEXT: [[TMP11:%.*]] = sext i32 [[COND]] to i64 288; IS__CGSCC_NPM-NEXT: br label [[OMP_INNER_FOR_BODY:%.*]] 289; IS__CGSCC_NPM: omp.inner.for.body: 290; IS__CGSCC_NPM-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP10]], [[OMP_INNER_FOR_BODY_LR_PH]] ] 291; IS__CGSCC_NPM-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1 292; IS__CGSCC_NPM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]] 293; IS__CGSCC_NPM-NEXT: [[TMP12:%.*]] = load float, float* [[ARRAYIDX]], align 4 294; IS__CGSCC_NPM-NEXT: [[CONV7:%.*]] = fadd float [[TMP12]], 1.000000e+00 295; IS__CGSCC_NPM-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP9]], i64 [[INDVARS_IV_NEXT]] 296; IS__CGSCC_NPM-NEXT: store float [[CONV7]], float* [[ARRAYIDX9]], align 4 297; IS__CGSCC_NPM-NEXT: [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP11]] 298; IS__CGSCC_NPM-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]] 299; IS__CGSCC_NPM: omp.loop.exit: 300; IS__CGSCC_NPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]]) 301; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]]) 302; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]]) 303; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]]) 304; IS__CGSCC_NPM-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]]) 305; IS__CGSCC_NPM-NEXT: br label [[OMP_PRECOND_END]] 306; IS__CGSCC_NPM: omp.precond.end: 307; IS__CGSCC_NPM-NEXT: ret void 308; 309entry: 310 %.omp.lb = alloca i32, align 4 311 %.omp.ub = alloca i32, align 4 312 %.omp.stride = alloca i32, align 4 313 %.omp.is_last = alloca i32, align 4 314 %0 = load i32, i32* %N, align 4 315 %sub2 = add nsw i32 %0, -2 316 %cmp = icmp sgt i32 %0, 1 317 br i1 %cmp, label %omp.precond.then, label %omp.precond.end 318 319omp.precond.then: ; preds = %entry 320 %1 = bitcast i32* %.omp.lb to i8* 321 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %1) #3 322 store i32 0, i32* %.omp.lb, align 4 323 %2 = bitcast i32* %.omp.ub to i8* 324 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2) #3 325 store i32 %sub2, i32* %.omp.ub, align 4 326 %3 = bitcast i32* %.omp.stride to i8* 327 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #3 328 store i32 1, i32* %.omp.stride, align 4 329 %4 = bitcast i32* %.omp.is_last to i8* 330 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %4) #3 331 store i32 0, i32* %.omp.is_last, align 4 332 %5 = load i32, i32* %.global_tid., align 4 333 call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @1, i32 %5, i32 34, i32* nonnull %.omp.is_last, i32* nonnull %.omp.lb, i32* nonnull %.omp.ub, i32* nonnull %.omp.stride, i32 1, i32 1) #3 334 %6 = load i32, i32* %.omp.ub, align 4 335 %cmp4 = icmp sgt i32 %6, %sub2 336 %cond = select i1 %cmp4, i32 %sub2, i32 %6 337 store i32 %cond, i32* %.omp.ub, align 4 338 %7 = load i32, i32* %.omp.lb, align 4 339 %cmp513 = icmp sgt i32 %7, %cond 340 br i1 %cmp513, label %omp.loop.exit, label %omp.inner.for.body.lr.ph 341 342omp.inner.for.body.lr.ph: ; preds = %omp.precond.then 343 %8 = load float*, float** %b, align 8 344 %9 = load float*, float** %a, align 8 345 %10 = sext i32 %7 to i64 346 %11 = sext i32 %cond to i64 347 br label %omp.inner.for.body 348 349omp.inner.for.body: ; preds = %omp.inner.for.body, %omp.inner.for.body.lr.ph 350 %indvars.iv = phi i64 [ %indvars.iv.next, %omp.inner.for.body ], [ %10, %omp.inner.for.body.lr.ph ] 351 %indvars.iv.next = add nsw i64 %indvars.iv, 1 352 %arrayidx = getelementptr inbounds float, float* %8, i64 %indvars.iv.next 353 %12 = load float, float* %arrayidx, align 4 354 %conv7 = fadd float %12, 1.000000e+00 355 %arrayidx9 = getelementptr inbounds float, float* %9, i64 %indvars.iv.next 356 store float %conv7, float* %arrayidx9, align 4 357 %cmp5 = icmp slt i64 %indvars.iv, %11 358 br i1 %cmp5, label %omp.inner.for.body, label %omp.loop.exit 359 360omp.loop.exit: ; preds = %omp.inner.for.body, %omp.precond.then 361 call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @1, i32 %5) 362 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %4) #3 363 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %3) #3 364 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2) #3 365 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %1) #3 366 br label %omp.precond.end 367 368omp.precond.end: ; preds = %omp.loop.exit, %entry 369 ret void 370} 371 372; Function Attrs: argmemonly nounwind willreturn 373declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #2 374 375; Function Attrs: argmemonly nounwind willreturn 376declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #2 377 378declare dso_local void @__kmpc_for_static_init_4(%struct.ident_t*, i32, i32, i32*, i32*, i32*, i32*, i32, i32) local_unnamed_addr 379 380; Function Attrs: nounwind 381declare void @__kmpc_for_static_fini(%struct.ident_t*, i32) local_unnamed_addr #3 382 383; Function Attrs: nounwind 384declare !callback !1 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) local_unnamed_addr #3 385 386attributes #0 = { nounwind uwtable } 387attributes #1 = { alwaysinline nofree norecurse nounwind uwtable } 388attributes #2 = { nounwind } 389 390!llvm.module.flags = !{!0} 391 392!0 = !{i32 7, !"openmp", i32 50} 393!1 = !{!2} 394!2 = !{i64 2, i64 -1, i64 -1, i1 true} 395;. 396; CHECK: attributes #[[ATTR0:[0-9]+]] = { nounwind uwtable } 397; CHECK: attributes #[[ATTR1:[0-9]+]] = { alwaysinline nofree norecurse nounwind uwtable } 398; CHECK: attributes #[[ATTR2:[0-9]+]] = { argmemonly nocallback nofree nosync nounwind willreturn } 399;. 400; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50} 401; CHECK: [[META1:![0-9]+]] = !{!2} 402; CHECK: [[META2:![0-9]+]] = !{i64 2, i64 -1, i64 -1, i1 true} 403;. 404