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