1dcc3e728SAndrew 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 3dcc3e728SAndrew Litteken 4dcc3e728SAndrew Litteken; Here we have multiple exits, but the different sources, same outputs are 5dcc3e728SAndrew Litteken; needed, this checks that they are compressed, and moved into the appropriate 6dcc3e728SAndrew Litteken; output blocks. 7dcc3e728SAndrew Litteken 8dcc3e728SAndrew Littekendefine void @outline_outputs1() #0 { 9dcc3e728SAndrew Littekenentry: 10dcc3e728SAndrew Litteken %output = alloca i32, align 4 11dcc3e728SAndrew Litteken %result = alloca i32, align 4 12dcc3e728SAndrew Litteken %output2 = alloca i32, align 4 13dcc3e728SAndrew Litteken %result2 = alloca i32, align 4 14dcc3e728SAndrew Litteken %a = alloca i32, align 4 15dcc3e728SAndrew Litteken %b = alloca i32, align 4 16dcc3e728SAndrew Litteken br label %block_2 17dcc3e728SAndrew Littekenblock_1: 18dcc3e728SAndrew Litteken %a2 = alloca i32, align 4 19dcc3e728SAndrew Litteken %b2 = alloca i32, align 4 20dcc3e728SAndrew Litteken br label %block_2 21dcc3e728SAndrew Littekenblock_2: 22*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 23*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 24dcc3e728SAndrew Litteken %add2 = add i32 2, %a2val 25dcc3e728SAndrew Litteken %mul2 = mul i32 2, %b2val 26dcc3e728SAndrew Litteken br label %block_5 27dcc3e728SAndrew Littekenblock_3: 28*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 29*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 30dcc3e728SAndrew Litteken %add = add i32 2, %aval 31dcc3e728SAndrew Litteken %mul = mul i32 2, %bval 32dcc3e728SAndrew Litteken br label %block_4 33dcc3e728SAndrew Littekenblock_4: 34*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 35*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 36dcc3e728SAndrew Litteken br label %block_6 37dcc3e728SAndrew Littekenblock_5: 38*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 39*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 40dcc3e728SAndrew Litteken br label %block_6 41e8f4e41bSAndrew Littekendummy: 42e8f4e41bSAndrew Litteken ret void 43dcc3e728SAndrew Littekenblock_6: 44dcc3e728SAndrew Litteken %diff = phi i32 [%aval, %block_4], [%a2val, %block_5] 45dcc3e728SAndrew Litteken ret void 46dcc3e728SAndrew Litteken} 47dcc3e728SAndrew Litteken 48dcc3e728SAndrew Littekendefine void @outline_outputs2() #0 { 49dcc3e728SAndrew Littekenentry: 50dcc3e728SAndrew Litteken %output = alloca i32, align 4 51dcc3e728SAndrew Litteken %result = alloca i32, align 4 52dcc3e728SAndrew Litteken %output2 = alloca i32, align 4 53dcc3e728SAndrew Litteken %result2 = alloca i32, align 4 54dcc3e728SAndrew Litteken %a = alloca i32, align 4 55dcc3e728SAndrew Litteken %b = alloca i32, align 4 56dcc3e728SAndrew Litteken br label %block_2 57dcc3e728SAndrew Littekenblock_1: 58dcc3e728SAndrew Litteken %a2 = alloca i32, align 4 59dcc3e728SAndrew Litteken %b2 = alloca i32, align 4 60dcc3e728SAndrew Litteken br label %block_2 61dcc3e728SAndrew Littekenblock_2: 62*f4b925eeSMatt Arsenault %a2val = load i32, ptr %a 63*f4b925eeSMatt Arsenault %b2val = load i32, ptr %b 64dcc3e728SAndrew Litteken %add2 = add i32 2, %a2val 65dcc3e728SAndrew Litteken %mul2 = mul i32 2, %b2val 66dcc3e728SAndrew Litteken br label %block_5 67dcc3e728SAndrew Littekenblock_3: 68*f4b925eeSMatt Arsenault %aval = load i32, ptr %a 69*f4b925eeSMatt Arsenault %bval = load i32, ptr %b 70dcc3e728SAndrew Litteken %add = add i32 2, %aval 71dcc3e728SAndrew Litteken %mul = mul i32 2, %bval 72dcc3e728SAndrew Litteken br label %block_4 73dcc3e728SAndrew Littekenblock_4: 74*f4b925eeSMatt Arsenault store i32 %add, ptr %output, align 4 75*f4b925eeSMatt Arsenault store i32 %mul, ptr %result, align 4 76dcc3e728SAndrew Litteken br label %block_6 77dcc3e728SAndrew Littekenblock_5: 78*f4b925eeSMatt Arsenault store i32 %add2, ptr %output, align 4 79*f4b925eeSMatt Arsenault store i32 %mul2, ptr %result, align 4 80dcc3e728SAndrew Litteken br label %block_6 81e8f4e41bSAndrew Littekendummy: 82e8f4e41bSAndrew Litteken ret void 83dcc3e728SAndrew Littekenblock_6: 84dcc3e728SAndrew Litteken %diff = phi i32 [%aval, %block_4], [%a2val, %block_5] 85dcc3e728SAndrew Litteken ret void 86dcc3e728SAndrew Litteken} 87dcc3e728SAndrew Litteken 88dcc3e728SAndrew Litteken; CHECK-LABEL: @outline_outputs1( 89dcc3e728SAndrew Litteken; CHECK-NEXT: entry: 90dcc3e728SAndrew Litteken; CHECK-NEXT: [[DIFF_CE_LOC:%.*]] = alloca i32, align 4 91dcc3e728SAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 92dcc3e728SAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 93dcc3e728SAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 94dcc3e728SAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 95dcc3e728SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 96dcc3e728SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 97dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 98dcc3e728SAndrew Litteken; CHECK: block_1: 99dcc3e728SAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 100dcc3e728SAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 101dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 102dcc3e728SAndrew Litteken; CHECK: block_2: 103*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[DIFF_CE_LOC]]) 104*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[DIFF_CE_LOC]]) 105*f4b925eeSMatt Arsenault; CHECK-NEXT: [[DIFF_CE_RELOAD:%.*]] = load i32, ptr [[DIFF_CE_LOC]], align 4 106*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[DIFF_CE_LOC]]) 107dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6:%.*]] 108e8f4e41bSAndrew Litteken; CHECK: dummy: 109e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 110dcc3e728SAndrew Litteken; CHECK: block_6: 111dcc3e728SAndrew Litteken; CHECK-NEXT: [[DIFF:%.*]] = phi i32 [ [[DIFF_CE_RELOAD]], [[BLOCK_2]] ] 112dcc3e728SAndrew Litteken; CHECK-NEXT: ret void 113dcc3e728SAndrew Litteken; 114dcc3e728SAndrew Litteken; 115dcc3e728SAndrew Litteken; CHECK-LABEL: @outline_outputs2( 116dcc3e728SAndrew Litteken; CHECK-NEXT: entry: 117dcc3e728SAndrew Litteken; CHECK-NEXT: [[DIFF_CE_LOC:%.*]] = alloca i32, align 4 118dcc3e728SAndrew Litteken; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 119dcc3e728SAndrew Litteken; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 120dcc3e728SAndrew Litteken; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 121dcc3e728SAndrew Litteken; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 122dcc3e728SAndrew Litteken; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 123dcc3e728SAndrew Litteken; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 124dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2:%.*]] 125dcc3e728SAndrew Litteken; CHECK: block_1: 126dcc3e728SAndrew Litteken; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 127dcc3e728SAndrew Litteken; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 128dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2]] 129dcc3e728SAndrew Litteken; CHECK: block_2: 130*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[DIFF_CE_LOC]]) 131*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[DIFF_CE_LOC]]) 132*f4b925eeSMatt Arsenault; CHECK-NEXT: [[DIFF_CE_RELOAD:%.*]] = load i32, ptr [[DIFF_CE_LOC]], align 4 133*f4b925eeSMatt Arsenault; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[DIFF_CE_LOC]]) 134dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6:%.*]] 135e8f4e41bSAndrew Litteken; CHECK: dummy: 136e8f4e41bSAndrew Litteken; CHECK-NEXT: ret void 137dcc3e728SAndrew Litteken; CHECK: block_6: 138dcc3e728SAndrew Litteken; CHECK-NEXT: [[DIFF:%.*]] = phi i32 [ [[DIFF_CE_RELOAD]], [[BLOCK_2]] ] 139dcc3e728SAndrew Litteken; CHECK-NEXT: ret void 140dcc3e728SAndrew Litteken; 141dcc3e728SAndrew Litteken; 142dcc3e728SAndrew Litteken; CHECK: define internal void @outlined_ir_func_0( 143dcc3e728SAndrew Litteken; CHECK-NEXT: newFuncRoot: 144dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_2_TO_OUTLINE:%.*]] 145dcc3e728SAndrew Litteken; CHECK: block_2_to_outline: 146*f4b925eeSMatt Arsenault; CHECK-NEXT: [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4 147*f4b925eeSMatt Arsenault; CHECK-NEXT: [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4 148dcc3e728SAndrew Litteken; CHECK-NEXT: [[ADD2:%.*]] = add i32 2, [[A2VAL]] 149dcc3e728SAndrew Litteken; CHECK-NEXT: [[MUL2:%.*]] = mul i32 2, [[B2VAL]] 150dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_5:%.*]] 151dcc3e728SAndrew Litteken; CHECK: block_3: 152*f4b925eeSMatt Arsenault; CHECK-NEXT: [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4 153*f4b925eeSMatt Arsenault; CHECK-NEXT: [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4 154dcc3e728SAndrew Litteken; CHECK-NEXT: [[ADD:%.*]] = add i32 2, [[AVAL]] 155dcc3e728SAndrew Litteken; CHECK-NEXT: [[MUL:%.*]] = mul i32 2, [[BVAL]] 156dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_4:%.*]] 157dcc3e728SAndrew Litteken; CHECK: block_4: 158*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD]], ptr [[TMP2:%.*]], align 4 159*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL]], ptr [[TMP3:%.*]], align 4 160dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6_SPLIT:%.*]] 161dcc3e728SAndrew Litteken; CHECK: block_5: 162*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[ADD2]], ptr [[TMP2]], align 4 163*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[MUL2]], ptr [[TMP3]], align 4 164dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6_SPLIT]] 165dcc3e728SAndrew Litteken; CHECK: block_6.split: 166dcc3e728SAndrew Litteken; CHECK-NEXT: [[DIFF_CE:%.*]] = phi i32 [ [[AVAL]], [[BLOCK_4]] ], [ [[A2VAL]], [[BLOCK_5]] ] 167dcc3e728SAndrew Litteken; CHECK-NEXT: br label [[BLOCK_6_EXITSTUB:%.*]] 168dcc3e728SAndrew Litteken; CHECK: block_6.exitStub: 169*f4b925eeSMatt Arsenault; CHECK-NEXT: store i32 [[DIFF_CE]], ptr [[TMP4:%.*]], align 4 170dcc3e728SAndrew Litteken; CHECK-NEXT: ret void 171dcc3e728SAndrew Litteken; 172