New testcase
[oota-llvm.git] / test / Transforms / CorrelatedExprs / basictest.ll
1 ; RUN: llvm-as < %s | opt -cee -constprop -instcombine -dce | llvm-dis | not grep 'REMOVE'
2
3 int %test1(int %A) {
4         %cond = seteq int %A, 40
5         br bool %cond, label %T, label %F
6 T:
7         %REMOVE = add int %A, 2  ; Should become = 42
8         ret int %REMOVE
9 F:
10         ret int 8
11 }
12
13 bool %test2(int %A) {
14         %cond = seteq int %A, 40
15         br bool %cond, label %T, label %F
16 T:
17         %REMOVE = seteq int %A, 2  ; Should become = false
18         ret bool %REMOVE
19 F:
20         ret bool false
21 }
22
23 bool %test3(int %A) {
24         %cond = setlt int %A, 40
25         br bool %cond, label %T, label %F
26 T:
27         %REMOVE = setgt int %A, 47  ; Should become = false
28         ret bool %REMOVE
29 F:
30         %REMOVE2 = setge int %A, 40  ; Should become = true
31         ret bool %REMOVE2
32 }
33
34 bool %test4(int %A) {
35         %cond = setlt int %A, 40
36         br bool %cond, label %T, label %F
37 T:
38         %REMOVE = setgt int %A, 47  ; Should become = false
39         ret bool %REMOVE
40 F:
41         ret bool false
42 }
43
44 int %test5(int %A, int %B) {
45         %cond = setne int %A, %B
46         br bool %cond, label %F, label %T
47 T:
48         %C = sub int %A, %B  ; = 0
49         ret int %C
50 F:
51         ret int 0
52 }
53
54 bool %test6(int %A) {
55         %REMOVE = setlt int %A, 47  ; Should become dead
56         %cond = setlt int %A, 40
57         br bool %cond, label %T, label %F
58 T:
59         ret bool %REMOVE  ;; == true
60 F:
61         ret bool false
62 }
63
64 bool %test7(int %A) {
65         %cond = setlt int %A, 40
66         br bool %cond, label %T, label %F
67 T:
68         %REMOVE = xor bool %cond, true
69         ret bool %REMOVE
70 F:
71         ret bool false
72 }
73
74 ; Test that and expressions are handled...
75 bool %test8(int %A, int %B) {
76         %cond1 = setle int %A, 7
77         %cond2 = setle int %B, 7
78         %cond = and bool %cond1, %cond2
79         br bool %cond, label %T, label %F
80 T:
81         %REMOVE1 = seteq int %A, 9             ; false
82         %REMOVE2 = setge int %B, 9             ; false
83         %REMOVE = or bool %REMOVE1, %REMOVE2   ; false
84         ret bool %REMOVE
85 F:
86         ret bool false
87 }
88
89 ; Test that or expressions are handled...
90 bool %test9(int %A, int %B) {
91         %cond1 = setle int %A, 7
92         %cond2 = setle int %B, 7
93         %cond = or bool %cond1, %cond2
94         br bool %cond, label %T, label %F
95 T:
96         ret bool false
97 F:
98         %REMOVE1 = setge int %A, 8             ; true
99         %REMOVE2 = setge int %B, 8             ; true
100         %REMOVE = or bool %REMOVE1, %REMOVE2   ; true
101         ret bool %REMOVE
102 }
103
104 bool %test10(int %A) {
105         %cond = setle int %A, 7
106         br bool %cond, label %T, label %F
107 T:
108         ret bool false
109 F:
110         %REMOVE = setge int %A, 8
111         ret bool %REMOVE
112 }
113
114 ; Implement correlated comparisons against non-constants
115 bool %test11(int %A, int %B) {
116         %cond = setlt int %A, %B
117         br bool %cond, label %T, label %F
118 T:
119         %REMOVE1 = seteq int %A, %B    ; false
120         %REMOVE2 = setle int %A, %B    ; true
121         %cond2 = and bool %REMOVE1, %REMOVE2
122         ret bool %cond2
123 F:
124         ret bool true
125 }
126
127 bool %test12(int %A) {
128         %cond = setlt int %A, 0
129         br bool %cond, label %T, label %F
130 T:
131         %REMOVE = setne int %A, 0    ; true
132         ret bool %REMOVE
133 F:
134         ret bool false
135 }