[clang][Driver] Support simplified triple versions for config files (#111387)
[llvm-project.git] / llvm / test / Transforms / InstCombine / compare-3way.ll
blob5d443cd45238c7e13edf53e92de7ce359d44a052
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -S -passes=instcombine < %s | FileCheck %s
4 declare void @use(i32)
6 ; These 18 exercise all combinations of signed comparison
7 ; for each of the three values produced by your typical
8 ; 3way compare function (-1, 0, 1)
10 define void @test_low_sgt(i64 %a, i64 %b) {
11 ; CHECK-LABEL: define void @test_low_sgt
12 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
13 ; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i64 [[A]], [[B]]
14 ; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
15 ; CHECK:       normal:
16 ; CHECK-NEXT:    ret void
17 ; CHECK:       unreached:
18 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
19 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
20 ; CHECK-NEXT:    ret void
22   %eq = icmp eq i64 %a, %b
23   %slt = icmp slt i64 %a, %b
24   %. = select i1 %slt, i32 -1, i32 1
25   %result = select i1 %eq, i32 0, i32 %.
26   %cmp = icmp sgt i32 %result, -1
27   br i1 %cmp, label %unreached, label %normal
28 normal:
29   ret void
30 unreached:
31   call void @use(i32 %result)
32   ret void
35 define void @test_low_slt(i64 %a, i64 %b) {
36 ; CHECK-LABEL: define void @test_low_slt
37 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
38 ; CHECK-NEXT:    br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
39 ; CHECK:       normal:
40 ; CHECK-NEXT:    ret void
41 ; CHECK:       unreached:
42 ; CHECK-NEXT:    ret void
44   %eq = icmp eq i64 %a, %b
45   %slt = icmp slt i64 %a, %b
46   %. = select i1 %slt, i32 -1, i32 1
47   %result = select i1 %eq, i32 0, i32 %.
48   %cmp = icmp slt i32 %result, -1
49   br i1 %cmp, label %unreached, label %normal
50 normal:
51   ret void
52 unreached:
53   call void @use(i32 %result)
54   ret void
57 define void @test_low_sge(i64 %a, i64 %b) {
58 ; CHECK-LABEL: define void @test_low_sge
59 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
60 ; CHECK-NEXT:    br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
61 ; CHECK:       normal:
62 ; CHECK-NEXT:    ret void
63 ; CHECK:       unreached:
64 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
65 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
66 ; CHECK-NEXT:    ret void
68   %eq = icmp eq i64 %a, %b
69   %slt = icmp slt i64 %a, %b
70   %. = select i1 %slt, i32 -1, i32 1
71   %result = select i1 %eq, i32 0, i32 %.
72   %cmp = icmp sge i32 %result, -1
73   br i1 %cmp, label %unreached, label %normal
74 normal:
75   ret void
76 unreached:
77   call void @use(i32 %result)
78   ret void
81 define void @test_low_sle(i64 %a, i64 %b) {
82 ; CHECK-LABEL: define void @test_low_sle
83 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
84 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]]
85 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
86 ; CHECK:       normal:
87 ; CHECK-NEXT:    ret void
88 ; CHECK:       unreached:
89 ; CHECK-NEXT:    call void @use(i32 -1)
90 ; CHECK-NEXT:    ret void
92   %eq = icmp eq i64 %a, %b
93   %slt = icmp slt i64 %a, %b
94   %. = select i1 %slt, i32 -1, i32 1
95   %result = select i1 %eq, i32 0, i32 %.
96   %cmp = icmp sle i32 %result, -1
97   br i1 %cmp, label %unreached, label %normal
98 normal:
99   ret void
100 unreached:
101   call void @use(i32 %result)
102   ret void
105 define void @test_low_ne(i64 %a, i64 %b) {
106 ; CHECK-LABEL: define void @test_low_ne
107 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
108 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]]
109 ; CHECK-NEXT:    br i1 [[TMP1]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
110 ; CHECK:       normal:
111 ; CHECK-NEXT:    ret void
112 ; CHECK:       unreached:
113 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
114 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
115 ; CHECK-NEXT:    ret void
117   %eq = icmp eq i64 %a, %b
118   %slt = icmp slt i64 %a, %b
119   %. = select i1 %slt, i32 -1, i32 1
120   %result = select i1 %eq, i32 0, i32 %.
121   %cmp = icmp ne i32 %result, -1
122   br i1 %cmp, label %unreached, label %normal
123 normal:
124   ret void
125 unreached:
126   call void @use(i32 %result)
127   ret void
130 define void @test_low_eq(i64 %a, i64 %b) {
131 ; CHECK-LABEL: define void @test_low_eq
132 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
133 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]]
134 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
135 ; CHECK:       normal:
136 ; CHECK-NEXT:    ret void
137 ; CHECK:       unreached:
138 ; CHECK-NEXT:    call void @use(i32 -1)
139 ; CHECK-NEXT:    ret void
141   %eq = icmp eq i64 %a, %b
142   %slt = icmp slt i64 %a, %b
143   %. = select i1 %slt, i32 -1, i32 1
144   %result = select i1 %eq, i32 0, i32 %.
145   %cmp = icmp eq i32 %result, -1
146   br i1 %cmp, label %unreached, label %normal
147 normal:
148   ret void
149 unreached:
150   call void @use(i32 %result)
151   ret void
154 define void @test_mid_sgt(i64 %a, i64 %b) {
155 ; CHECK-LABEL: define void @test_mid_sgt
156 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
157 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]]
158 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
159 ; CHECK:       normal:
160 ; CHECK-NEXT:    ret void
161 ; CHECK:       unreached:
162 ; CHECK-NEXT:    call void @use(i32 1)
163 ; CHECK-NEXT:    ret void
165   %eq = icmp eq i64 %a, %b
166   %slt = icmp slt i64 %a, %b
167   %. = select i1 %slt, i32 -1, i32 1
168   %result = select i1 %eq, i32 0, i32 %.
169   %cmp = icmp sgt i32 %result, 0
170   br i1 %cmp, label %unreached, label %normal
171 normal:
172   ret void
173 unreached:
174   call void @use(i32 %result)
175   ret void
178 define void @test_mid_slt(i64 %a, i64 %b) {
179 ; CHECK-LABEL: define void @test_mid_slt
180 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
181 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]]
182 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
183 ; CHECK:       normal:
184 ; CHECK-NEXT:    ret void
185 ; CHECK:       unreached:
186 ; CHECK-NEXT:    call void @use(i32 -1)
187 ; CHECK-NEXT:    ret void
189   %eq = icmp eq i64 %a, %b
190   %slt = icmp slt i64 %a, %b
191   %. = select i1 %slt, i32 -1, i32 1
192   %result = select i1 %eq, i32 0, i32 %.
193   %cmp = icmp slt i32 %result, 0
194   br i1 %cmp, label %unreached, label %normal
195 normal:
196   ret void
197 unreached:
198   call void @use(i32 %result)
199   ret void
202 define void @test_mid_sge(i64 %a, i64 %b) {
203 ; CHECK-LABEL: define void @test_mid_sge
204 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
205 ; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i64 [[A]], [[B]]
206 ; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
207 ; CHECK:       normal:
208 ; CHECK-NEXT:    ret void
209 ; CHECK:       unreached:
210 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
211 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
212 ; CHECK-NEXT:    ret void
214   %eq = icmp eq i64 %a, %b
215   %slt = icmp slt i64 %a, %b
216   %. = select i1 %slt, i32 -1, i32 1
217   %result = select i1 %eq, i32 0, i32 %.
218   %cmp = icmp sge i32 %result, 0
219   br i1 %cmp, label %unreached, label %normal
220 normal:
221   ret void
222 unreached:
223   call void @use(i32 %result)
224   ret void
227 define void @test_mid_sle(i64 %a, i64 %b) {
228 ; CHECK-LABEL: define void @test_mid_sle
229 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
230 ; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i64 [[A]], [[B]]
231 ; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
232 ; CHECK:       normal:
233 ; CHECK-NEXT:    ret void
234 ; CHECK:       unreached:
235 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
236 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
237 ; CHECK-NEXT:    ret void
239   %eq = icmp eq i64 %a, %b
240   %slt = icmp slt i64 %a, %b
241   %. = select i1 %slt, i32 -1, i32 1
242   %result = select i1 %eq, i32 0, i32 %.
243   %cmp = icmp sle i32 %result, 0
244   br i1 %cmp, label %unreached, label %normal
245 normal:
246   ret void
247 unreached:
248   call void @use(i32 %result)
249   ret void
252 define void @test_mid_ne(i64 %a, i64 %b) {
253 ; CHECK-LABEL: define void @test_mid_ne
254 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
255 ; CHECK-NEXT:    [[EQ:%.*]] = icmp eq i64 [[A]], [[B]]
256 ; CHECK-NEXT:    br i1 [[EQ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
257 ; CHECK:       normal:
258 ; CHECK-NEXT:    ret void
259 ; CHECK:       unreached:
260 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
261 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
262 ; CHECK-NEXT:    ret void
264   %eq = icmp eq i64 %a, %b
265   %slt = icmp slt i64 %a, %b
266   %. = select i1 %slt, i32 -1, i32 1
267   %result = select i1 %eq, i32 0, i32 %.
268   %cmp = icmp ne i32 %result, 0
269   br i1 %cmp, label %unreached, label %normal
270 normal:
271   ret void
272 unreached:
273   call void @use(i32 %result)
274   ret void
277 define void @test_mid_eq(i64 %a, i64 %b) {
278 ; CHECK-LABEL: define void @test_mid_eq
279 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
280 ; CHECK-NEXT:    [[EQ:%.*]] = icmp eq i64 [[A]], [[B]]
281 ; CHECK-NEXT:    br i1 [[EQ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
282 ; CHECK:       normal:
283 ; CHECK-NEXT:    ret void
284 ; CHECK:       unreached:
285 ; CHECK-NEXT:    call void @use(i32 0)
286 ; CHECK-NEXT:    ret void
288   %eq = icmp eq i64 %a, %b
289   %slt = icmp slt i64 %a, %b
290   %. = select i1 %slt, i32 -1, i32 1
291   %result = select i1 %eq, i32 0, i32 %.
292   %cmp = icmp eq i32 %result, 0
293   br i1 %cmp, label %unreached, label %normal
294 normal:
295   ret void
296 unreached:
297   call void @use(i32 %result)
298   ret void
301 define void @test_high_sgt(i64 %a, i64 %b) {
302 ; CHECK-LABEL: define void @test_high_sgt
303 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
304 ; CHECK-NEXT:    br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
305 ; CHECK:       normal:
306 ; CHECK-NEXT:    ret void
307 ; CHECK:       unreached:
308 ; CHECK-NEXT:    ret void
310   %eq = icmp eq i64 %a, %b
311   %slt = icmp slt i64 %a, %b
312   %. = select i1 %slt, i32 -1, i32 1
313   %result = select i1 %eq, i32 0, i32 %.
314   %cmp = icmp sgt i32 %result, 1
315   br i1 %cmp, label %unreached, label %normal
316 normal:
317   ret void
318 unreached:
319   call void @use(i32 %result)
320   ret void
323 define void @test_high_slt(i64 %a, i64 %b) {
324 ; CHECK-LABEL: define void @test_high_slt
325 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
326 ; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i64 [[A]], [[B]]
327 ; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
328 ; CHECK:       normal:
329 ; CHECK-NEXT:    ret void
330 ; CHECK:       unreached:
331 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
332 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
333 ; CHECK-NEXT:    ret void
335   %eq = icmp eq i64 %a, %b
336   %slt = icmp slt i64 %a, %b
337   %. = select i1 %slt, i32 -1, i32 1
338   %result = select i1 %eq, i32 0, i32 %.
339   %cmp = icmp slt i32 %result, 1
340   br i1 %cmp, label %unreached, label %normal
341 normal:
342   ret void
343 unreached:
344   call void @use(i32 %result)
345   ret void
348 define void @test_high_sge(i64 %a, i64 %b) {
349 ; CHECK-LABEL: define void @test_high_sge
350 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
351 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]]
352 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
353 ; CHECK:       normal:
354 ; CHECK-NEXT:    ret void
355 ; CHECK:       unreached:
356 ; CHECK-NEXT:    call void @use(i32 1)
357 ; CHECK-NEXT:    ret void
359   %eq = icmp eq i64 %a, %b
360   %slt = icmp slt i64 %a, %b
361   %. = select i1 %slt, i32 -1, i32 1
362   %result = select i1 %eq, i32 0, i32 %.
363   %cmp = icmp sge i32 %result, 1
364   br i1 %cmp, label %unreached, label %normal
365 normal:
366   ret void
367 unreached:
368   call void @use(i32 %result)
369   ret void
372 define void @test_high_sle(i64 %a, i64 %b) {
373 ; CHECK-LABEL: define void @test_high_sle
374 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
375 ; CHECK-NEXT:    br i1 true, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
376 ; CHECK:       normal:
377 ; CHECK-NEXT:    ret void
378 ; CHECK:       unreached:
379 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
380 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
381 ; CHECK-NEXT:    ret void
383   %eq = icmp eq i64 %a, %b
384   %slt = icmp slt i64 %a, %b
385   %. = select i1 %slt, i32 -1, i32 1
386   %result = select i1 %eq, i32 0, i32 %.
387   %cmp = icmp sle i32 %result, 1
388   br i1 %cmp, label %unreached, label %normal
389 normal:
390   ret void
391 unreached:
392   call void @use(i32 %result)
393   ret void
396 define void @test_high_ne(i64 %a, i64 %b) {
397 ; CHECK-LABEL: define void @test_high_ne
398 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
399 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]]
400 ; CHECK-NEXT:    br i1 [[TMP1]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
401 ; CHECK:       normal:
402 ; CHECK-NEXT:    ret void
403 ; CHECK:       unreached:
404 ; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @llvm.scmp.i32.i64(i64 [[A]], i64 [[B]])
405 ; CHECK-NEXT:    call void @use(i32 [[RESULT]])
406 ; CHECK-NEXT:    ret void
408   %eq = icmp eq i64 %a, %b
409   %slt = icmp slt i64 %a, %b
410   %. = select i1 %slt, i32 -1, i32 1
411   %result = select i1 %eq, i32 0, i32 %.
412   %cmp = icmp ne i32 %result, 1
413   br i1 %cmp, label %unreached, label %normal
414 normal:
415   ret void
416 unreached:
417   call void @use(i32 %result)
418   ret void
421 define void @test_high_eq(i64 %a, i64 %b) {
422 ; CHECK-LABEL: define void @test_high_eq
423 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
424 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]]
425 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
426 ; CHECK:       normal:
427 ; CHECK-NEXT:    ret void
428 ; CHECK:       unreached:
429 ; CHECK-NEXT:    call void @use(i32 1)
430 ; CHECK-NEXT:    ret void
432   %eq = icmp eq i64 %a, %b
433   %slt = icmp slt i64 %a, %b
434   %. = select i1 %slt, i32 -1, i32 1
435   %result = select i1 %eq, i32 0, i32 %.
436   %cmp = icmp eq i32 %result, 1
437   br i1 %cmp, label %unreached, label %normal
438 normal:
439   ret void
440 unreached:
441   call void @use(i32 %result)
442   ret void
445 ; These five make sure we didn't accidentally hard code one of the
446 ; produced values
448 define void @non_standard_low(i64 %a, i64 %b) {
449 ; CHECK-LABEL: define void @non_standard_low
450 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
451 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i64 [[A]], [[B]]
452 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
453 ; CHECK:       normal:
454 ; CHECK-NEXT:    ret void
455 ; CHECK:       unreached:
456 ; CHECK-NEXT:    call void @use(i32 -3)
457 ; CHECK-NEXT:    ret void
459   %eq = icmp eq i64 %a, %b
460   %slt = icmp slt i64 %a, %b
461   %. = select i1 %slt, i32 -3, i32 -1
462   %result = select i1 %eq, i32 -2, i32 %.
463   %cmp = icmp eq i32 %result, -3
464   br i1 %cmp, label %unreached, label %normal
465 normal:
466   ret void
467 unreached:
468   call void @use(i32 %result)
469   ret void
472 define void @non_standard_mid(i64 %a, i64 %b) {
473 ; CHECK-LABEL: define void @non_standard_mid
474 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
475 ; CHECK-NEXT:    [[EQ:%.*]] = icmp eq i64 [[A]], [[B]]
476 ; CHECK-NEXT:    br i1 [[EQ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
477 ; CHECK:       normal:
478 ; CHECK-NEXT:    ret void
479 ; CHECK:       unreached:
480 ; CHECK-NEXT:    call void @use(i32 -2)
481 ; CHECK-NEXT:    ret void
483   %eq = icmp eq i64 %a, %b
484   %slt = icmp slt i64 %a, %b
485   %. = select i1 %slt, i32 -3, i32 -1
486   %result = select i1 %eq, i32 -2, i32 %.
487   %cmp = icmp eq i32 %result, -2
488   br i1 %cmp, label %unreached, label %normal
489 normal:
490   ret void
491 unreached:
492   call void @use(i32 %result)
493   ret void
496 define void @non_standard_high(i64 %a, i64 %b) {
497 ; CHECK-LABEL: define void @non_standard_high
498 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
499 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i64 [[A]], [[B]]
500 ; CHECK-NEXT:    br i1 [[TMP1]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
501 ; CHECK:       normal:
502 ; CHECK-NEXT:    ret void
503 ; CHECK:       unreached:
504 ; CHECK-NEXT:    call void @use(i32 -1)
505 ; CHECK-NEXT:    ret void
507   %eq = icmp eq i64 %a, %b
508   %slt = icmp slt i64 %a, %b
509   %. = select i1 %slt, i32 -3, i32 -1
510   %result = select i1 %eq, i32 -2, i32 %.
511   %cmp = icmp eq i32 %result, -1
512   br i1 %cmp, label %unreached, label %normal
513 normal:
514   ret void
515 unreached:
516   call void @use(i32 %result)
517   ret void
520 define void @non_standard_bound1(i64 %a, i64 %b) {
521 ; CHECK-LABEL: define void @non_standard_bound1
522 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
523 ; CHECK-NEXT:    br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
524 ; CHECK:       normal:
525 ; CHECK-NEXT:    ret void
526 ; CHECK:       unreached:
527 ; CHECK-NEXT:    ret void
529   %eq = icmp eq i64 %a, %b
530   %slt = icmp slt i64 %a, %b
531   %. = select i1 %slt, i32 -3, i32 -1
532   %result = select i1 %eq, i32 -2, i32 %.
533   %cmp = icmp eq i32 %result, -20
534   br i1 %cmp, label %unreached, label %normal
535 normal:
536   ret void
537 unreached:
538   call void @use(i32 %result)
539   ret void
542 define void @non_standard_bound2(i64 %a, i64 %b) {
543 ; CHECK-LABEL: define void @non_standard_bound2
544 ; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
545 ; CHECK-NEXT:    br i1 false, label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
546 ; CHECK:       normal:
547 ; CHECK-NEXT:    ret void
548 ; CHECK:       unreached:
549 ; CHECK-NEXT:    ret void
551   %eq = icmp eq i64 %a, %b
552   %slt = icmp slt i64 %a, %b
553   %. = select i1 %slt, i32 -3, i32 -1
554   %result = select i1 %eq, i32 -2, i32 %.
555   %cmp = icmp eq i32 %result, 0
556   br i1 %cmp, label %unreached, label %normal
557 normal:
558   ret void
559 unreached:
560   call void @use(i32 %result)
561   ret void