blob: 1d29813ecfa2e520189531bc07724bf2d81fbf6d [file] [log] [blame]
Eric Christophercee313d2019-04-17 04:52:47 +00001; RUN: opt %s -S -simplifycfg | FileCheck %s
2
3declare void @is(i1)
4
5; If A == B is false then A == B is implied false.
6; CHECK-LABEL: @test_eq_eq
7; CHECK-NOT: call void @is(i1 true)
8; CHECK: call void @is(i1 false)
9define void @test_eq_eq(i32 %a, i32 %b) {
10 %cmp1 = icmp eq i32 %a, %b
11 br i1 %cmp1, label %untaken, label %taken
12
13taken:
14 %cmp2 = icmp eq i32 %a, %b
15 br i1 %cmp2, label %istrue, label %isfalse
16
17istrue:
18 call void @is(i1 true)
19 ret void
20
21isfalse:
22 call void @is(i1 false)
23 ret void
24
25untaken:
26 ret void
27}
28
29; If A == B is false then A != B is implied true.
30; CHECK-LABEL: @test_eq_ne
31; CHECK: call void @is(i1 true)
32; CHECK-NOT: call void @is(i1 false)
33define void @test_eq_ne(i32 %a, i32 %b) {
34 %cmp1 = icmp eq i32 %a, %b
35 br i1 %cmp1, label %untaken, label %taken
36
37taken:
38 %cmp2 = icmp ne i32 %a, %b
39 br i1 %cmp2, label %istrue, label %isfalse
40
41istrue:
42 call void @is(i1 true)
43 ret void
44
45isfalse:
46 call void @is(i1 false)
47 ret void
48
49untaken:
50 ret void
51}
52
53; If A != B is false then A != B is implied false.
54; CHECK-LABEL: @test_ne_ne
55; CHECK-NOT: call void @is(i1 true)
56; CHECK: call void @is(i1 false)
57define void @test_ne_ne(i32 %a, i32 %b) {
58 %cmp1 = icmp ne i32 %a, %b
59 br i1 %cmp1, label %untaken, label %taken
60
61taken:
62 %cmp2 = icmp ne i32 %a, %b
63 br i1 %cmp2, label %istrue, label %isfalse
64
65istrue:
66 call void @is(i1 true)
67 ret void
68
69isfalse:
70 call void @is(i1 false)
71 ret void
72
73untaken:
74 ret void
75}
76
77; If A != B is false then A >u B is implied false.
78; CHECK-LABEL: @test_ne_ugt
79; CHECK-NOT: call void @is(i1 true)
80; CHECK: call void @is(i1 false)
81define void @test_ne_ugt(i32 %a, i32 %b) {
82 %cmp1 = icmp ne i32 %a, %b
83 br i1 %cmp1, label %untaken, label %taken
84
85taken:
86 %cmp2 = icmp ugt i32 %a, %b
87 br i1 %cmp2, label %istrue, label %isfalse
88
89istrue:
90 call void @is(i1 true)
91 ret void
92
93isfalse:
94 call void @is(i1 false)
95 ret void
96
97untaken:
98 ret void
99}
100
101; If A != B is false then A >=u B is implied true.
102; CHECK-LABEL: @test_ne_uge
103; CHECK: call void @is(i1 true)
104; CHECK-NOT: call void @is(i1 false)
105define void @test_ne_uge(i32 %a, i32 %b) {
106 %cmp1 = icmp ne i32 %a, %b
107 br i1 %cmp1, label %untaken, label %taken
108
109taken:
110 %cmp2 = icmp uge i32 %a, %b
111 br i1 %cmp2, label %istrue, label %isfalse
112
113istrue:
114 call void @is(i1 true)
115 ret void
116
117isfalse:
118 call void @is(i1 false)
119 ret void
120
121untaken:
122 ret void
123}
124
125; If A != B is false then A <u B is implied false.
126; CHECK-LABEL: @test_ne_ult
127; CHECK-NOT: call void @is(i1 true)
128; CHECK: call void @is(i1 false)
129define void @test_ne_ult(i32 %a, i32 %b) {
130 %cmp1 = icmp ne i32 %a, %b
131 br i1 %cmp1, label %untaken, label %taken
132
133taken:
134 %cmp2 = icmp ult i32 %a, %b
135 br i1 %cmp2, label %istrue, label %isfalse
136
137istrue:
138 call void @is(i1 true)
139 ret void
140
141isfalse:
142 call void @is(i1 false)
143 ret void
144
145untaken:
146 ret void
147}
148
149; If A != B is false then A <=u B is implied true.
150; CHECK-LABEL: @test_ne_ule
151; CHECK: call void @is(i1 true)
152; CHECK-NOT: call void @is(i1 false)
153define void @test_ne_ule(i32 %a, i32 %b) {
154 %cmp1 = icmp ne i32 %a, %b
155 br i1 %cmp1, label %untaken, label %taken
156
157taken:
158 %cmp2 = icmp ule i32 %a, %b
159 br i1 %cmp2, label %istrue, label %isfalse
160
161istrue:
162 call void @is(i1 true)
163 ret void
164
165isfalse:
166 call void @is(i1 false)
167 ret void
168
169untaken:
170 ret void
171}
172
173; If A >u B is false then A >u B is implied false.
174; CHECK-LABEL: @test_ugt_ugt
175; CHECK-NOT: call void @is(i1 true)
176; CHECK: call void @is(i1 false)
177define void @test_ugt_ugt(i32 %a, i32 %b) {
178 %cmp1 = icmp ugt i32 %a, %b
179 br i1 %cmp1, label %untaken, label %taken
180
181taken:
182 %cmp2 = icmp ugt i32 %a, %b
183 br i1 %cmp2, label %istrue, label %isfalse
184
185istrue:
186 call void @is(i1 true)
187 ret void
188
189isfalse:
190 call void @is(i1 false)
191 ret void
192
193untaken:
194 ret void
195}
196
197; If A >u B is false then A <=u B is implied true.
198; CHECK-LABEL: @test_ugt_ule
199; CHECK: call void @is(i1 true)
200; CHECK-NOT: call void @is(i1 false)
201define void @test_ugt_ule(i32 %a, i32 %b) {
202 %cmp1 = icmp ugt i32 %a, %b
203 br i1 %cmp1, label %untaken, label %taken
204
205taken:
206 %cmp2 = icmp ule i32 %a, %b
207 br i1 %cmp2, label %istrue, label %isfalse
208
209istrue:
210 call void @is(i1 true)
211 ret void
212
213isfalse:
214 call void @is(i1 false)
215 ret void
216
217untaken:
218 ret void
219}
220
221; If A >=u B is false then A >=u B is implied false.
222; CHECK-LABEL: @test_uge_uge
223; CHECK-NOT: call void @is(i1 true)
224; CHECK: call void @is(i1 false)
225define void @test_uge_uge(i32 %a, i32 %b) {
226 %cmp1 = icmp uge i32 %a, %b
227 br i1 %cmp1, label %untaken, label %taken
228
229taken:
230 %cmp2 = icmp uge i32 %a, %b
231 br i1 %cmp2, label %istrue, label %isfalse
232
233istrue:
234 call void @is(i1 true)
235 ret void
236
237isfalse:
238 call void @is(i1 false)
239 ret void
240
241untaken:
242 ret void
243}
244
245; If A >=u B is false then A <u B is implied true.
246; CHECK-LABEL: @test_uge_ult
247; CHECK: call void @is(i1 true)
248; CHECK-NOT: call void @is(i1 false)
249define void @test_uge_ult(i32 %a, i32 %b) {
250 %cmp1 = icmp uge i32 %a, %b
251 br i1 %cmp1, label %untaken, label %taken
252
253taken:
254 %cmp2 = icmp ult i32 %a, %b
255 br i1 %cmp2, label %istrue, label %isfalse
256
257istrue:
258 call void @is(i1 true)
259 ret void
260
261isfalse:
262 call void @is(i1 false)
263 ret void
264
265untaken:
266 ret void
267}
268
269; If A >=u B is false then A <=u B is implied true.
270; CHECK-LABEL: @test_uge_ule
271; CHECK: call void @is(i1 true)
272; CHECK-NOT: call void @is(i1 false)
273define void @test_uge_ule(i32 %a, i32 %b) {
274 %cmp1 = icmp uge i32 %a, %b
275 br i1 %cmp1, label %untaken, label %taken
276
277taken:
278 %cmp2 = icmp ule i32 %a, %b
279 br i1 %cmp2, label %istrue, label %isfalse
280
281istrue:
282 call void @is(i1 true)
283 ret void
284
285isfalse:
286 call void @is(i1 false)
287 ret void
288
289untaken:
290 ret void
291}
292
293; If A <u B is false then A <u B is implied false.
294; CHECK-LABEL: @test_ult_ult
295; CHECK-NOT: call void @is(i1 true)
296; CHECK: call void @is(i1 false)
297define void @test_ult_ult(i32 %a, i32 %b) {
298 %cmp1 = icmp ult i32 %a, %b
299 br i1 %cmp1, label %untaken, label %taken
300
301taken:
302 %cmp2 = icmp ult i32 %a, %b
303 br i1 %cmp2, label %istrue, label %isfalse
304
305istrue:
306 call void @is(i1 true)
307 ret void
308
309isfalse:
310 call void @is(i1 false)
311 ret void
312
313untaken:
314 ret void
315}
316
317; If A <=u B is false then A <=u B is implied false.
318; CHECK-LABEL: @test_ule_ule
319; CHECK-NOT: call void @is(i1 true)
320; CHECK: call void @is(i1 false)
321define void @test_ule_ule(i32 %a, i32 %b) {
322 %cmp1 = icmp ule i32 %a, %b
323 br i1 %cmp1, label %untaken, label %taken
324
325taken:
326 %cmp2 = icmp ule i32 %a, %b
327 br i1 %cmp2, label %istrue, label %isfalse
328
329istrue:
330 call void @is(i1 true)
331 ret void
332
333isfalse:
334 call void @is(i1 false)
335 ret void
336
337untaken:
338 ret void
339}