1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s 3 4declare void @foo_01() 5declare void @foo_02() 6declare void @foo_03() 7 8define i32 @test_01(ptr %p, i32 %x, i1 %cond) { 9; CHECK-LABEL: @test_01( 10; CHECK-NEXT: entry: 11; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]] 12; CHECK: common.ret: 13; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ] 14; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 15; CHECK: bb: 16; CHECK-NEXT: [[R]] = load i32, ptr [[P:%.*]], align 4 17; CHECK-NEXT: br label [[COMMON_RET]] 18; 19entry: 20 br i1 %cond, label %bb, label %pred 21 22pred: 23 switch i32 %x, label %other_succ [i32 42, label %bb 24 i32 123456, label %bb 25 i32 -654321, label %bb] 26 27bb: 28 %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry] 29 %r = load i32, ptr %phi 30 ret i32 %r 31 32other_succ: 33 ret i32 0 34} 35 36define i32 @test_02(ptr %p, i32 %x, i1 %cond) { 37; CHECK-LABEL: @test_02( 38; CHECK-NEXT: entry: 39; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]] 40; CHECK: common.ret: 41; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ] 42; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 43; CHECK: bb: 44; CHECK-NEXT: [[R]] = load i32, ptr [[P:%.*]], align 4 45; CHECK-NEXT: br label [[COMMON_RET]] 46; 47entry: 48 br i1 %cond, label %bb, label %pred 49 50pred: 51 switch i32 %x, label %bb [i32 42, label %other_succ 52 i32 123456, label %other_succ 53 i32 -654321, label %other_succ] 54 55bb: 56 %phi = phi ptr [null, %pred], [%p, %entry] 57 %r = load i32, ptr %phi 58 ret i32 %r 59 60other_succ: 61 ret i32 0 62} 63 64define i32 @test_03(ptr %p, i32 %x, i1 %cond) { 65; CHECK-LABEL: @test_03( 66; CHECK-NEXT: entry: 67; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]] 68; CHECK: pred: 69; CHECK-NEXT: switch i32 [[X:%.*]], label [[UNREACHABLE:%.*]] [ 70; CHECK-NEXT: i32 42, label [[COMMON_RET:%.*]] 71; CHECK-NEXT: i32 123456, label [[COMMON_RET]] 72; CHECK-NEXT: i32 -654321, label [[COMMON_RET]] 73; CHECK-NEXT: i32 1, label [[DO_1:%.*]] 74; CHECK-NEXT: i32 2, label [[DO_2:%.*]] 75; CHECK-NEXT: i32 3, label [[DO_3:%.*]] 76; CHECK-NEXT: ] 77; CHECK: common.ret: 78; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ] 79; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 80; CHECK: unreachable: 81; CHECK-NEXT: unreachable 82; CHECK: bb: 83; CHECK-NEXT: [[R]] = load i32, ptr [[P:%.*]], align 4 84; CHECK-NEXT: br label [[COMMON_RET]] 85; CHECK: do_1: 86; CHECK-NEXT: call void @foo_01() 87; CHECK-NEXT: br label [[COMMON_RET]] 88; CHECK: do_2: 89; CHECK-NEXT: call void @foo_02() 90; CHECK-NEXT: br label [[COMMON_RET]] 91; CHECK: do_3: 92; CHECK-NEXT: call void @foo_03() 93; CHECK-NEXT: br label [[COMMON_RET]] 94; 95entry: 96 br i1 %cond, label %bb, label %pred 97 98pred: 99 switch i32 %x, label %bb [i32 42, label %other_succ 100 i32 123456, label %other_succ 101 i32 -654321, label %other_succ 102 i32 1, label %do_1 103 i32 2, label %do_2 104 i32 3, label %do_3] 105 106bb: 107 %phi = phi ptr [null, %pred], [%p, %entry] 108 %r = load i32, ptr %phi 109 ret i32 %r 110 111do_1: 112 call void @foo_01() 113 ret i32 1 114 115do_2: 116 call void @foo_02() 117 ret i32 1 118 119do_3: 120 call void @foo_03() 121 ret i32 1 122 123other_succ: 124 ret i32 0 125} 126 127define i32 @test_04(ptr %p, i32 %x, i1 %cond) { 128; CHECK-LABEL: @test_04( 129; CHECK-NEXT: entry: 130; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]] 131; CHECK: pred: 132; CHECK-NEXT: switch i32 [[X:%.*]], label [[COMMON_RET:%.*]] [ 133; CHECK-NEXT: i32 3, label [[DO_3:%.*]] 134; CHECK-NEXT: i32 2, label [[DO_2:%.*]] 135; CHECK-NEXT: i32 1, label [[DO_1:%.*]] 136; CHECK-NEXT: ] 137; CHECK: common.ret: 138; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ] 139; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 140; CHECK: bb: 141; CHECK-NEXT: [[R]] = load i32, ptr [[P:%.*]], align 4 142; CHECK-NEXT: br label [[COMMON_RET]] 143; CHECK: do_1: 144; CHECK-NEXT: call void @foo_01() 145; CHECK-NEXT: br label [[COMMON_RET]] 146; CHECK: do_2: 147; CHECK-NEXT: call void @foo_02() 148; CHECK-NEXT: br label [[COMMON_RET]] 149; CHECK: do_3: 150; CHECK-NEXT: call void @foo_03() 151; CHECK-NEXT: br label [[COMMON_RET]] 152; 153entry: 154 br i1 %cond, label %bb, label %pred 155 156pred: 157 switch i32 %x, label %other_succ [i32 42, label %bb 158 i32 123456, label %bb 159 i32 -654321, label %bb 160 i32 1, label %do_1 161 i32 2, label %do_2 162 i32 3, label %do_3] 163 164bb: 165 %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry] 166 %r = load i32, ptr %phi 167 ret i32 %r 168 169do_1: 170 call void @foo_01() 171 ret i32 1 172 173do_2: 174 call void @foo_02() 175 ret i32 1 176 177do_3: 178 call void @foo_03() 179 ret i32 1 180 181other_succ: 182 ret i32 0 183} 184