[SLP] Add cost model for `llvm.powi.*` intrinsics
[llvm-project.git] / llvm / test / Transforms / SCCP / conditions-ranges.ll
blob9c63b7c0f39ba0550ed692dd0dced3bf74434711
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
4 declare void @use(i1)
6 define void @f1(i32 %a, i32 %b) {
7 ; CHECK-LABEL: @f1(
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    [[A_255:%.*]] = and i32 [[A:%.*]], 255
10 ; CHECK-NEXT:    [[A_2:%.*]] = add i32 [[A_255]], 20
11 ; CHECK-NEXT:    [[BC:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
12 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
13 ; CHECK:       true:
14 ; CHECK-NEXT:    call void @use(i1 false)
15 ; CHECK-NEXT:    call void @use(i1 false)
16 ; CHECK-NEXT:    call void @use(i1 false)
17 ; CHECK-NEXT:    call void @use(i1 true)
18 ; CHECK-NEXT:    call void @use(i1 true)
19 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 21
20 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
21 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 21
22 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
23 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[B]], 255
24 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
25 ; CHECK-NEXT:    ret void
26 ; CHECK:       false:
27 ; CHECK-NEXT:    call void @use(i1 false)
28 ; CHECK-NEXT:    call void @use(i1 false)
29 ; CHECK-NEXT:    call void @use(i1 true)
30 ; CHECK-NEXT:    call void @use(i1 true)
31 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 21
32 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
33 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B]], 275
34 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
35 ; CHECK-NEXT:    ret void
37 entry:
38   %a.255 = and i32 %a, 255
39   %a.2 = add i32 %a.255, 20
40   %bc = icmp ugt i32 %b, %a.2
41   br i1 %bc, label %true, label %false
43 true: ; %b in [21, 0)
44   ; Conditions below are false.
45   %f.1 = icmp eq i32 %b, 0
46   call void @use(i1 %f.1)
47   %f.2 = icmp eq i32 %b, 20
48   call void @use(i1 %f.2)
49   %f.3 = icmp ult i32 %b, 20
50   call void @use(i1 %f.3)
52   ; Conditions below are true.
53   %t.1 = icmp ugt i32 %b, 5
54   call void @use(i1 %t.1)
55   %t.2 = icmp ne i32 %b, 20
56   call void @use(i1 %t.2)
58   ; Conditions below cannot be simplified.
59   %c.1 = icmp eq i32 %b, 21
60   call void @use(i1 %c.1)
61   %c.2 = icmp ugt i32 %b, 21
62   call void @use(i1 %c.2)
63   %c.3 = icmp ugt i32 %b, 255
64   call void @use(i1 %c.3)
65   ret void
67 false: ;%b in [0, 276)
68   ; Conditions below are false;
69   %f.4 = icmp eq i32 %b, 276
70   call void @use(i1 %f.4)
71   %f.5 = icmp ugt i32 %b, 275
72   call void @use(i1 %f.5)
74   ; Conditions below are true;
75   %t.3 = icmp ne i32 %b, 276
76   call void @use(i1 %t.3)
77   %t.4 = icmp ule i32 %b, 275
78   call void @use(i1 %t.4)
80   ; Conditions below cannot be simplified.
81   %c.4 = icmp eq i32 %b, 21
82   call void @use(i1 %c.4)
83   %c.5 = icmp eq i32 %b, 275
84   call void @use(i1 %c.5)
85   ret void
88 define void @f2_ptr(i8* %a, i8* %b) {
89 ; CHECK-LABEL: @f2_ptr(
90 ; CHECK-NEXT:  entry:
91 ; CHECK-NEXT:    [[BC:%.*]] = icmp eq i8* [[A:%.*]], null
92 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
93 ; CHECK:       true:
94 ; CHECK-NEXT:    call void @use(i1 false)
95 ; CHECK-NEXT:    call void @use(i1 true)
96 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* null, [[B:%.*]]
97 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
98 ; CHECK-NEXT:    ret void
99 ; CHECK:       false:
100 ; CHECK-NEXT:    call void @use(i1 false)
101 ; CHECK-NEXT:    call void @use(i1 true)
102 ; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8* [[A]], [[B]]
103 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
104 ; CHECK-NEXT:    ret void
106 entry:
107   %bc = icmp eq i8* %a, null
108   br i1 %bc, label %true, label %false
110 true: ; %a == 0
111   %f.1 = icmp ne i8* %a, null
112   call void @use(i1 %f.1)
114   %t.1 = icmp eq i8* %a, null
115   call void @use(i1 %t.1)
117   %c.1 = icmp eq i8* %a, %b
118   call void @use(i1 %c.1)
119   ret void
121 false: ; %a != 0
122   %f.2 = icmp eq i8* %a, null
123   call void @use(i1 %f.2)
125   %t.2 = icmp ne i8* %a, null
126   call void @use(i1 %t.2)
128   %c.2 = icmp eq i8* %a, %b
129   call void @use(i1 %c.2)
130   ret void
133 define i8* @f3(i8* %a, i8* %b, i1 %c) {
134 ; CHECK-LABEL: @f3(
135 ; CHECK-NEXT:  entry:
136 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
137 ; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
138 ; CHECK:       true:
139 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
140 ; CHECK:       true.2:
141 ; CHECK-NEXT:    br label [[EXIT_2:%.*]]
142 ; CHECK:       false.2:
143 ; CHECK-NEXT:    br label [[EXIT_2]]
144 ; CHECK:       exit.2:
145 ; CHECK-NEXT:    [[P:%.*]] = phi i8* [ null, [[TRUE_2]] ], [ [[B:%.*]], [[FALSE_2]] ]
146 ; CHECK-NEXT:    ret i8* [[P]]
147 ; CHECK:       false:
148 ; CHECK-NEXT:    ret i8* null
150 entry:
151   %c.1 = icmp eq i8* %a, null
152   br i1 %c.1, label %true, label %false
154 true:
155   br i1 %c, label %true.2, label %false.2
157 true.2:
158   br label %exit.2
160 false.2:
161   br label %exit.2
163 exit.2:
164   %p = phi i8* [ %a, %true.2 ], [ %b, %false.2 ]
165   ret i8* %p
167 false:
168   ret i8* null
171 define i32 @f5(i64 %sz) {
172 ; CHECK-LABEL: @f5(
173 ; CHECK-NEXT:  entry:
174 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
175 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
176 ; CHECK:       cond.true:
177 ; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 4088, [[SZ]]
178 ; CHECK-NEXT:    br label [[COND_END]]
179 ; CHECK:       cond.end:
180 ; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
181 ; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
182 ; CHECK-NEXT:    ret i32 [[CONV]]
184 entry:
185   %cmp = icmp ugt i64 4088, %sz
186   br i1 %cmp, label %cond.true, label %cond.end
188 cond.true:                                        ; preds = %entry
189   %div = udiv i64 4088, %sz
190   br label %cond.end
192 cond.end:                                         ; preds = %entry, %cond.true
193   %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
194   %conv = trunc i64 %cond to i32
195   ret i32 %conv
198 define void @f6(i32 %b) {
199 ; CHECK-LABEL: @f6(
200 ; CHECK-NEXT:  entry:
201 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], 20
202 ; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
203 ; CHECK:       true:
204 ; CHECK-NEXT:    call void @use(i1 true)
205 ; CHECK-NEXT:    ret void
206 ; CHECK:       false:
207 ; CHECK-NEXT:    ret void
209 entry:
210   %a = add i32 10, 10
211   %c.1 = icmp ugt i32 %b, %a
212   br i1 %c.1, label %true, label %false
214 true:
215   %c.2 = icmp eq i32 %a, 20
216   call void @use(i1 %c.2)
217   ret void
219 false:
220   ret void
223 ; Test with 2 unrelated nested conditions.
224 define void @f7_nested_conds(i32* %a, i32 %b) {
225 ; CHECK-LABEL: @f7_nested_conds(
226 ; CHECK-NEXT:  entry:
227 ; CHECK-NEXT:    [[A_V:%.*]] = load i32, i32* [[A:%.*]], align 4
228 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i32 [[A_V]], 0
229 ; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
230 ; CHECK:       false:
231 ; CHECK-NEXT:    br label [[TRUE_2:%.*]]
232 ; CHECK:       true.2:
233 ; CHECK-NEXT:    call void @use(i1 true)
234 ; CHECK-NEXT:    ret void
235 ; CHECK:       true:
236 ; CHECK-NEXT:    store i32 [[B:%.*]], i32* [[A]], align 4
237 ; CHECK-NEXT:    ret void
239 entry:
240   %a.v = load i32, i32* %a
241   %c.1 = icmp ne i32 %a.v, 0
242   br i1 %c.1, label %true, label %false
244 false:
245   %c.2 = icmp ult i32 %a.v, 3
246   br i1 %c.2, label %true.2, label %true
248 true.2:
249   %c.3 = icmp eq i32 %a.v, 0
250   call void @use(i1 %c.3)
251   ret void
253 true:
254   store i32 %b, i32* %a
255   ret void
258 ; Test with 2 related nested conditions (%b > [20, 276) && %b < 255).
259 define void @f8_nested_conds(i32 %a, i32 %b) {
260 ; CHECK-LABEL: @f8_nested_conds(
261 ; CHECK-NEXT:  entry:
262 ; CHECK-NEXT:    [[A_255:%.*]] = and i32 [[A:%.*]], 255
263 ; CHECK-NEXT:    [[A_2:%.*]] = add i32 [[A_255]], 20
264 ; CHECK-NEXT:    [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
265 ; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
266 ; CHECK:       true:
267 ; CHECK-NEXT:    [[BC_2:%.*]] = icmp ult i32 [[B]], 255
268 ; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
269 ; CHECK:       true.2:
270 ; CHECK-NEXT:    call void @use(i1 false)
271 ; CHECK-NEXT:    call void @use(i1 false)
272 ; CHECK-NEXT:    call void @use(i1 false)
273 ; CHECK-NEXT:    call void @use(i1 false)
274 ; CHECK-NEXT:    call void @use(i1 false)
275 ; CHECK-NEXT:    call void @use(i1 true)
276 ; CHECK-NEXT:    call void @use(i1 true)
277 ; CHECK-NEXT:    call void @use(i1 true)
278 ; CHECK-NEXT:    call void @use(i1 true)
279 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 21
280 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
281 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 21
282 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
283 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[B]], 34
284 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
285 ; CHECK-NEXT:    ret void
286 ; CHECK:       false.2:
287 ; CHECK-NEXT:    call void @use(i1 false)
288 ; CHECK-NEXT:    call void @use(i1 false)
289 ; CHECK-NEXT:    call void @use(i1 true)
290 ; CHECK-NEXT:    call void @use(i1 true)
291 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 255
292 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
293 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ne i32 [[B]], 275
294 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
295 ; CHECK-NEXT:    ret void
296 ; CHECK:       false:
297 ; CHECK-NEXT:    ret void
299 entry:
300   %a.255 = and i32 %a, 255
301   %a.2 = add i32 %a.255, 20
302   %bc.1 = icmp ugt i32 %b, %a.2
303   br i1 %bc.1, label %true, label %false
305 true: ; %b in [21, 0)
306   %bc.2 = icmp ult i32 %b, 255
307   br i1 %bc.2, label %true.2, label %false.2
309 true.2: ; %b in [21, 255)
310   ; Conditions below are false.
311   %f.1 = icmp eq i32 %b, 0
312   call void @use(i1 %f.1)
313   %f.2 = icmp eq i32 %b, 20
314   call void @use(i1 %f.2)
315   %f.3 = icmp ult i32 %b, 20
316   call void @use(i1 %f.3)
317   %f.4 = icmp eq i32 %b, 255
318   call void @use(i1 %f.4)
319   %f.5 = icmp ugt i32 %b, 255
320   call void @use(i1 %f.5)
323   ; Conditions below are true.
324   %t.1 = icmp ugt i32 %b, 5
325   call void @use(i1 %t.1)
326   %t.2 = icmp ne i32 %b, 20
327   call void @use(i1 %t.2)
328   %t.3 = icmp ult i32 %b, 255
329   call void @use(i1 %t.3)
330   %t.4 = icmp ne i32 %b,  300
331   call void @use(i1 %t.4)
333   ; Conditions below cannot be simplified.
334   %c.1 = icmp eq i32 %b, 21
335   call void @use(i1 %c.1)
336   %c.2 = icmp ugt i32 %b, 21
337   call void @use(i1 %c.2)
338   %c.3 = icmp ugt i32 %b, 34
339   call void @use(i1 %c.3)
340   ret void
342 false.2: ;%b in [255, 0)
343   ; Conditions below are false;
344   %f.6 = icmp eq i32 %b, 254
345   call void @use(i1 %f.6)
346   %f.7 = icmp ult i32 %b, 255
347   call void @use(i1 %f.7)
349   ; Conditions below are true;
350   %t.5 = icmp ne i32 %b, 254
351   call void @use(i1 %t.5)
352   %t.6 = icmp uge i32 %b, 255
353   call void @use(i1 %t.6)
355   ; Conditions below cannot be simplified.
356   %c.4 = icmp eq i32 %b, 255
357   call void @use(i1 %c.4)
358   %c.5 = icmp ne i32 %b, 275
359   call void @use(i1 %c.5)
360   ret void
362 false:
363   ret void
366 ; Test with with nested conditions where the second conditions is more limiting than the first one.
367 define void @f9_nested_conds(i32 %a, i32 %b) {
368 ; CHECK-LABEL: @f9_nested_conds(
369 ; CHECK-NEXT:  entry:
370 ; CHECK-NEXT:    [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], 10
371 ; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
372 ; CHECK:       true:
373 ; CHECK-NEXT:    call void @use(i1 false)
374 ; CHECK-NEXT:    call void @use(i1 false)
375 ; CHECK-NEXT:    call void @use(i1 true)
376 ; CHECK-NEXT:    call void @use(i1 true)
377 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 11
378 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
379 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 11
380 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
381 ; CHECK-NEXT:    [[BC_2:%.*]] = icmp ugt i32 [[B]], 20
382 ; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
383 ; CHECK:       true.2:
384 ; CHECK-NEXT:    call void @use(i1 false)
385 ; CHECK-NEXT:    call void @use(i1 false)
386 ; CHECK-NEXT:    call void @use(i1 true)
387 ; CHECK-NEXT:    call void @use(i1 true)
388 ; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[B]], 21
389 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
390 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[B]], 21
391 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
392 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[B]], 34
393 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
394 ; CHECK-NEXT:    ret void
395 ; CHECK:       false.2:
396 ; CHECK-NEXT:    call void @use(i1 false)
397 ; CHECK-NEXT:    call void @use(i1 false)
398 ; CHECK-NEXT:    call void @use(i1 true)
399 ; CHECK-NEXT:    call void @use(i1 true)
400 ; CHECK-NEXT:    call void @use(i1 true)
401 ; CHECK-NEXT:    call void @use(i1 true)
402 ; CHECK-NEXT:    [[C_6:%.*]] = icmp eq i32 [[B]], 11
403 ; CHECK-NEXT:    call void @use(i1 [[C_6]])
404 ; CHECK-NEXT:    [[C_7:%.*]] = icmp ne i32 [[B]], 15
405 ; CHECK-NEXT:    call void @use(i1 [[C_7]])
406 ; CHECK-NEXT:    ret void
407 ; CHECK:       false:
408 ; CHECK-NEXT:    ret void
410 entry:
411   %bc.1 = icmp ugt i32 %b, 10
412   br i1 %bc.1, label %true, label %false
414 true: ; %b in [11, 0)
415   ; Conditions below are false.
416   %f.1 = icmp eq i32 %b, 0
417   call void @use(i1 %f.1)
418   %f.2 = icmp eq i32 %b, 10
419   call void @use(i1 %f.2)
421   ; Conditions below are true.
422   %t.1 = icmp ugt i32 %b, 5
423   call void @use(i1 %t.1)
424   %t.2 = icmp ne i32 %b, 10
425   call void @use(i1 %t.2)
427   ; Conditions below cannot be simplified.
428   %c.1 = icmp eq i32 %b, 11
429   call void @use(i1 %c.1)
430   %c.2 = icmp ugt i32 %b, 11
431   call void @use(i1 %c.2)
433   %bc.2 = icmp ugt i32 %b, 20
434   br i1 %bc.2, label %true.2, label %false.2
436 true.2: ; %b in [21, 0)
437   ; Conditions below are false.
438   %f.3 = icmp eq i32 %b, 11
439   call void @use(i1 %f.3)
440   %f.4 = icmp eq i32 %b, 20
441   call void @use(i1 %f.4)
443   ; Conditions below are true.
444   %t.3 = icmp ugt i32 %b, 11
445   call void @use(i1 %t.3)
446   %t.4 = icmp ne i32 %b, 20
447   call void @use(i1 %t.4)
449   ; Conditions below cannot be simplified.
450   %c.3 = icmp eq i32 %b, 21
451   call void @use(i1 %c.3)
452   %c.4 = icmp ugt i32 %b, 21
453   call void @use(i1 %c.4)
454   %c.5 = icmp ugt i32 %b, 34
455   call void @use(i1 %c.5)
456   ret void
458 false.2: ;%b in [11, 21)
459   ; Conditions below are false;
460   %f.5 = icmp eq i32 %b, 21
461   call void @use(i1 %f.5)
462   %f.6 = icmp ugt i32 %b, 21
463   call void @use(i1 %f.6)
464   %f.7 = icmp ne i32 %b, 5
465   call void @use(i1 %f.7)
467   ; Conditions below are true;
468   %t.5 = icmp ne i32 %b, 21
469   call void @use(i1 %t.5)
470   %t.6 = icmp ult i32 %b, 21
471   call void @use(i1 %t.6)
472   %t.7 = icmp ne i32 %b, 5
473   call void @use(i1 %t.7)
475   ; Conditions below cannot be simplified.
476   %c.6 = icmp eq i32 %b, 11
477   call void @use(i1 %c.6)
478   %c.7 = icmp ne i32 %b, 15
479   call void @use(i1 %c.7)
480   ret void
482 false:
483   ret void
487 ; Test with with nested conditions where the second conditions is more limiting than the first one.
488 define void @f10_cond_does_not_restrict_range(i32 %a, i32 %b) {
489 ; CHECK-LABEL: @f10_cond_does_not_restrict_range(
490 ; CHECK-NEXT:  entry:
491 ; CHECK-NEXT:    [[B_255:%.*]] = and i32 [[B:%.*]], 255
492 ; CHECK-NEXT:    br label [[TRUE:%.*]]
493 ; CHECK:       true:
494 ; CHECK-NEXT:    call void @use(i1 false)
495 ; CHECK-NEXT:    call void @use(i1 false)
496 ; CHECK-NEXT:    call void @use(i1 true)
497 ; CHECK-NEXT:    call void @use(i1 true)
498 ; CHECK-NEXT:    call void @use(i1 true)
499 ; CHECK-NEXT:    call void @use(i1 true)
500 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B_255]], 11
501 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
502 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B_255]], 30
503 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
504 ; CHECK-NEXT:    ret void
506 entry:
507   %b.255 = and i32 %b, 255
508   %bc.1 = icmp ult i32 %b.255, 300
509   br i1 %bc.1, label %true, label %false
511 true: ; %b in [0, 256)
512   ; Conditions below are false.
513   %f.1 = icmp eq i32 %b.255, 256
514   call void @use(i1 %f.1)
515   %f.2 = icmp eq i32 %b.255, 300
516   call void @use(i1 %f.2)
518   ; Conditions below are true.
519   %t.1 = icmp ult i32 %b.255, 256
520   call void @use(i1 %t.1)
521   %t.2 = icmp ult i32 %b.255, 300
522   call void @use(i1 %t.2)
523   %t.3 = icmp ne i32 %b.255, 256
524   call void @use(i1 %t.3)
525   %t.4 = icmp ne i32 %b.255, 300
526   call void @use(i1 %t.4)
528   ; Conditions below cannot be simplified.
529   %c.1 = icmp eq i32 %b.255, 11
530   call void @use(i1 %c.1)
531   %c.2 = icmp ugt i32 %b.255, 30
532   call void @use(i1 %c.2)
533   ret void
535 false:
536   ret void
539 define void @f11_contradiction(i32 %a, i32 %b) {
540 ; CHECK-LABEL: @f11_contradiction(
541 ; CHECK-NEXT:  entry:
542 ; CHECK-NEXT:    [[BC_1:%.*]] = icmp eq i32 [[B:%.*]], 10
543 ; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
544 ; CHECK:       true:
545 ; CHECK-NEXT:    br label [[FALSE]]
546 ; CHECK:       false:
547 ; CHECK-NEXT:    ret void
549 entry:
550   %bc.1 = icmp eq i32 %b, 10
551   br i1 %bc.1, label %true, label %false
553 true: ; %b in [10, 11)
554   %bc.2 = icmp eq i32 %b, 20
555   br i1 %bc.2, label %true.2, label %false
557 true.2:
558   %f.1 = icmp eq i32 %b, 256
559   call void @use(i1 %f.1)
560   %f.2 = icmp ne i32 %b, 300
561   call void @use(i1 %f.2)
562   ret void
564 false:
565   ret void
568 define void @f12_float(float %b) {
569 ; CHECK-LABEL: @f12_float(
570 ; CHECK-NEXT:  entry:
571 ; CHECK-NEXT:    [[BC_1:%.*]] = fcmp olt float 1.000000e+00, [[B:%.*]]
572 ; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
573 ; CHECK:       true:
574 ; CHECK-NEXT:    call void @use(i1 false)
575 ; CHECK-NEXT:    call void @use(i1 true)
576 ; CHECK-NEXT:    ret void
577 ; CHECK:       false:
578 ; CHECK-NEXT:    ret void
580 entry:
581   %a = fadd float 0.0, 1.0
582   %bc.1 = fcmp olt float %a, %b
583   br i1 %bc.1, label %true, label %false
585 true: ; %b in [10, 11)
586   %f.1 = fcmp one float %a, 1.0
587   call void @use(i1 %f.1)
589   %t.1 = fcmp oeq float %a, 1.0
590   call void @use(i1 %t.1)
591   ret void
593 false:
594   ret void
598 @A = global i32 17
599 @B = global i32 17
601 define void @f13_constexpr1() {
602 ; CHECK-LABEL: @f13_constexpr1(
603 ; CHECK-NEXT:  entry:
604 ; CHECK-NEXT:    [[BC_1:%.*]] = icmp eq i32 add (i32 ptrtoint (i32* @A to i32), i32 10), 55
605 ; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
606 ; CHECK:       true:
607 ; CHECK-NEXT:    call void @use(i1 false)
608 ; CHECK-NEXT:    call void @use(i1 true)
609 ; CHECK-NEXT:    ret void
610 ; CHECK:       false:
611 ; CHECK-NEXT:    ret void
613 entry:
614   %a = add i32 ptrtoint (i32* @A to i32), 10
615   %bc.1 = icmp eq i32 %a, 55
616   br i1 %bc.1, label %true, label %false
618 true: ; %b in [10, 11)
619   %f.1 = icmp eq i32 %a, 10
620   call void @use(i1 %f.1)
621   %f.2 = icmp eq i32 %a, 55
622   call void @use(i1 %f.2)
624   ret void
626 false:
627   ret void
630 ; TODO: can we fold the compares in the true block?
631 define void @f14_constexpr2() {
632 ; CHECK-LABEL: @f14_constexpr2(
633 ; CHECK-NEXT:  entry:
634 ; CHECK-NEXT:    br i1 icmp eq (i32 ptrtoint (i32* @A to i32), i32 ptrtoint (i32* @B to i32)), label [[TRUE:%.*]], label [[FALSE:%.*]]
635 ; CHECK:       true:
636 ; CHECK-NEXT:    call void @use(i1 icmp ne (i32 ptrtoint (i32* @B to i32), i32 ptrtoint (i32* @A to i32)))
637 ; CHECK-NEXT:    call void @use(i1 icmp eq (i32 ptrtoint (i32* @B to i32), i32 ptrtoint (i32* @A to i32)))
638 ; CHECK-NEXT:    ret void
639 ; CHECK:       false:
640 ; CHECK-NEXT:    ret void
642 entry:
643   %a = add i32 ptrtoint (i32* @A to i32), 0
644   %b = add i32 ptrtoint (i32* @B to i32), 0
645   %bc.1 = icmp eq i32 %a, %b
646   br i1 %bc.1, label %true, label %false
648 true: ; %b in [10, 11)
649   %f.1 = icmp ne i32 %a, %b
650   call void @use(i1 %f.1)
651   %f.2 = icmp eq i32 %a,  %b
652   call void @use(i1 %f.2)
654   ret void
656 false:
657   ret void
660 define void @loop_1() {
661 ; CHECK-LABEL: @loop_1(
662 ; CHECK-NEXT:  entry:
663 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
664 ; CHECK:       for.cond:
665 ; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]
666 ; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3
667 ; CHECK-NEXT:    br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
668 ; CHECK:       for.cond.cleanup:
669 ; CHECK-NEXT:    ret void
670 ; CHECK:       for.body:
671 ; CHECK-NEXT:    br label [[FOR_COND11:%.*]]
672 ; CHECK:       for.cond11:
673 ; CHECK-NEXT:    br label [[FOR_COND_CLEANUP13]]
674 ; CHECK:       for.cond.cleanup13:
675 ; CHECK-NEXT:    [[INC27]] = add nsw i32 [[I_0]], 1
676 ; CHECK-NEXT:    br label [[FOR_COND]]
678 entry:
679   br label %for.cond
681 for.cond:                                         ; preds = %for.cond.cleanup13, %if.then
682   %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
683   %cmp9 = icmp sle i32 %i.0, 3
684   br i1 %cmp9, label %for.body, label %for.cond.cleanup
686 for.cond.cleanup:                                 ; preds = %for.cond
687   ret void
689 for.body:                                         ; preds = %for.cond
690   br label %for.cond11
692 for.cond11:                                       ; preds = %arrayctor.cont21, %for.body
693   br label %for.cond.cleanup13
695 for.cond.cleanup13:                               ; preds = %for.cond11
696   %inc27 = add nsw i32 %i.0, 1
697   br label %for.cond
701 define void @loop() {
702 ; CHECK-LABEL: @loop(
703 ; CHECK-NEXT:  entry:
704 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
705 ; CHECK:       for.cond:
706 ; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]
707 ; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3
708 ; CHECK-NEXT:    br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
709 ; CHECK:       for.cond.cleanup:
710 ; CHECK-NEXT:    ret void
711 ; CHECK:       for.body:
712 ; CHECK-NEXT:    br label [[FOR_COND11:%.*]]
713 ; CHECK:       for.cond11:
714 ; CHECK-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC:%.*]], [[FOR_BODY14:%.*]] ]
715 ; CHECK-NEXT:    [[CMP12:%.*]] = icmp slt i32 [[J_0]], 2
716 ; CHECK-NEXT:    br i1 [[CMP12]], label [[FOR_BODY14]], label [[FOR_COND_CLEANUP13]]
717 ; CHECK:       for.cond.cleanup13:
718 ; CHECK-NEXT:    [[INC27]] = add nsw i32 [[I_0]], 1
719 ; CHECK-NEXT:    br label [[FOR_COND]]
720 ; CHECK:       for.body14:
721 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
722 ; CHECK-NEXT:    br label [[FOR_COND11]]
724 entry:
725   br label %for.cond
727 for.cond:                                         ; preds = %for.cond.cleanup13, %if.then
728   %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
729   %cmp9 = icmp sle i32 %i.0, 3
730   br i1 %cmp9, label %for.body, label %for.cond.cleanup
732 for.cond.cleanup:                                 ; preds = %for.cond
733   ret void
735 for.body:                                         ; preds = %for.cond
736   br label %for.cond11
738 for.cond11:                                       ; preds = %arrayctor.cont21, %for.body
739   %j.0 = phi i32 [ 0, %for.body ], [ %inc, %for.body14 ]
740   %cmp12 = icmp slt i32 %j.0, 2
741   br i1 %cmp12, label %for.body14, label %for.cond.cleanup13
743 for.cond.cleanup13:                               ; preds = %for.cond11
744   %inc27 = add nsw i32 %i.0, 1
745   br label %for.cond
747 for.body14:
748   %inc = add nsw i32 %j.0, 1
749   br label %for.cond11
752 define i32 @udiv_1(i64 %sz) {
753 ; CHECK-LABEL: @udiv_1(
754 ; CHECK-NEXT:  entry:
755 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
756 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
757 ; CHECK:       cond.true:
758 ; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 4088, [[SZ]]
759 ; CHECK-NEXT:    br label [[COND_END]]
760 ; CHECK:       cond.end:
761 ; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
762 ; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
763 ; CHECK-NEXT:    ret i32 [[CONV]]
765 entry:
766   %cmp = icmp ugt i64 4088, %sz
767   br i1 %cmp, label %cond.true, label %cond.end
769 cond.true:                                        ; preds = %entry
770   %div = udiv i64 4088, %sz
771   br label %cond.end
773 cond.end:                                         ; preds = %entry, %cond.true
774   %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
775   %conv = trunc i64 %cond to i32
776   ret i32 %conv
779 ; Same as @udiv_1, but with the condition switched.
780 define i32 @udiv_2(i64 %sz) {
781 ; CHECK-LABEL: @udiv_2(
782 ; CHECK-NEXT:  entry:
783 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088
784 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
785 ; CHECK:       cond.true:
786 ; CHECK-NEXT:    br label [[COND_END]]
787 ; CHECK:       cond.end:
788 ; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ 0, [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
789 ; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
790 ; CHECK-NEXT:    ret i32 [[CONV]]
792 entry:
793   %cmp = icmp ugt i64 %sz, 4088
794   br i1 %cmp, label %cond.true, label %cond.end
796 cond.true:                                        ; preds = %entry
797   %div = udiv i64 4088, %sz
798   br label %cond.end
800 cond.end:                                         ; preds = %entry, %cond.true
801   %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
802   %conv = trunc i64 %cond to i32
803   ret i32 %conv
806 define void @f16_conditions_and(i32 %a, i32 %b) {
807 ; CHECK-LABEL: @f16_conditions_and(
808 ; CHECK-NEXT:  entry:
809 ; CHECK-NEXT:    [[LT:%.*]] = icmp ult i32 [[A:%.*]], 100
810 ; CHECK-NEXT:    [[GT:%.*]] = icmp ugt i32 [[A]], 20
811 ; CHECK-NEXT:    [[BC:%.*]] = and i1 [[LT]], [[GT]]
812 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
813 ; CHECK:       true:
814 ; CHECK-NEXT:    call void @use(i1 false)
815 ; CHECK-NEXT:    call void @use(i1 false)
816 ; CHECK-NEXT:    call void @use(i1 false)
817 ; CHECK-NEXT:    call void @use(i1 true)
818 ; CHECK-NEXT:    call void @use(i1 true)
819 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 21
820 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
821 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 21
822 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
823 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
824 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
825 ; CHECK-NEXT:    ret void
826 ; CHECK:       false:
827 ; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[A]], 50
828 ; CHECK-NEXT:    call void @use(i1 [[F_4]])
829 ; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[A]], 50
830 ; CHECK-NEXT:    call void @use(i1 [[T_3]])
831 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[A]], 10
832 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
833 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100
834 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
835 ; CHECK-NEXT:    ret void
837 entry:
838   %lt = icmp ult i32 %a, 100
839   %gt = icmp ugt i32 %a, 20
840   %bc = and i1 %lt, %gt
841   br i1 %bc, label %true, label %false
843 true: ; %a in [21, 100)
844   ; Conditions below are false.
845   %f.1 = icmp eq i32 %a, 0
846   call void @use(i1 %f.1)
847   %f.2 = icmp eq i32 %a, 20
848   call void @use(i1 %f.2)
849   %f.3 = icmp ugt i32 %a, 100
850   call void @use(i1 %f.3)
852   ; Conditions below are true.
853   %t.1 = icmp ult i32 %a, 100
854   call void @use(i1 %t.1)
855   %t.2 = icmp ne i32 %a, 20
856   call void @use(i1 %t.2)
858   ; Conditions below cannot be simplified.
859   %c.1 = icmp eq i32 %a, 21
860   call void @use(i1 %c.1)
861   %c.2 = icmp ugt i32 %a, 21
862   call void @use(i1 %c.2)
863   %c.3 = icmp ugt i32 %a, 50
864   call void @use(i1 %c.3)
865   ret void
867 false:
868 ; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.
869 ;       %a should be in in [100, 21)
870   ; Conditions below are false;
871   %f.4 = icmp eq i32 %a, 50
872   call void @use(i1 %f.4)
874   ; Conditions below are true;
875   %t.3 = icmp ne i32 %a, 50
876   call void @use(i1 %t.3)
878   ; Conditions below cannot be simplified.
879   %c.4 = icmp eq i32 %a, 10
880   call void @use(i1 %c.4)
881   %c.5 = icmp eq i32 %b, 100
882   call void @use(i1 %c.5)
883   ret void
886 define void @f16_conditions_and_logical(i32 %a, i32 %b) {
887 ; CHECK-LABEL: @f16_conditions_and_logical(
888 ; CHECK-NEXT:  entry:
889 ; CHECK-NEXT:    [[LT:%.*]] = icmp ult i32 [[A:%.*]], 100
890 ; CHECK-NEXT:    [[GT:%.*]] = icmp ugt i32 [[A]], 20
891 ; CHECK-NEXT:    [[BC:%.*]] = select i1 [[LT]], i1 [[GT]], i1 false
892 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
893 ; CHECK:       true:
894 ; CHECK-NEXT:    call void @use(i1 false)
895 ; CHECK-NEXT:    call void @use(i1 false)
896 ; CHECK-NEXT:    call void @use(i1 false)
897 ; CHECK-NEXT:    call void @use(i1 true)
898 ; CHECK-NEXT:    call void @use(i1 true)
899 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 21
900 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
901 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 21
902 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
903 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
904 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
905 ; CHECK-NEXT:    ret void
906 ; CHECK:       false:
907 ; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[A]], 50
908 ; CHECK-NEXT:    call void @use(i1 [[F_4]])
909 ; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[A]], 50
910 ; CHECK-NEXT:    call void @use(i1 [[T_3]])
911 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[A]], 10
912 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
913 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100
914 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
915 ; CHECK-NEXT:    ret void
917 entry:
918   %lt = icmp ult i32 %a, 100
919   %gt = icmp ugt i32 %a, 20
920   %bc = select i1 %lt, i1 %gt, i1 false
921   br i1 %bc, label %true, label %false
923 true: ; %a in [21, 100)
924   ; Conditions below are false.
925   %f.1 = icmp eq i32 %a, 0
926   call void @use(i1 %f.1)
927   %f.2 = icmp eq i32 %a, 20
928   call void @use(i1 %f.2)
929   %f.3 = icmp ugt i32 %a, 100
930   call void @use(i1 %f.3)
932   ; Conditions below are true.
933   %t.1 = icmp ult i32 %a, 100
934   call void @use(i1 %t.1)
935   %t.2 = icmp ne i32 %a, 20
936   call void @use(i1 %t.2)
938   ; Conditions below cannot be simplified.
939   %c.1 = icmp eq i32 %a, 21
940   call void @use(i1 %c.1)
941   %c.2 = icmp ugt i32 %a, 21
942   call void @use(i1 %c.2)
943   %c.3 = icmp ugt i32 %a, 50
944   call void @use(i1 %c.3)
945   ret void
947 false:
948 ; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.
949 ;       %a should be in in [100, 21)
950   ; Conditions below are false;
951   %f.4 = icmp eq i32 %a, 50
952   call void @use(i1 %f.4)
954   ; Conditions below are true;
955   %t.3 = icmp ne i32 %a, 50
956   call void @use(i1 %t.3)
958   ; Conditions below cannot be simplified.
959   %c.4 = icmp eq i32 %a, 10
960   call void @use(i1 %c.4)
961   %c.5 = icmp eq i32 %b, 100
962   call void @use(i1 %c.5)
963   ret void
966 define void @f17_conditions_or(i32 %a, i32 %b) {
967 ; CHECK-LABEL: @f17_conditions_or(
968 ; CHECK-NEXT:  entry:
969 ; CHECK-NEXT:    [[GT:%.*]] = icmp uge i32 [[A:%.*]], 100
970 ; CHECK-NEXT:    [[LT:%.*]] = icmp ule i32 [[A]], 20
971 ; CHECK-NEXT:    [[BC:%.*]] = or i1 [[LT]], [[GT]]
972 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
973 ; CHECK:       false:
974 ; CHECK-NEXT:    call void @use(i1 false)
975 ; CHECK-NEXT:    call void @use(i1 false)
976 ; CHECK-NEXT:    call void @use(i1 false)
977 ; CHECK-NEXT:    call void @use(i1 true)
978 ; CHECK-NEXT:    call void @use(i1 true)
979 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 21
980 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
981 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 21
982 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
983 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
984 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
985 ; CHECK-NEXT:    ret void
986 ; CHECK:       true:
987 ; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[A]], 50
988 ; CHECK-NEXT:    call void @use(i1 [[F_4]])
989 ; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[A]], 50
990 ; CHECK-NEXT:    call void @use(i1 [[T_3]])
991 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[A]], 10
992 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
993 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100
994 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
995 ; CHECK-NEXT:    ret void
997 entry:
998   %gt = icmp uge i32 %a, 100
999   %lt = icmp ule i32 %a, 20
1000   %bc = or i1 %lt, %gt
1001   br i1 %bc, label %true, label %false
1003 false: ; %a in [21, 100)
1004   ; Conditions below are false.
1005   %f.1 = icmp eq i32 %a, 0
1006   call void @use(i1 %f.1)
1007   %f.2 = icmp eq i32 %a, 20
1008   call void @use(i1 %f.2)
1009   %f.3 = icmp ugt i32 %a, 100
1010   call void @use(i1 %f.3)
1012   ; Conditions below are true.
1013   %t.1 = icmp ult i32 %a, 100
1014   call void @use(i1 %t.1)
1015   %t.2 = icmp ne i32 %a, 20
1016   call void @use(i1 %t.2)
1018   ; Conditions below cannot be simplified.
1019   %c.1 = icmp eq i32 %a, 21
1020   call void @use(i1 %c.1)
1021   %c.2 = icmp ugt i32 %a, 21
1022   call void @use(i1 %c.2)
1023   %c.3 = icmp ugt i32 %a, 50
1024   call void @use(i1 %c.3)
1025   ret void
1027 true:
1028 ; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.
1029 ;       %a should be in in [100, 21)
1030   ; Conditions below are false;
1031   %f.4 = icmp eq i32 %a, 50
1032   call void @use(i1 %f.4)
1034   ; Conditions below are true;
1035   %t.3 = icmp ne i32 %a, 50
1036   call void @use(i1 %t.3)
1038   ; Conditions below cannot be simplified.
1039   %c.4 = icmp eq i32 %a, 10
1040   call void @use(i1 %c.4)
1041   %c.5 = icmp eq i32 %b, 100
1042   call void @use(i1 %c.5)
1043   ret void
1046 define void @f17_conditions_or_logical(i32 %a, i32 %b) {
1047 ; CHECK-LABEL: @f17_conditions_or_logical(
1048 ; CHECK-NEXT:  entry:
1049 ; CHECK-NEXT:    [[GT:%.*]] = icmp uge i32 [[A:%.*]], 100
1050 ; CHECK-NEXT:    [[LT:%.*]] = icmp ule i32 [[A]], 20
1051 ; CHECK-NEXT:    [[BC:%.*]] = select i1 [[LT]], i1 true, i1 [[GT]]
1052 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1053 ; CHECK:       false:
1054 ; CHECK-NEXT:    call void @use(i1 false)
1055 ; CHECK-NEXT:    call void @use(i1 false)
1056 ; CHECK-NEXT:    call void @use(i1 false)
1057 ; CHECK-NEXT:    call void @use(i1 true)
1058 ; CHECK-NEXT:    call void @use(i1 true)
1059 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 21
1060 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
1061 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 21
1062 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
1063 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
1064 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
1065 ; CHECK-NEXT:    ret void
1066 ; CHECK:       true:
1067 ; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[A]], 50
1068 ; CHECK-NEXT:    call void @use(i1 [[F_4]])
1069 ; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[A]], 50
1070 ; CHECK-NEXT:    call void @use(i1 [[T_3]])
1071 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[A]], 10
1072 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
1073 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100
1074 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
1075 ; CHECK-NEXT:    ret void
1077 entry:
1078   %gt = icmp uge i32 %a, 100
1079   %lt = icmp ule i32 %a, 20
1080   %bc = select i1 %lt, i1 true, i1 %gt
1081   br i1 %bc, label %true, label %false
1083 false: ; %a in [21, 100)
1084   ; Conditions below are false.
1085   %f.1 = icmp eq i32 %a, 0
1086   call void @use(i1 %f.1)
1087   %f.2 = icmp eq i32 %a, 20
1088   call void @use(i1 %f.2)
1089   %f.3 = icmp ugt i32 %a, 100
1090   call void @use(i1 %f.3)
1092   ; Conditions below are true.
1093   %t.1 = icmp ult i32 %a, 100
1094   call void @use(i1 %t.1)
1095   %t.2 = icmp ne i32 %a, 20
1096   call void @use(i1 %t.2)
1098   ; Conditions below cannot be simplified.
1099   %c.1 = icmp eq i32 %a, 21
1100   call void @use(i1 %c.1)
1101   %c.2 = icmp ugt i32 %a, 21
1102   call void @use(i1 %c.2)
1103   %c.3 = icmp ugt i32 %a, 50
1104   call void @use(i1 %c.3)
1105   ret void
1107 true:
1108 ; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.
1109 ;       %a should be in in [100, 21)
1110   ; Conditions below are false;
1111   %f.4 = icmp eq i32 %a, 50
1112   call void @use(i1 %f.4)
1114   ; Conditions below are true;
1115   %t.3 = icmp ne i32 %a, 50
1116   call void @use(i1 %t.3)
1118   ; Conditions below cannot be simplified.
1119   %c.4 = icmp eq i32 %a, 10
1120   call void @use(i1 %c.4)
1121   %c.5 = icmp eq i32 %b, 100
1122   call void @use(i1 %c.5)
1123   ret void
1126 define void @f18_conditions_chained_and(i32 %a, i32 %b) {
1127 ; CHECK-LABEL: @f18_conditions_chained_and(
1128 ; CHECK-NEXT:  entry:
1129 ; CHECK-NEXT:    [[LT:%.*]] = icmp ult i32 [[A:%.*]], 100
1130 ; CHECK-NEXT:    [[GT:%.*]] = icmp ugt i32 [[A]], 20
1131 ; CHECK-NEXT:    [[BC:%.*]] = and i1 [[LT]], [[GT]]
1132 ; CHECK-NEXT:    [[B_LT:%.*]] = icmp ult i32 [[B:%.*]], 50
1133 ; CHECK-NEXT:    [[BC_2:%.*]] = and i1 [[BC]], [[B_LT]]
1134 ; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1135 ; CHECK:       true:
1136 ; CHECK-NEXT:    call void @use(i1 false)
1137 ; CHECK-NEXT:    call void @use(i1 false)
1138 ; CHECK-NEXT:    call void @use(i1 false)
1139 ; CHECK-NEXT:    call void @use(i1 false)
1140 ; CHECK-NEXT:    call void @use(i1 true)
1141 ; CHECK-NEXT:    call void @use(i1 true)
1142 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 21
1143 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
1144 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 21
1145 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
1146 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
1147 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
1148 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 0
1149 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
1150 ; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B]], 20
1151 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
1152 ; CHECK-NEXT:    ret void
1153 ; CHECK:       false:
1154 ; CHECK-NEXT:    [[F_5:%.*]] = icmp eq i32 [[A]], 50
1155 ; CHECK-NEXT:    call void @use(i1 [[F_5]])
1156 ; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[A]], 50
1157 ; CHECK-NEXT:    call void @use(i1 [[T_3]])
1158 ; CHECK-NEXT:    [[C_6:%.*]] = icmp eq i32 [[A]], 10
1159 ; CHECK-NEXT:    call void @use(i1 [[C_6]])
1160 ; CHECK-NEXT:    [[C_7:%.*]] = icmp eq i32 [[B]], 100
1161 ; CHECK-NEXT:    call void @use(i1 [[C_7]])
1162 ; CHECK-NEXT:    ret void
1164 entry:
1165   %lt = icmp ult i32 %a, 100
1166   %gt = icmp ugt i32 %a, 20
1167   %bc = and i1 %lt, %gt
1168   %b.lt = icmp ult i32 %b, 50
1169   %bc.2 = and i1 %bc, %b.lt
1170   br i1 %bc.2, label %true, label %false
1172 true: ; %a in [21, 100)
1173   ; Conditions below are false.
1174   %f.1 = icmp eq i32 %a, 0
1175   call void @use(i1 %f.1)
1176   %f.2 = icmp eq i32 %a, 20
1177   call void @use(i1 %f.2)
1178   %f.3 = icmp ugt i32 %a, 100
1179   call void @use(i1 %f.3)
1180   %f.4 = icmp ugt i32 %b, 100
1181   call void @use(i1 %f.4)
1184   ; Conditions below are true.
1185   %t.1 = icmp ult i32 %a, 100
1186   call void @use(i1 %t.1)
1187   %t.2 = icmp ne i32 %a, 20
1188   call void @use(i1 %t.2)
1190   ; Conditions below cannot be simplified.
1191   %c.1 = icmp eq i32 %a, 21
1192   call void @use(i1 %c.1)
1193   %c.2 = icmp ugt i32 %a, 21
1194   call void @use(i1 %c.2)
1195   %c.3 = icmp ugt i32 %a, 50
1196   call void @use(i1 %c.3)
1197   %c.4 = icmp eq i32 %b, 0
1198   call void @use(i1 %c.4)
1199   %c.5 = icmp eq i32 %b, 20
1200   call void @use(i1 %c.5)
1201   ret void
1203 false:
1204   ; Conditions below are false;
1205   %f.5 = icmp eq i32 %a, 50
1206   call void @use(i1 %f.5)
1208   ; Conditions below are true;
1209   %t.3 = icmp ne i32 %a, 50
1210   call void @use(i1 %t.3)
1212   ; Conditions below cannot be simplified.
1213   %c.6 = icmp eq i32 %a, 10
1214   call void @use(i1 %c.6)
1215   %c.7 = icmp eq i32 %b, 100
1216   call void @use(i1 %c.7)
1217   ret void
1220 define void @f19_conditions_chained_and_nested_and(i32 %a, i32 %b) {
1221 ; CHECK-LABEL: @f19_conditions_chained_and_nested_and(
1222 ; CHECK-NEXT:  entry:
1223 ; CHECK-NEXT:    [[LT_A:%.*]] = icmp ult i32 [[A:%.*]], 100
1224 ; CHECK-NEXT:    [[LT_B:%.*]] = icmp ult i32 [[B:%.*]], 1000
1225 ; CHECK-NEXT:    [[BC:%.*]] = and i1 [[LT_A]], [[LT_B]]
1226 ; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1227 ; CHECK:       true:
1228 ; CHECK-NEXT:    [[GT_A:%.*]] = icmp ugt i32 [[A]], 30
1229 ; CHECK-NEXT:    [[GT_B:%.*]] = icmp ugt i32 [[B]], 300
1230 ; CHECK-NEXT:    [[BC_2:%.*]] = and i1 [[GT_A]], [[GT_B]]
1231 ; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE]]
1232 ; CHECK:       true.2:
1233 ; CHECK-NEXT:    call void @use(i1 false)
1234 ; CHECK-NEXT:    call void @use(i1 false)
1235 ; CHECK-NEXT:    call void @use(i1 false)
1236 ; CHECK-NEXT:    call void @use(i1 false)
1237 ; CHECK-NEXT:    call void @use(i1 false)
1238 ; CHECK-NEXT:    call void @use(i1 false)
1239 ; CHECK-NEXT:    call void @use(i1 true)
1240 ; CHECK-NEXT:    call void @use(i1 true)
1241 ; CHECK-NEXT:    call void @use(i1 true)
1242 ; CHECK-NEXT:    call void @use(i1 true)
1243 ; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[A]], 31
1244 ; CHECK-NEXT:    call void @use(i1 [[C_1]])
1245 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[A]], 31
1246 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
1247 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[A]], 50
1248 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
1249 ; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 301
1250 ; CHECK-NEXT:    call void @use(i1 [[C_4]])
1251 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[B]], 301
1252 ; CHECK-NEXT:    call void @use(i1 [[C_5]])
1253 ; CHECK-NEXT:    [[C_6:%.*]] = icmp ugt i32 [[B]], 500
1254 ; CHECK-NEXT:    call void @use(i1 [[C_6]])
1255 ; CHECK-NEXT:    ret void
1256 ; CHECK:       false:
1257 ; CHECK-NEXT:    ret void
1259 entry:
1260   %lt.a = icmp ult i32 %a, 100
1261   %lt.b = icmp ult i32 %b, 1000
1262   %bc = and i1 %lt.a, %lt.b
1263   br i1 %bc, label %true, label %false
1265 true:
1266   %gt.a = icmp ugt i32 %a, 30
1267   %gt.b = icmp ugt i32 %b, 300
1268   %bc.2 = and i1 %gt.a, %gt.b
1269   br i1 %bc.2, label %true.2, label %false
1271 true.2:
1272   ; Conditions below are false.
1273   %f.1 = icmp eq i32 %a, 0
1274   call void @use(i1 %f.1)
1275   %f.2 = icmp eq i32 %a, 20
1276   call void @use(i1 %f.2)
1277   %f.3 = icmp ugt i32 %a, 100
1278   call void @use(i1 %f.3)
1279   %f.4 = icmp eq i32 %b, 0
1280   call void @use(i1 %f.4)
1281   %f.5 = icmp eq i32 %b, 300
1282   call void @use(i1 %f.5)
1283   %f.6 = icmp ugt i32 %b, 1000
1284   call void @use(i1 %f.6)
1287   ; Conditions below are true.
1288   %t.1 = icmp ult i32 %a, 100
1289   call void @use(i1 %t.1)
1290   %t.2 = icmp ne i32 %a, 20
1291   call void @use(i1 %t.2)
1292   %t.3 = icmp ult i32 %b, 1000
1293   call void @use(i1 %t.3)
1294   %t.4 = icmp ne i32 %b, 300
1295   call void @use(i1 %t.4)
1298   ; Conditions below cannot be simplified.
1299   %c.1 = icmp eq i32 %a, 31
1300   call void @use(i1 %c.1)
1301   %c.2 = icmp ugt i32 %a, 31
1302   call void @use(i1 %c.2)
1303   %c.3 = icmp ugt i32 %a, 50
1304   call void @use(i1 %c.3)
1305   %c.4 = icmp eq i32 %b, 301
1306   call void @use(i1 %c.4)
1307   %c.5 = icmp ugt i32 %b, 301
1308   call void @use(i1 %c.5)
1309   %c.6 = icmp ugt i32 %b, 500
1310   call void @use(i1 %c.6)
1312   ret void
1314 false:
1315   ret void
1318 declare i64 @get_i64()
1320 declare i1 @cond()
1322 define void @f20_ne_0_nuked_by_and(i32 %arg) local_unnamed_addr #0 {
1323 ; CHECK-LABEL: @f20_ne_0_nuked_by_and(
1324 ; CHECK-NEXT:  bb11:
1325 ; CHECK-NEXT:    br label [[BB122:%.*]]
1326 ; CHECK:       bb122:
1327 ; CHECK-NEXT:    [[TMP123:%.*]] = phi i32 [ 256, [[BB11:%.*]] ], [ [[TMP136:%.*]], [[BB135:%.*]] ]
1328 ; CHECK-NEXT:    [[TMP127:%.*]] = call i64 @get_i64()
1329 ; CHECK-NEXT:    [[TMP128:%.*]] = trunc i64 [[TMP127]] to i32
1330 ; CHECK-NEXT:    [[TMP131:%.*]] = icmp ne i32 [[TMP128]], 0
1331 ; CHECK-NEXT:    [[TMP132:%.*]] = icmp sgt i32 [[TMP123]], [[TMP128]]
1332 ; CHECK-NEXT:    [[TMP133:%.*]] = and i1 [[TMP131]], [[TMP132]]
1333 ; CHECK-NEXT:    br i1 [[TMP133]], label [[BB134:%.*]], label [[BB135]]
1334 ; CHECK:       bb134:
1335 ; CHECK-NEXT:    br label [[BB135]]
1336 ; CHECK:       bb135:
1337 ; CHECK-NEXT:    [[TMP136]] = phi i32 [ [[TMP123]], [[BB122]] ], [ [[TMP128]], [[BB134]] ]
1338 ; CHECK-NEXT:    [[BC:%.*]] = call i1 @cond()
1339 ; CHECK-NEXT:    br i1 [[BC]], label [[BB139:%.*]], label [[BB122]]
1340 ; CHECK:       bb139:
1341 ; CHECK-NEXT:    call void @use(i1 false)
1342 ; CHECK-NEXT:    ret void
1344 bb11:                                             ; preds = %bb1
1345   br label %bb122
1347 bb122:                                            ; preds = %bb135, %bb120
1348   %tmp123 = phi i32 [ 256, %bb11 ], [ %tmp136, %bb135 ]
1349   %tmp127 = call i64 @get_i64()
1350   %tmp128 = trunc i64 %tmp127 to i32
1351   %tmp131 = icmp ne i32 %tmp128, 0
1352   %tmp132 = icmp sgt i32 %tmp123, %tmp128
1353   %tmp133 = and i1 %tmp131, %tmp132
1354   br i1 %tmp133, label %bb134, label %bb135
1356 bb134:                                            ; preds = %bb122
1357   br label %bb135
1359 bb135:                                            ; preds = %bb134, %bb122
1360   %tmp136 = phi i32 [ %tmp123, %bb122 ], [ %tmp128, %bb134 ]
1361   %bc = call i1 @cond()
1362   br i1 %bc, label %bb139, label %bb122
1364 bb139:                                            ; preds = %bb135
1365   %tmp140 = icmp eq i32 %tmp136, 0
1366   call void @use(i1 %tmp140)
1367   ret void
1369 bb142:                                            ; preds = %bb139
1370   ret void