1; RUN: opt < %s -simplifycfg -S | \ 2; RUN: not grep {call void @DEAD} 3 4; Test that we can thread a simple known condition through switch statements. 5 6declare void @foo1() 7 8declare void @foo2() 9 10declare void @DEAD() 11 12define void @test1(i32 %V) { 13 switch i32 %V, label %A [ 14 i32 4, label %T 15 i32 17, label %Done 16 i32 1234, label %A 17 ] 18;; V == 4 if we get here. 19T: ; preds = %0 20 call void @foo1( ) 21 ;; This switch is always statically determined. 22 switch i32 %V, label %A2 [ 23 i32 4, label %B 24 i32 17, label %C 25 i32 42, label %C 26 ] 27A2: ; preds = %T 28 call void @DEAD( ) 29 call void @DEAD( ) 30 ;; always true 31 %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1] 32 br i1 %cond2, label %Done, label %C 33A: ; preds = %0, %0 34 call void @foo1( ) 35 ;; always true 36 %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1] 37 br i1 %cond, label %Done, label %C 38Done: ; preds = %B, %A, %A2, %0 39 ret void 40B: ; preds = %T 41 call void @foo2( ) 42 ;; always true 43 %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1] 44 br i1 %cond3, label %Done, label %C 45C: ; preds = %B, %A, %A2, %T, %T 46 call void @DEAD( ) 47 ret void 48} 49 50define void @test2(i32 %V) { 51 switch i32 %V, label %A [ 52 i32 4, label %T 53 i32 17, label %D 54 i32 1234, label %E 55 ] 56;; V != 4, 17, 1234 here. 57A: ; preds = %0 58 call void @foo1( ) 59 ;; This switch is always statically determined. 60 switch i32 %V, label %E [ 61 i32 4, label %C 62 i32 17, label %C 63 i32 42, label %D 64 ] 65;; unreacahble. 66C: ; preds = %A, %A 67 call void @DEAD( ) 68 ret void 69T: ; preds = %0 70 call void @foo1( ) 71 call void @foo1( ) 72 ret void 73D: ; preds = %A, %0 74 call void @foo1( ) 75 ret void 76E: ; preds = %A, %0 77 ret void 78} 79 80