| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature |
| ; RUN: opt -passes=ipsccp < %s -S | FileCheck %s |
| ; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck %s |
| |
| define void @barney() { |
| ; CHECK-LABEL: define {{[^@]+}}@barney() { |
| ; CHECK-NEXT: bb: |
| ; CHECK-NEXT: br label [[BB9:%.*]] |
| ; CHECK: bb6: |
| ; CHECK-NEXT: unreachable |
| ; CHECK: bb9: |
| ; CHECK-NEXT: br label [[BB6:%.*]] |
| ; |
| bb: |
| br label %bb9 |
| |
| bb6: ; preds = %bb9 |
| unreachable |
| |
| bb7: ; preds = %bb9 |
| unreachable |
| |
| bb9: ; preds = %bb |
| switch i16 0, label %bb6 [ |
| i16 61, label %bb7 |
| ] |
| } |
| |
| define void @blam() { |
| ; CHECK-LABEL: define {{[^@]+}}@blam() { |
| ; CHECK-NEXT: bb: |
| ; CHECK-NEXT: br label [[BB16:%.*]] |
| ; CHECK: bb16: |
| ; CHECK-NEXT: br label [[BB38:%.*]] |
| ; CHECK: bb38: |
| ; CHECK-NEXT: unreachable |
| ; |
| bb: |
| br label %bb16 |
| |
| bb16: ; preds = %bb |
| switch i32 0, label %bb38 [ |
| i32 66, label %bb17 |
| i32 63, label %bb18 |
| i32 86, label %bb19 |
| ] |
| |
| bb17: ; preds = %bb16 |
| unreachable |
| |
| bb18: ; preds = %bb16 |
| unreachable |
| |
| bb19: ; preds = %bb16 |
| unreachable |
| |
| bb38: ; preds = %bb16 |
| unreachable |
| } |
| |
| |
| define void @hoge() { |
| ; CHECK-LABEL: define {{[^@]+}}@hoge() { |
| ; CHECK-NEXT: bb: |
| ; CHECK-NEXT: unreachable |
| ; |
| bb: |
| switch i16 undef, label %bb1 [ |
| i16 135, label %bb2 |
| i16 66, label %bb2 |
| ] |
| |
| bb1: ; preds = %bb |
| ret void |
| |
| bb2: ; preds = %bb, %bb |
| switch i16 0, label %bb3 [ |
| i16 61, label %bb4 |
| i16 54, label %bb4 |
| i16 49, label %bb4 |
| ] |
| |
| bb3: ; preds = %bb2 |
| unreachable |
| |
| bb4: ; preds = %bb2, %bb2, %bb2 |
| unreachable |
| } |
| |
| ; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced |
| ; by an unreachable block. |
| define void @pr49573_main() { |
| ; CHECK-LABEL: define {{[^@]+}}@pr49573_main() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TGT:%.*]] = call i16 @pr49573_fn() |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| %tgt = call i16 @pr49573_fn() |
| switch i16 %tgt, label %default.bb [ |
| i16 0, label %case.0 |
| i16 1, label %case.1 |
| i16 2, label %case.2 |
| ] |
| |
| case.0: |
| unreachable |
| |
| default.bb: |
| ret void |
| |
| case.1: |
| ret void |
| |
| case.2: |
| br label %next |
| |
| next: |
| %tgt.2 = call i16 @pr49573_fn_2() |
| switch i16 %tgt.2, label %default.bb [ |
| i16 0, label %case.0 |
| i16 2, label %case.2 |
| ] |
| } |
| |
| ; Make sure a new unreachable BB is created. |
| define void @pr49573_main_2() { |
| ; CHECK-LABEL: define {{[^@]+}}@pr49573_main_2() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TGT:%.*]] = call i16 @pr49573_fn() |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| %tgt = call i16 @pr49573_fn() |
| switch i16 %tgt, label %default.bb [ |
| i16 0, label %case.0 |
| i16 1, label %case.1 |
| i16 2, label %case.2 |
| ] |
| |
| case.0: |
| unreachable |
| |
| default.bb: |
| ret void |
| |
| case.1: |
| ret void |
| |
| case.2: |
| ret void |
| } |
| |
| define internal i16 @pr49573_fn() { |
| ; CHECK-LABEL: define {{[^@]+}}@pr49573_fn() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| br i1 undef, label %then, label %else |
| |
| then: |
| ret i16 0 |
| |
| else: |
| ret i16 2 |
| } |
| |
| define internal i16 @pr49573_fn_2() { |
| ; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: unreachable |
| ; |
| entry: |
| br i1 undef, label %then, label %else |
| |
| then: |
| ret i16 0 |
| |
| else: |
| ret i16 2 |
| } |