Add some tests for SimplifyCFG's TurnSwitchRangeIntoICmp(). NFC.
[oota-llvm.git] / test / Transforms / SimplifyCFG / switch_thread.ll
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