| ; RUN: opt < %s -simplifycfg -S | \ |
| ; RUN: not grep "call void @DEAD" |
| |
| ; Test that we can thread a simple known condition through switch statements. |
| |
| declare void @foo1() |
| |
| declare void @foo2() |
| |
| declare void @DEAD() |
| |
| define void @test1(i32 %V) { |
| switch i32 %V, label %A [ |
| i32 4, label %T |
| i32 17, label %Done |
| i32 1234, label %A |
| ] |
| ;; V == 4 if we get here. |
| T: ; preds = %0 |
| call void @foo1( ) |
| ;; This switch is always statically determined. |
| switch i32 %V, label %A2 [ |
| i32 4, label %B |
| i32 17, label %C |
| i32 42, label %C |
| ] |
| A2: ; preds = %T |
| call void @DEAD( ) |
| call void @DEAD( ) |
| ;; always true |
| %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1] |
| br i1 %cond2, label %Done, label %C |
| A: ; preds = %0, %0 |
| call void @foo1( ) |
| ;; always true |
| %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1] |
| br i1 %cond, label %Done, label %C |
| Done: ; preds = %B, %A, %A2, %0 |
| ret void |
| B: ; preds = %T |
| call void @foo2( ) |
| ;; always true |
| %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1] |
| br i1 %cond3, label %Done, label %C |
| C: ; preds = %B, %A, %A2, %T, %T |
| call void @DEAD( ) |
| ret void |
| } |
| |
| define void @test2(i32 %V) { |
| switch i32 %V, label %A [ |
| i32 4, label %T |
| i32 17, label %D |
| i32 1234, label %E |
| ] |
| ;; V != 4, 17, 1234 here. |
| A: ; preds = %0 |
| call void @foo1( ) |
| ;; This switch is always statically determined. |
| switch i32 %V, label %E [ |
| i32 4, label %C |
| i32 17, label %C |
| i32 42, label %D |
| ] |
| ;; unreacahble. |
| C: ; preds = %A, %A |
| call void @DEAD( ) |
| ret void |
| T: ; preds = %0 |
| call void @foo1( ) |
| call void @foo1( ) |
| ret void |
| D: ; preds = %A, %0 |
| call void @foo1( ) |
| ret void |
| E: ; preds = %A, %0 |
| ret void |
| } |
| |