181d3ac0cSAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs 29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s 381d3ac0cSAndrew Litteken 4c172f1adSAndrew Litteken; Here we have multiple exits, but the different sources, same outputs are 5c172f1adSAndrew Litteken; needed, this checks that they are compressed, and moved into the appropriate 6c172f1adSAndrew Litteken; output blocks. 781d3ac0cSAndrew Litteken 881d3ac0cSAndrew Littekendefine void @outline_outputs1() #0 { 981d3ac0cSAndrew Littekenentry: 1081d3ac0cSAndrew Litteken %output = alloca i32, align 4 1181d3ac0cSAndrew Litteken %result = alloca i32, align 4 1281d3ac0cSAndrew Litteken %output2 = alloca i32, align 4 1381d3ac0cSAndrew Litteken %result2 = alloca i32, align 4 1481d3ac0cSAndrew Litteken %a = alloca i32, align 4 1581d3ac0cSAndrew Litteken %b = alloca i32, align 4 1681d3ac0cSAndrew Litteken br label %block_2 1781d3ac0cSAndrew Littekenblock_1: 1881d3ac0cSAndrew Litteken %a2 = alloca i32, align 4 1981d3ac0cSAndrew Litteken %b2 = alloca i32, align 4 2081d3ac0cSAndrew Litteken br label %block_2 2181d3ac0cSAndrew Littekenblock_2: 22*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 23*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 2481d3ac0cSAndrew Litteken %add2 = add i32 2, %a2val 2581d3ac0cSAndrew Litteken %mul2 = mul i32 2, %b2val 2681d3ac0cSAndrew Litteken br label %block_5 2781d3ac0cSAndrew Littekenblock_3: 28*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 29*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 3081d3ac0cSAndrew Litteken %add = add i32 2, %aval 3181d3ac0cSAndrew Litteken %mul = mul i32 2, %bval 3281d3ac0cSAndrew Litteken br label %block_4 3381d3ac0cSAndrew Littekenblock_4: 34*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 35*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 3681d3ac0cSAndrew Litteken br label %block_6 3781d3ac0cSAndrew Littekenblock_5: 38*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 39*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 4081d3ac0cSAndrew Litteken br label %block_7 4181d3ac0cSAndrew Littekenblock_6: 4281d3ac0cSAndrew Litteken %div = udiv i32 %aval, %bval 4381d3ac0cSAndrew Litteken ret void 4481d3ac0cSAndrew Littekenblock_7: 4581d3ac0cSAndrew Litteken %sub = sub i32 %a2val, %b2val 4681d3ac0cSAndrew Litteken ret void 4781d3ac0cSAndrew Litteken} 4881d3ac0cSAndrew Litteken 4981d3ac0cSAndrew Littekendefine void @outline_outputs2() #0 { 5081d3ac0cSAndrew Littekenentry: 5181d3ac0cSAndrew Litteken %output = alloca i32, align 4 5281d3ac0cSAndrew Litteken %result = alloca i32, align 4 5381d3ac0cSAndrew Litteken %output2 = alloca i32, align 4 5481d3ac0cSAndrew Litteken %result2 = alloca i32, align 4 5581d3ac0cSAndrew Litteken %a = alloca i32, align 4 5681d3ac0cSAndrew Litteken %b = alloca i32, align 4 5781d3ac0cSAndrew Litteken br label %block_2 5881d3ac0cSAndrew Littekenblock_1: 5981d3ac0cSAndrew Litteken %a2 = alloca i32, align 4 6081d3ac0cSAndrew Litteken %b2 = alloca i32, align 4 6181d3ac0cSAndrew Litteken br label %block_2 6281d3ac0cSAndrew Littekenblock_2: 63*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 64*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 6581d3ac0cSAndrew Litteken %add2 = add i32 2, %a2val 6681d3ac0cSAndrew Litteken %mul2 = mul i32 2, %b2val 6781d3ac0cSAndrew Litteken br label %block_5 6881d3ac0cSAndrew Littekenblock_3: 69*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 70*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 7181d3ac0cSAndrew Litteken %add = add i32 2, %aval 7281d3ac0cSAndrew Litteken %mul = mul i32 2, %bval 7381d3ac0cSAndrew Litteken br label %block_4 7481d3ac0cSAndrew Littekenblock_4: 75*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 76*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 7781d3ac0cSAndrew Litteken br label %block_7 7881d3ac0cSAndrew Littekenblock_5: 79*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 80*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 8181d3ac0cSAndrew Litteken br label %block_6 8281d3ac0cSAndrew Littekenblock_6: 8381d3ac0cSAndrew Litteken %diff = sub i32 %a2val, %b2val 8481d3ac0cSAndrew Litteken ret void 8581d3ac0cSAndrew Littekenblock_7: 8681d3ac0cSAndrew Litteken %quot = udiv i32 %aval, %bval 8781d3ac0cSAndrew Litteken ret void 8881d3ac0cSAndrew Litteken} 8981d3ac0cSAndrew Litteken; CHECK-LABEL: @outline_outputs1( 9081d3ac0cSAndrew Litteken; CHECK-NEXT: entry: 91c172f1adSAndrew Litteken; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4 92c172f1adSAndrew Litteken; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4 93c172f1adSAndrew Litteken; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 94c172f1adSAndrew Litteken; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 9581d3ac0cSAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 9681d3ac0cSAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 9781d3ac0cSAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 9881d3ac0cSAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 9981d3ac0cSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 10081d3ac0cSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 10181d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 10281d3ac0cSAndrew Litteken; CHECK: block_1: 10381d3ac0cSAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 10481d3ac0cSAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 10581d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 10681d3ac0cSAndrew Litteken; CHECK: block_2: 107*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]]) 108*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]]) 109*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]]) 110*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]]) 111*f4b925eeSMatt Arsenault; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[AVAL_LOC]], ptr [[BVAL_LOC]]) 112*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4 113*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4 114*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4 115*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4 116*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]]) 117*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]]) 118*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]]) 119*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]]) 120c172f1adSAndrew Litteken; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]] 12181d3ac0cSAndrew Litteken; CHECK: block_6: 122c172f1adSAndrew Litteken; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]] 12381d3ac0cSAndrew Litteken; CHECK-NEXT: ret void 12481d3ac0cSAndrew Litteken; CHECK: block_7: 125c172f1adSAndrew Litteken; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] 12681d3ac0cSAndrew Litteken; CHECK-NEXT: ret void 12781d3ac0cSAndrew Litteken; 12881d3ac0cSAndrew Litteken; 12981d3ac0cSAndrew Litteken; CHECK-LABEL: @outline_outputs2( 13081d3ac0cSAndrew Litteken; CHECK-NEXT: entry: 131c172f1adSAndrew Litteken; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4 132c172f1adSAndrew Litteken; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4 133c172f1adSAndrew Litteken; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 134c172f1adSAndrew Litteken; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 13581d3ac0cSAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 13681d3ac0cSAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 13781d3ac0cSAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 13881d3ac0cSAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 13981d3ac0cSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 14081d3ac0cSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 14181d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 14281d3ac0cSAndrew Litteken; CHECK: block_1: 14381d3ac0cSAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 14481d3ac0cSAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 14581d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 14681d3ac0cSAndrew Litteken; CHECK: block_2: 147*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]]) 148*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]]) 149*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]]) 150*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]]) 151*f4b925eeSMatt Arsenault; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[AVAL_LOC]], ptr [[BVAL_LOC]]) 152*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4 153*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4 154*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4 155*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4 156*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]]) 157*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]]) 158*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]]) 159*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]]) 160c172f1adSAndrew Litteken; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]] 161c172f1adSAndrew Litteken; CHECK: block_6: 162c172f1adSAndrew Litteken; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] 163c172f1adSAndrew Litteken; CHECK-NEXT: ret void 164c172f1adSAndrew Litteken; CHECK: block_7: 165c172f1adSAndrew Litteken; CHECK-NEXT: [[QUOT:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]] 166c172f1adSAndrew Litteken; CHECK-NEXT: ret void 167c172f1adSAndrew Litteken; 168c172f1adSAndrew Litteken; 169c172f1adSAndrew Litteken; CHECK: define internal i1 @outlined_ir_func_0( 170c172f1adSAndrew Litteken; CHECK-NEXT: newFuncRoot: 171c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2_TO_OUTLINE:%.*]] 172c172f1adSAndrew Litteken; CHECK: block_2_to_outline: 173*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4 174*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4 17581d3ac0cSAndrew Litteken; CHECK-NEXT: [[ADD2:%.*]] = add i32 2, [[A2VAL]] 17681d3ac0cSAndrew Litteken; CHECK-NEXT: [[MUL2:%.*]] = mul i32 2, [[B2VAL]] 17781d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_5:%.*]] 17881d3ac0cSAndrew Litteken; CHECK: block_3: 179*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4 180*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4 18181d3ac0cSAndrew Litteken; CHECK-NEXT: [[ADD:%.*]] = add i32 2, [[AVAL]] 18281d3ac0cSAndrew Litteken; CHECK-NEXT: [[MUL:%.*]] = mul i32 2, [[BVAL]] 18381d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_4:%.*]] 18481d3ac0cSAndrew Litteken; CHECK: block_4: 185*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD]], ptr [[TMP2:%.*]], align 4 186*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL]], ptr [[TMP3:%.*]], align 4 187c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6_EXITSTUB:%.*]] 18881d3ac0cSAndrew Litteken; CHECK: block_5: 189*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD2]], ptr [[TMP2]], align 4 190*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL2]], ptr [[TMP3]], align 4 19181d3ac0cSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_7_EXITSTUB:%.*]] 192c172f1adSAndrew Litteken; CHECK: block_6.exitStub: 193*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[AVAL]], ptr [[TMP6:%.*]], align 4 194*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[BVAL]], ptr [[TMP7:%.*]], align 4 195c172f1adSAndrew Litteken; CHECK-NEXT: ret i1 true 19681d3ac0cSAndrew Litteken; CHECK: block_7.exitStub: 197*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[A2VAL]], ptr [[TMP4:%.*]], align 4 198*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[B2VAL]], ptr [[TMP5:%.*]], align 4 199c172f1adSAndrew Litteken; CHECK-NEXT: ret i1 false 20081d3ac0cSAndrew Litteken; 201