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
6 define void @test1(i32 %x) {
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( )
16 else.1: ; preds = %then.1, %entry
20 define void @test2(i32 %x) {
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( )
30 else.1: ; preds = %then.1, %entry
34 define void @test3(i32 %x) {
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( )
44 else.1: ; preds = %then.1, %entry
48 define void @test4(i32 %x, i32 %y) {
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
62 else.2: ; preds = %then.2, %then.1
63 call void (...)* @fail( )
67 define void @test5(i32 %x) {
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
73 then.2: ; preds = %else.1
74 call void (...)* @fail( )
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
81 define void @test6(i32 %x, i32 %y) {
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
89 then.2: ; preds = %else.2, %else.1
90 call void (...)* @fail( )
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
100 define void @test7(i32 %x) {
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( )
111 else.1: ; preds = %then.1, %entry
115 define void @test8(i32 %x) {
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
125 else.2: ; preds = %then.1
126 call void (...)* @fail( )
130 define void @test9(i32 %y, i32 %z) {
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( )
143 oops: ; preds = %cond_true
144 call void (...)* @fail( )
146 return: ; preds = %entry
150 define void @test10() {
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( )
158 cond_false: ; preds = %entry
159 call void (...)* @pass( )
163 define void @switch1(i32 %x) {
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 [
172 then1: ; preds = %cond_false
173 call void (...)* @pass( )
175 then2: ; preds = %cond_false
176 call void (...)* @fail( )
178 return: ; preds = %cond_false, %entry
182 define void @switch2(i32 %x) {
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 [
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( )
198 return: ; preds = %then1, %cond_false, %entry
202 define void @switch3(i32 %x) {
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 [
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( )
217 return: ; preds = %then1, %cond_false, %entry
221 define void @switch4(i32 %x) {
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 [
230 then1: ; preds = %default, %cond_false, %entry
232 then2: ; preds = %cond_false
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( )
242 define void @select1(i32 %x) {
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( )
255 return: ; preds = %else, %then
259 define void @select2(i32 %x) {
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( )
272 return: ; preds = %else, %then
276 declare void @fail(...)
278 declare void @pass(...)