Convert more tests to avoid llvm-as.
[oota-llvm.git] / test / Transforms / PredicateSimplifier / predsimplify.ll
1 ; RUN: opt < %s -predsimplify -instcombine -simplifycfg -S > %t
2 ; RUN: grep -v declare %t | not grep fail
3 ; RUN: grep -v declare %t | grep pass | count 4
4
5
6 define void @test1(i32 %x) {
7 entry:
8         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
9         br i1 %A, label %then.1, label %else.1
10 then.1:         ; preds = %entry
11         %B = icmp eq i32 %x, 1          ; <i1> [#uses=1]
12         br i1 %B, label %then.2, label %else.1
13 then.2:         ; preds = %then.1
14         call void (...)* @fail( )
15         ret void
16 else.1:         ; preds = %then.1, %entry
17         ret void
18 }
19
20 define void @test2(i32 %x) {
21 entry:
22         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
23         %B = icmp eq i32 %x, 1          ; <i1> [#uses=1]
24         br i1 %A, label %then.1, label %else.1
25 then.1:         ; preds = %entry
26         br i1 %B, label %then.2, label %else.1
27 then.2:         ; preds = %then.1
28         call void (...)* @fail( )
29         ret void
30 else.1:         ; preds = %then.1, %entry
31         ret void
32 }
33
34 define void @test3(i32 %x) {
35 entry:
36         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
37         %B = icmp eq i32 %x, 1          ; <i1> [#uses=1]
38         br i1 %A, label %then.1, label %else.1
39 then.1:         ; preds = %entry
40         br i1 %B, label %then.2, label %else.1
41 then.2:         ; preds = %then.1
42         call void (...)* @fail( )
43         ret void
44 else.1:         ; preds = %then.1, %entry
45         ret void
46 }
47
48 define void @test4(i32 %x, i32 %y) {
49 entry:
50         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
51         %B = icmp eq i32 %y, 0          ; <i1> [#uses=1]
52         %C = and i1 %A, %B              ; <i1> [#uses=1]
53         br i1 %C, label %then.1, label %else.1
54 then.1:         ; preds = %entry
55         %D = icmp eq i32 %x, 0          ; <i1> [#uses=1]
56         br i1 %D, label %then.2, label %else.2
57 then.2:         ; preds = %then.1
58         %E = icmp eq i32 %y, 0          ; <i1> [#uses=1]
59         br i1 %E, label %else.1, label %else.2
60 else.1:         ; preds = %then.2, %entry
61         ret void
62 else.2:         ; preds = %then.2, %then.1
63         call void (...)* @fail( )
64         ret void
65 }
66
67 define void @test5(i32 %x) {
68 entry:
69         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
70         br i1 %A, label %then.1, label %else.1
71 then.1:         ; preds = %else.1, %entry
72         ret void
73 then.2:         ; preds = %else.1
74         call void (...)* @fail( )
75         ret void
76 else.1:         ; preds = %entry
77         %B = icmp eq i32 %x, 0          ; <i1> [#uses=1]
78         br i1 %B, label %then.2, label %then.1
79 }
80
81 define void @test6(i32 %x, i32 %y) {
82 entry:
83         %A = icmp eq i32 %x, 0          ; <i1> [#uses=1]
84         %B = icmp eq i32 %y, 0          ; <i1> [#uses=1]
85         %C = or i1 %A, %B               ; <i1> [#uses=1]
86         br i1 %C, label %then.1, label %else.1
87 then.1:         ; preds = %else.2, %entry
88         ret void
89 then.2:         ; preds = %else.2, %else.1
90         call void (...)* @fail( )
91         ret void
92 else.1:         ; preds = %entry
93         %D = icmp eq i32 %x, 0          ; <i1> [#uses=1]
94         br i1 %D, label %then.2, label %else.2
95 else.2:         ; preds = %else.1
96         %E = icmp ne i32 %y, 0          ; <i1> [#uses=1]
97         br i1 %E, label %then.1, label %then.2
98 }
99
100 define void @test7(i32 %x) {
101 entry:
102         %A = icmp ne i32 %x, 0          ; <i1> [#uses=1]
103         %B = xor i1 %A, true            ; <i1> [#uses=1]
104         br i1 %B, label %then.1, label %else.1
105 then.1:         ; preds = %entry
106         %C = icmp eq i32 %x, 1          ; <i1> [#uses=1]
107         br i1 %C, label %then.2, label %else.1
108 then.2:         ; preds = %then.1
109         call void (...)* @fail( )
110         ret void
111 else.1:         ; preds = %then.1, %entry
112         ret void
113 }
114
115 define void @test8(i32 %x) {
116 entry:
117         %A = add i32 %x, 1              ; <i32> [#uses=1]
118         %B = icmp eq i32 %x, 0          ; <i1> [#uses=1]
119         br i1 %B, label %then.1, label %then.2
120 then.1:         ; preds = %entry
121         %C = icmp eq i32 %A, 1          ; <i1> [#uses=1]
122         br i1 %C, label %then.2, label %else.2
123 then.2:         ; preds = %then.1, %entry
124         ret void
125 else.2:         ; preds = %then.1
126         call void (...)* @fail( )
127         ret void
128 }
129
130 define void @test9(i32 %y, i32 %z) {
131 entry:
132         %x = add i32 %y, %z             ; <i32> [#uses=1]
133         %A = icmp eq i32 %y, 3          ; <i1> [#uses=1]
134         %B = icmp eq i32 %z, 5          ; <i1> [#uses=1]
135         %C = and i1 %A, %B              ; <i1> [#uses=1]
136         br i1 %C, label %cond_true, label %return
137 cond_true:              ; preds = %entry
138         %D = icmp eq i32 %x, 8          ; <i1> [#uses=1]
139         br i1 %D, label %then, label %oops
140 then:           ; preds = %cond_true
141         call void (...)* @pass( )
142         ret void
143 oops:           ; preds = %cond_true
144         call void (...)* @fail( )
145         ret void
146 return:         ; preds = %entry
147         ret void
148 }
149
150 define void @test10() {
151 entry:
152         %A = alloca i32         ; <i32*> [#uses=1]
153         %B = icmp eq i32* %A, null              ; <i1> [#uses=1]
154         br i1 %B, label %cond_true, label %cond_false
155 cond_true:              ; preds = %entry
156         call void (...)* @fail( )
157         ret void
158 cond_false:             ; preds = %entry
159         call void (...)* @pass( )
160         ret void
161 }
162
163 define void @switch1(i32 %x) {
164 entry:
165         %A = icmp eq i32 %x, 10         ; <i1> [#uses=1]
166         br i1 %A, label %return, label %cond_false
167 cond_false:             ; preds = %entry
168         switch i32 %x, label %return [
169                  i32 9, label %then1
170                  i32 10, label %then2
171         ]
172 then1:          ; preds = %cond_false
173         call void (...)* @pass( )
174         ret void
175 then2:          ; preds = %cond_false
176         call void (...)* @fail( )
177         ret void
178 return:         ; preds = %cond_false, %entry
179         ret void
180 }
181
182 define void @switch2(i32 %x) {
183 entry:
184         %A = icmp eq i32 %x, 10         ; <i1> [#uses=1]
185         br i1 %A, label %return, label %cond_false
186 cond_false:             ; preds = %entry
187         switch i32 %x, label %return [
188                  i32 8, label %then1
189                  i32 9, label %then1
190                  i32 10, label %then1
191         ]
192 then1:          ; preds = %cond_false, %cond_false, %cond_false
193         %B = icmp ne i32 %x, 8          ; <i1> [#uses=1]
194         br i1 %B, label %then2, label %return
195 then2:          ; preds = %then1
196         call void (...)* @pass( )
197         ret void
198 return:         ; preds = %then1, %cond_false, %entry
199         ret void
200 }
201
202 define void @switch3(i32 %x) {
203 entry:
204         %A = icmp eq i32 %x, 10         ; <i1> [#uses=1]
205         br i1 %A, label %return, label %cond_false
206 cond_false:             ; preds = %entry
207         switch i32 %x, label %return [
208                  i32 9, label %then1
209                  i32 10, label %then1
210         ]
211 then1:          ; preds = %cond_false, %cond_false
212         %B = icmp eq i32 %x, 9          ; <i1> [#uses=1]
213         br i1 %B, label %return, label %oops
214 oops:           ; preds = %then1
215         call void (...)* @fail( )
216         ret void
217 return:         ; preds = %then1, %cond_false, %entry
218         ret void
219 }
220
221 define void @switch4(i32 %x) {
222 entry:
223         %A = icmp eq i32 %x, 10         ; <i1> [#uses=1]
224         br i1 %A, label %then1, label %cond_false
225 cond_false:             ; preds = %entry
226         switch i32 %x, label %default [
227                  i32 9, label %then1
228                  i32 10, label %then2
229         ]
230 then1:          ; preds = %default, %cond_false, %entry
231         ret void
232 then2:          ; preds = %cond_false
233         ret void
234 default:                ; preds = %cond_false
235         %B = icmp eq i32 %x, 9          ; <i1> [#uses=1]
236         br i1 %B, label %oops, label %then1
237 oops:           ; preds = %default
238         call void (...)* @fail( )
239         ret void
240 }
241
242 define void @select1(i32 %x) {
243 entry:
244         %A = icmp eq i32 %x, 10         ; <i1> [#uses=3]
245         %B = select i1 %A, i32 1, i32 2         ; <i32> [#uses=1]
246         %C = icmp eq i32 %B, 1          ; <i1> [#uses=1]
247         br i1 %C, label %then, label %else
248 then:           ; preds = %entry
249         br i1 %A, label %return, label %oops
250 else:           ; preds = %entry
251         br i1 %A, label %oops, label %return
252 oops:           ; preds = %else, %then
253         call void (...)* @fail( )
254         ret void
255 return:         ; preds = %else, %then
256         ret void
257 }
258
259 define void @select2(i32 %x) {
260 entry:
261         %A = icmp eq i32 %x, 10         ; <i1> [#uses=2]
262         %B = select i1 %A, i32 1, i32 2         ; <i32> [#uses=1]
263         %C = icmp eq i32 %B, 1          ; <i1> [#uses=2]
264         br i1 %A, label %then, label %else
265 then:           ; preds = %entry
266         br i1 %C, label %return, label %oops
267 else:           ; preds = %entry
268         br i1 %C, label %oops, label %return
269 oops:           ; preds = %else, %then
270         call void (...)* @fail( )
271         ret void
272 return:         ; preds = %else, %then
273         ret void
274 }
275
276 declare void @fail(...)
277
278 declare void @pass(...)