72 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s3 4; When the an outlined section contains a PHINode with an incoming block5; outside of the region, the predecessors to be handled specially to ensure that6; a global value is properly assigned. This ensures that there is no crash7; in that situation.8 9define void @fn1() local_unnamed_addr #0 {10entry:11 br label %block_112 13block_1:14 %a = phi i32 [ 0, %block_2], [ 1, %entry ]15 br i1 0, label %block_3, label %block_216block_2:17 br i1 0, label %block_3, label %block_118 19block_3:20 %b = phi i32 [ 0, %block_2 ], [ 1, %block_1 ]21 br label %block_422 23block_4:24 %c = phi i32 [ 0, %block_5 ], [ 1, %block_3 ]25 br i1 0, label %block_6, label %block_526 27block_5:28 br i1 0, label %block_6, label %block_429 30block_6:31 unreachable32}33; CHECK-LABEL: @fn1(34; CHECK-NEXT: entry:35; CHECK-NEXT: [[B_CE_LOC:%.*]] = alloca i32, align 436; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[B_CE_LOC]])37; CHECK-NEXT: call void @outlined_ir_func_0(ptr [[B_CE_LOC]], i32 0)38; CHECK-NEXT: [[B_CE_RELOAD:%.*]] = load i32, ptr [[B_CE_LOC]], align 439; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[B_CE_LOC]])40; CHECK-NEXT: br label [[BLOCK_3:%.*]]41; CHECK: block_3:42; CHECK-NEXT: [[B:%.*]] = phi i32 [ [[B_CE_RELOAD]], [[ENTRY:%.*]] ]43; CHECK-NEXT: call void @outlined_ir_func_0(ptr null, i32 -1)44; CHECK-NEXT: br label [[BLOCK_6:%.*]]45; CHECK: block_6:46; CHECK-NEXT: unreachable47;48;49; CHECK-LABEL: define internal void @outlined_ir_func_0(50; CHECK-NEXT: newFuncRoot:51; CHECK-NEXT: br label [[ENTRY_TO_OUTLINE:%.*]]52; CHECK: entry_to_outline:53; CHECK-NEXT: br label [[BLOCK_1:%.*]]54; CHECK: block_1:55; CHECK-NEXT: [[A:%.*]] = phi i32 [ 0, [[BLOCK_2:%.*]] ], [ 1, [[ENTRY_TO_OUTLINE]] ]56; CHECK-NEXT: br i1 false, label [[BLOCK_3_SPLIT:%.*]], label [[BLOCK_2]]57; CHECK: block_2:58; CHECK-NEXT: br i1 false, label [[BLOCK_3_SPLIT]], label [[BLOCK_1]]59; CHECK: block_3.split:60; CHECK-NEXT: [[B_CE:%.*]] = phi i32 [ 0, [[BLOCK_2]] ], [ 1, [[BLOCK_1]] ]61; CHECK-NEXT: br label [[BLOCK_3_EXITSTUB:%.*]]62; CHECK: block_3.exitStub:63; CHECK-NEXT: switch i32 [[TMP1:%.*]], label [[FINAL_BLOCK_0:%.*]] [64; CHECK-NEXT: i32 0, label [[OUTPUT_BLOCK_0_0:%.*]]65; CHECK-NEXT: ]66; CHECK: output_block_0_0:67; CHECK-NEXT: store i32 [[B_CE]], ptr [[TMP0:%.*]], align 468; CHECK-NEXT: br label [[FINAL_BLOCK_0]]69; CHECK: final_block_0:70; CHECK-NEXT: ret void71;72