; 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 | |
} | |