1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature 2; RUN: opt -passes=ipsccp < %s -S | FileCheck %s 3; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck %s 4 5define void @barney() { 6; CHECK-LABEL: define {{[^@]+}}@barney() { 7; CHECK-NEXT: bb: 8; CHECK-NEXT: br label [[BB9:%.*]] 9; CHECK: bb6: 10; CHECK-NEXT: unreachable 11; CHECK: bb9: 12; CHECK-NEXT: br label [[BB6:%.*]] 13; 14bb: 15 br label %bb9 16 17bb6: ; preds = %bb9 18 unreachable 19 20bb7: ; preds = %bb9 21 unreachable 22 23bb9: ; preds = %bb 24 switch i16 0, label %bb6 [ 25 i16 61, label %bb7 26 ] 27} 28 29define void @blam() { 30; CHECK-LABEL: define {{[^@]+}}@blam() { 31; CHECK-NEXT: bb: 32; CHECK-NEXT: br label [[BB16:%.*]] 33; CHECK: bb16: 34; CHECK-NEXT: br label [[BB38:%.*]] 35; CHECK: bb38: 36; CHECK-NEXT: unreachable 37; 38bb: 39 br label %bb16 40 41bb16: ; preds = %bb 42 switch i32 0, label %bb38 [ 43 i32 66, label %bb17 44 i32 63, label %bb18 45 i32 86, label %bb19 46 ] 47 48bb17: ; preds = %bb16 49 unreachable 50 51bb18: ; preds = %bb16 52 unreachable 53 54bb19: ; preds = %bb16 55 unreachable 56 57bb38: ; preds = %bb16 58 unreachable 59} 60 61 62define void @hoge(i1 %arg, i16 %arg2) { 63; CHECK-LABEL: define {{[^@]+}}@hoge 64; CHECK-SAME: (i1 [[ARG:%.*]], i16 [[ARG2:%.*]]) { 65; CHECK-NEXT: bb: 66; CHECK-NEXT: switch i16 [[ARG2]], label [[BB1:%.*]] [ 67; CHECK-NEXT: i16 135, label [[BB2:%.*]] 68; CHECK-NEXT: i16 66, label [[BB2]] 69; CHECK-NEXT: ] 70; CHECK: bb1: 71; CHECK-NEXT: ret void 72; CHECK: bb2: 73; CHECK-NEXT: br label [[BB3:%.*]] 74; CHECK: bb3: 75; CHECK-NEXT: unreachable 76; 77bb: 78 switch i16 %arg2, label %bb1 [ 79 i16 135, label %bb2 80 i16 66, label %bb2 81 ] 82 83bb1: ; preds = %bb 84 ret void 85 86bb2: ; preds = %bb, %bb 87 switch i16 0, label %bb3 [ 88 i16 61, label %bb4 89 i16 54, label %bb4 90 i16 49, label %bb4 91 ] 92 93bb3: ; preds = %bb2 94 unreachable 95 96bb4: ; preds = %bb2, %bb2, %bb2 97 unreachable 98} 99 100; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced 101; by an unreachable block. 102define void @pr49573_main(i1 %arg) { 103entry: 104 %tgt = call i16 @pr49573_fn(i1 %arg) 105 switch i16 %tgt, label %default.bb [ 106 i16 0, label %case.0 107 i16 1, label %case.1 108 i16 2, label %case.2 109 ] 110 111case.0: 112 unreachable 113 114default.bb: 115 ret void 116 117case.1: 118 ret void 119 120case.2: 121 br label %next 122 123next: 124 %tgt.2 = call i16 @pr49573_fn_2(i1 %arg) 125 switch i16 %tgt.2, label %default.bb [ 126 i16 0, label %case.0 127 i16 2, label %case.2 128 ] 129} 130 131; Make sure a new unreachable BB is created. 132define void @pr49573_main_2(i1 %arg) { 133entry: 134 %tgt = call i16 @pr49573_fn(i1 %arg) 135 switch i16 %tgt, label %default.bb [ 136 i16 0, label %case.0 137 i16 1, label %case.1 138 i16 2, label %case.2 139 ] 140 141case.0: 142 unreachable 143 144default.bb: 145 ret void 146 147case.1: 148 ret void 149 150case.2: 151 ret void 152} 153 154define internal i16 @pr49573_fn(i1 %arg) { 155; CHECK-LABEL: define {{[^@]+}}@pr49573_fn 156; CHECK-SAME: (i1 [[ARG:%.*]]) { 157; CHECK-NEXT: entry: 158; CHECK-NEXT: br i1 [[ARG]], label [[THEN:%.*]], label [[ELSE:%.*]] 159; CHECK: then: 160; CHECK-NEXT: ret i16 0 161; CHECK: else: 162; CHECK-NEXT: ret i16 2 163; 164entry: 165 br i1 %arg, label %then, label %else 166 167then: 168 ret i16 0 169 170else: 171 ret i16 2 172} 173 174define internal i16 @pr49573_fn_2(i1 %arg) { 175; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2 176; CHECK-SAME: (i1 [[ARG:%.*]]) { 177; CHECK-NEXT: entry: 178; CHECK-NEXT: br i1 [[ARG]], label [[THEN:%.*]], label [[ELSE:%.*]] 179; CHECK: then: 180; CHECK-NEXT: ret i16 0 181; CHECK: else: 182; CHECK-NEXT: ret i16 2 183; 184entry: 185 br i1 %arg, label %then, label %else 186 187then: 188 ret i16 0 189 190else: 191 ret i16 2 192} 193