193 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature2; RUN: opt -passes=ipsccp < %s -S | FileCheck %s3; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck %s4 5define void @barney() {6; CHECK-LABEL: define {{[^@]+}}@barney() {7; CHECK-NEXT: bb:8; CHECK-NEXT: br label [[BB9:%.*]]9; CHECK: bb6:10; CHECK-NEXT: unreachable11; CHECK: bb9:12; CHECK-NEXT: br label [[BB6:%.*]]13;14bb:15 br label %bb916 17bb6: ; preds = %bb918 unreachable19 20bb7: ; preds = %bb921 unreachable22 23bb9: ; preds = %bb24 switch i16 0, label %bb6 [25 i16 61, label %bb726 ]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: unreachable37;38bb:39 br label %bb1640 41bb16: ; preds = %bb42 switch i32 0, label %bb38 [43 i32 66, label %bb1744 i32 63, label %bb1845 i32 86, label %bb1946 ]47 48bb17: ; preds = %bb1649 unreachable50 51bb18: ; preds = %bb1652 unreachable53 54bb19: ; preds = %bb1655 unreachable56 57bb38: ; preds = %bb1658 unreachable59}60 61 62define void @hoge(i1 %arg, i16 %arg2) {63; CHECK-LABEL: define {{[^@]+}}@hoge64; 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 void72; CHECK: bb2:73; CHECK-NEXT: br label [[BB3:%.*]]74; CHECK: bb3:75; CHECK-NEXT: unreachable76;77bb:78 switch i16 %arg2, label %bb1 [79 i16 135, label %bb280 i16 66, label %bb281 ]82 83bb1: ; preds = %bb84 ret void85 86bb2: ; preds = %bb, %bb87 switch i16 0, label %bb3 [88 i16 61, label %bb489 i16 54, label %bb490 i16 49, label %bb491 ]92 93bb3: ; preds = %bb294 unreachable95 96bb4: ; preds = %bb2, %bb2, %bb297 unreachable98}99 100; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced101; 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.0107 i16 1, label %case.1108 i16 2, label %case.2109 ]110 111case.0:112 unreachable113 114default.bb:115 ret void116 117case.1:118 ret void119 120case.2:121 br label %next122 123next:124 %tgt.2 = call i16 @pr49573_fn_2(i1 %arg)125 switch i16 %tgt.2, label %default.bb [126 i16 0, label %case.0127 i16 2, label %case.2128 ]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.0137 i16 1, label %case.1138 i16 2, label %case.2139 ]140 141case.0:142 unreachable143 144default.bb:145 ret void146 147case.1:148 ret void149 150case.2:151 ret void152}153 154define internal i16 @pr49573_fn(i1 %arg) {155; CHECK-LABEL: define {{[^@]+}}@pr49573_fn156; 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 0161; CHECK: else:162; CHECK-NEXT: ret i16 2163;164entry:165 br i1 %arg, label %then, label %else166 167then:168 ret i16 0169 170else:171 ret i16 2172}173 174define internal i16 @pr49573_fn_2(i1 %arg) {175; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2176; 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 0181; CHECK: else:182; CHECK-NEXT: ret i16 2183;184entry:185 br i1 %arg, label %then, label %else186 187then:188 ret i16 0189 190else:191 ret i16 2192}193