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 6 declare void @foo1() 7 8 declare void @foo2() 9 10 declare void @DEAD() 11 12 define 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. 19 T: ; 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 ] 27 A2: ; 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 33 A: ; 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 38 Done: ; preds = %B, %A, %A2, %0 39 ret void 40 B: ; 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 45 C: ; preds = %B, %A, %A2, %T, %T 46 call void @DEAD( ) 47 ret void 48 } 49 50 define 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. 57 A: ; 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. 66 C: ; preds = %A, %A 67 call void @DEAD( ) 68 ret void 69 T: ; preds = %0 70 call void @foo1( ) 71 call void @foo1( ) 72 ret void 73 D: ; preds = %A, %0 74 call void @foo1( ) 75 ret void 76 E: ; preds = %A, %0 77 ret void 78 } 79 80