1c172f1adSAndrew 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 3c172f1adSAndrew Litteken 4c172f1adSAndrew Litteken; Here we have multiple exits, but the different sources, different outputs are 5c172f1adSAndrew Litteken; needed, this checks that they are handled by separate switch statements. 6c172f1adSAndrew Litteken 7c172f1adSAndrew Littekendefine void @outline_outputs1() #0 { 8c172f1adSAndrew Littekenentry: 9c172f1adSAndrew Litteken %output = alloca i32, align 4 10c172f1adSAndrew Litteken %result = alloca i32, align 4 11c172f1adSAndrew Litteken %output2 = alloca i32, align 4 12c172f1adSAndrew Litteken %result2 = alloca i32, align 4 13c172f1adSAndrew Litteken %a = alloca i32, align 4 14c172f1adSAndrew Litteken %b = alloca i32, align 4 15c172f1adSAndrew Litteken br label %block_2 16c172f1adSAndrew Littekenblock_1: 17c172f1adSAndrew Litteken %a2 = alloca i32, align 4 18c172f1adSAndrew Litteken %b2 = alloca i32, align 4 19c172f1adSAndrew Litteken br label %block_2 20c172f1adSAndrew Littekenblock_2: 21*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 22*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 23c172f1adSAndrew Litteken %add2 = add i32 2, %a2val 24c172f1adSAndrew Litteken %mul2 = mul i32 2, %b2val 25c172f1adSAndrew Litteken br label %block_5 26c172f1adSAndrew Littekenblock_3: 27*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 28*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 29c172f1adSAndrew Litteken %add = add i32 2, %aval 30c172f1adSAndrew Litteken %mul = mul i32 2, %bval 31c172f1adSAndrew Litteken br label %block_4 32c172f1adSAndrew Littekenblock_4: 33*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 34*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 35c172f1adSAndrew Litteken br label %block_6 36c172f1adSAndrew Littekenblock_5: 37*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 38*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 39c172f1adSAndrew Litteken br label %block_7 40c172f1adSAndrew Littekenblock_6: 41c172f1adSAndrew Litteken %div = udiv i32 %aval, %bval 42c172f1adSAndrew Litteken ret void 43c172f1adSAndrew Littekenblock_7: 44c172f1adSAndrew Litteken %sub = sub i32 %a2val, %b2val 45c172f1adSAndrew Litteken ret void 46c172f1adSAndrew Litteken} 47c172f1adSAndrew Litteken 48c172f1adSAndrew Littekendefine void @outline_outputs2() #0 { 49c172f1adSAndrew Littekenentry: 50c172f1adSAndrew Litteken %output = alloca i32, align 4 51c172f1adSAndrew Litteken %result = alloca i32, align 4 52c172f1adSAndrew Litteken %output2 = alloca i32, align 4 53c172f1adSAndrew Litteken %result2 = alloca i32, align 4 54c172f1adSAndrew Litteken %a = alloca i32, align 4 55c172f1adSAndrew Litteken %b = alloca i32, align 4 56c172f1adSAndrew Litteken br label %block_2 57c172f1adSAndrew Littekenblock_1: 58c172f1adSAndrew Litteken %a2 = alloca i32, align 4 59c172f1adSAndrew Litteken %b2 = alloca i32, align 4 60c172f1adSAndrew Litteken br label %block_2 61c172f1adSAndrew Littekenblock_2: 62*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 63*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 64c172f1adSAndrew Litteken %add2 = add i32 2, %a2val 65c172f1adSAndrew Litteken %mul2 = mul i32 2, %b2val 66c172f1adSAndrew Litteken br label %block_5 67c172f1adSAndrew Littekenblock_3: 68*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 69*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 70c172f1adSAndrew Litteken %add = add i32 2, %aval 71c172f1adSAndrew Litteken %mul = mul i32 2, %bval 72c172f1adSAndrew Litteken br label %block_4 73c172f1adSAndrew Littekenblock_4: 74*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 75*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 76c172f1adSAndrew Litteken br label %block_7 77c172f1adSAndrew Littekenblock_5: 78*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 79*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 80c172f1adSAndrew Litteken br label %block_6 81c172f1adSAndrew Littekenblock_6: 82c172f1adSAndrew Litteken %diff = sub i32 %a2val, %b2val 83c172f1adSAndrew Litteken ret void 84c172f1adSAndrew Littekenblock_7: 85c172f1adSAndrew Litteken %quot = udiv i32 %add, %mul 86c172f1adSAndrew Litteken ret void 87c172f1adSAndrew Litteken} 88c172f1adSAndrew Litteken; CHECK-LABEL: @outline_outputs1( 89c172f1adSAndrew Litteken; CHECK-NEXT: entry: 90c172f1adSAndrew Litteken; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4 91c172f1adSAndrew Litteken; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4 92c172f1adSAndrew Litteken; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 93c172f1adSAndrew Litteken; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 94c172f1adSAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 95c172f1adSAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 96c172f1adSAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 97c172f1adSAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 98c172f1adSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 99c172f1adSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 100c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 101c172f1adSAndrew Litteken; CHECK: block_1: 102c172f1adSAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 103c172f1adSAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 104c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 105c172f1adSAndrew Litteken; CHECK: block_2: 106*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]]) 107*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]]) 108*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]]) 109*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]]) 110*f4b925eeSMatt Arsenault; CHECK-NEXT: [[TMP0:%.*]] = 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]], i32 0) 111*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4 112*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4 113*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4 114*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4 115*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]]) 116*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]]) 117*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]]) 118*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]]) 119c172f1adSAndrew Litteken; CHECK-NEXT: br i1 [[TMP0]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]] 120c172f1adSAndrew Litteken; CHECK: block_6: 121c172f1adSAndrew Litteken; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]] 122c172f1adSAndrew Litteken; CHECK-NEXT: ret void 123c172f1adSAndrew Litteken; CHECK: block_7: 124c172f1adSAndrew Litteken; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] 125c172f1adSAndrew Litteken; CHECK-NEXT: ret void 126c172f1adSAndrew Litteken; 127c172f1adSAndrew Litteken; 128c172f1adSAndrew Litteken; CHECK-LABEL: @outline_outputs2( 129c172f1adSAndrew Litteken; CHECK-NEXT: entry: 130c172f1adSAndrew Litteken; CHECK-NEXT: [[MUL_LOC:%.*]] = alloca i32, align 4 131c172f1adSAndrew Litteken; CHECK-NEXT: [[ADD_LOC:%.*]] = alloca i32, align 4 132c172f1adSAndrew Litteken; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 133c172f1adSAndrew Litteken; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 134c172f1adSAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 135c172f1adSAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 136c172f1adSAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 137c172f1adSAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 138c172f1adSAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 139c172f1adSAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 140c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 141c172f1adSAndrew Litteken; CHECK: block_1: 142c172f1adSAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 143c172f1adSAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 144c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 145c172f1adSAndrew Litteken; CHECK: block_2: 146*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]]) 147*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]]) 148*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[ADD_LOC]]) 149*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[MUL_LOC]]) 150*f4b925eeSMatt Arsenault; CHECK-NEXT: [[TMP0:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[ADD_LOC]], ptr [[MUL_LOC]], i32 1) 151*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4 152*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4 153*f4b925eeSMatt Arsenault; CHECK-NEXT: [[ADD_RELOAD:%.*]] = load i32, ptr [[ADD_LOC]], align 4 154*f4b925eeSMatt Arsenault; CHECK-NEXT: [[MUL_RELOAD:%.*]] = load i32, ptr [[MUL_LOC]], align 4 155*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]]) 156*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]]) 157*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[ADD_LOC]]) 158*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[MUL_LOC]]) 159c172f1adSAndrew Litteken; CHECK-NEXT: br i1 [[TMP0]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]] 160c172f1adSAndrew Litteken; CHECK: block_6: 161c172f1adSAndrew Litteken; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] 162c172f1adSAndrew Litteken; CHECK-NEXT: ret void 163c172f1adSAndrew Litteken; CHECK: block_7: 164c172f1adSAndrew Litteken; CHECK-NEXT: [[QUOT:%.*]] = udiv i32 [[ADD_RELOAD]], [[MUL_RELOAD]] 165c172f1adSAndrew Litteken; CHECK-NEXT: ret void 166c172f1adSAndrew Litteken; 167c172f1adSAndrew Litteken; 168c172f1adSAndrew Litteken; CHECK: define internal i1 @outlined_ir_func_0( 169c172f1adSAndrew Litteken; CHECK-NEXT: newFuncRoot: 170c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2_TO_OUTLINE:%.*]] 171c172f1adSAndrew Litteken; CHECK: block_2_to_outline: 172*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4 173*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4 174c172f1adSAndrew Litteken; CHECK-NEXT: [[ADD2:%.*]] = add i32 2, [[A2VAL]] 175c172f1adSAndrew Litteken; CHECK-NEXT: [[MUL2:%.*]] = mul i32 2, [[B2VAL]] 176c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_5:%.*]] 177c172f1adSAndrew Litteken; CHECK: block_3: 178*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4 179*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4 180c172f1adSAndrew Litteken; CHECK-NEXT: [[ADD:%.*]] = add i32 2, [[AVAL]] 181c172f1adSAndrew Litteken; CHECK-NEXT: [[MUL:%.*]] = mul i32 2, [[BVAL]] 182c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_4:%.*]] 183c172f1adSAndrew Litteken; CHECK: block_4: 184*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD]], ptr [[TMP2:%.*]], align 4 185*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL]], ptr [[TMP3:%.*]], align 4 186c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6_EXITSTUB:%.*]] 187c172f1adSAndrew Litteken; CHECK: block_5: 188*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD2]], ptr [[TMP2]], align 4 189*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL2]], ptr [[TMP3]], align 4 190c172f1adSAndrew Litteken; CHECK-NEXT: br label [[BLOCK_7_EXITSTUB:%.*]] 191c172f1adSAndrew Litteken; CHECK: block_6.exitStub: 192c172f1adSAndrew Litteken; CHECK-NEXT: switch i32 [[TMP8:%.*]], label [[FINAL_BLOCK_1:%.*]] [ 193c172f1adSAndrew Litteken; CHECK-NEXT: i32 0, label [[OUTPUT_BLOCK_0_1:%.*]] 194c172f1adSAndrew Litteken; CHECK-NEXT: i32 1, label [[OUTPUT_BLOCK_1_1:%.*]] 195c172f1adSAndrew Litteken; CHECK-NEXT: ] 196c172f1adSAndrew Litteken; CHECK: block_7.exitStub: 197c172f1adSAndrew Litteken; CHECK-NEXT: switch i32 [[TMP8]], label [[FINAL_BLOCK_0:%.*]] [ 198c172f1adSAndrew Litteken; CHECK-NEXT: i32 0, label [[OUTPUT_BLOCK_0_0:%.*]] 199c172f1adSAndrew Litteken; CHECK-NEXT: i32 1, label [[OUTPUT_BLOCK_1_0:%.*]] 200c172f1adSAndrew Litteken; CHECK-NEXT: ] 201c172f1adSAndrew Litteken; CHECK: output_block_0_0: 202*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[A2VAL]], ptr [[TMP4:%.*]], align 4 203*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[B2VAL]], ptr [[TMP5:%.*]], align 4 204c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_0]] 205c172f1adSAndrew Litteken; CHECK: output_block_0_1: 206*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[AVAL]], ptr [[TMP6:%.*]], align 4 207*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[BVAL]], ptr [[TMP7:%.*]], align 4 208c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_1]] 209c172f1adSAndrew Litteken; CHECK: output_block_1_0: 210*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[A2VAL]], ptr [[TMP4]], align 4 211*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[B2VAL]], ptr [[TMP5]], align 4 212c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_0]] 213c172f1adSAndrew Litteken; CHECK: output_block_1_1: 214*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD]], ptr [[TMP6]], align 4 215*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL]], ptr [[TMP7]], align 4 216c172f1adSAndrew Litteken; CHECK-NEXT: br label [[FINAL_BLOCK_1]] 217c172f1adSAndrew Litteken; CHECK: final_block_0: 218c172f1adSAndrew Litteken; CHECK-NEXT: ret i1 false 219c172f1adSAndrew Litteken; CHECK: final_block_1: 220c172f1adSAndrew Litteken; CHECK-NEXT: ret i1 true 221c172f1adSAndrew Litteken; 222