xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll (revision 3c127e83c07c3791e86413c22a414a030d4302e3)
12322080bSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
32322080bSFlorian Hahn
42322080bSFlorian Hahndefine void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) {
52322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.ult(
62322080bSFlorian Hahn; CHECK-NEXT:  entry:
72322080bSFlorian Hahn; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
82322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
92322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
102322080bSFlorian Hahn; CHECK:       if.then:
112322080bSFlorian Hahn; CHECK-NEXT:    ret void
122322080bSFlorian Hahn; CHECK:       if.end:
132322080bSFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
142322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
152322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
162322080bSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
172322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
182322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
192322080bSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
202322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
212322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
222fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
232322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
242fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
252322080bSFlorian Hahn; CHECK-NEXT:    ret void
262322080bSFlorian Hahn;
272322080bSFlorian Hahnentry:
282322080bSFlorian Hahn  %sub.ptr.i = sub nuw i8 %start, 3
292322080bSFlorian Hahn  %c.1 = icmp uge i8 %sub.ptr.i, %high
302322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
312322080bSFlorian Hahn
322322080bSFlorian Hahnif.then:                                          ; preds = %entry
332322080bSFlorian Hahn  ret void
342322080bSFlorian Hahn
352322080bSFlorian Hahnif.end:                                           ; preds = %entry
362322080bSFlorian Hahn  %t.0 = icmp ult i8 %start, %high
372322080bSFlorian Hahn  call void @use(i1 %t.0)
382322080bSFlorian Hahn  %start.1 = sub nuw i8 %start, 1
392322080bSFlorian Hahn  %t.1 = icmp ult i8 %start.1, %high
402322080bSFlorian Hahn  call void @use(i1 %t.1)
412322080bSFlorian Hahn  %start.2 = sub nuw i8 %start, 2
422322080bSFlorian Hahn  %t.2 = icmp ult i8 %start.2, %high
432322080bSFlorian Hahn  call void @use(i1 %t.2)
442322080bSFlorian Hahn  %start.3 = sub nuw i8 %start, 3
452322080bSFlorian Hahn  %t.3 = icmp ult i8 %start.3, %high
462322080bSFlorian Hahn  call void @use(i1 %t.3)
472322080bSFlorian Hahn  %start.4 = sub nuw i8 %start, 4
482322080bSFlorian Hahn  %c.4 = icmp ult i8 %start.4, %high
492322080bSFlorian Hahn  call void @use(i1 %c.4)
502322080bSFlorian Hahn  ret void
512322080bSFlorian Hahn}
522322080bSFlorian Hahn
532322080bSFlorian Hahndefine void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) {
542322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.ule(
552322080bSFlorian Hahn; CHECK-NEXT:  entry:
562322080bSFlorian Hahn; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
572322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
582322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
592322080bSFlorian Hahn; CHECK:       if.then:
602322080bSFlorian Hahn; CHECK-NEXT:    ret void
612322080bSFlorian Hahn; CHECK:       if.end:
622322080bSFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
632322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
642322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
652322080bSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]]
662322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
672322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
682fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
692322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
702fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
712322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
722fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
732322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
742fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
752322080bSFlorian Hahn; CHECK-NEXT:    ret void
762322080bSFlorian Hahn;
772322080bSFlorian Hahnentry:
782322080bSFlorian Hahn  %sub.ptr.i = sub nuw i8 %start, 3
792322080bSFlorian Hahn  %c.1 = icmp uge i8 %sub.ptr.i, %high
802322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
812322080bSFlorian Hahn
822322080bSFlorian Hahnif.then:                                          ; preds = %entry
832322080bSFlorian Hahn  ret void
842322080bSFlorian Hahn
852322080bSFlorian Hahnif.end:                                           ; preds = %entry
862322080bSFlorian Hahn  %t.0 = icmp ule i8 %start, %high
872322080bSFlorian Hahn  call void @use(i1 %t.0)
882322080bSFlorian Hahn  %start.1 = sub nuw i8 %start, 1
892322080bSFlorian Hahn  %t.1 = icmp ule i8 %start.1, %high
902322080bSFlorian Hahn  call void @use(i1 %t.1)
912322080bSFlorian Hahn  %start.2 = sub nuw i8 %start, 2
922322080bSFlorian Hahn  %t.2 = icmp ule i8 %start.2, %high
932322080bSFlorian Hahn  call void @use(i1 %t.2)
942322080bSFlorian Hahn  %start.3 = sub nuw i8 %start, 3
952322080bSFlorian Hahn  %t.3 = icmp ule i8 %start.3, %high
962322080bSFlorian Hahn  call void @use(i1 %t.3)
972322080bSFlorian Hahn  %start.4 = sub nuw i8 %start, 4
982322080bSFlorian Hahn  %t.4 = icmp ule i8 %start.4, %high
992322080bSFlorian Hahn  call void @use(i1 %t.4)
1002322080bSFlorian Hahn
1012322080bSFlorian Hahn  %start.5 = sub nuw i8 %start, 5
1022322080bSFlorian Hahn  %c.5 = icmp ule i8 %start.5, %high
1032322080bSFlorian Hahn  call void @use(i1 %c.5)
1042322080bSFlorian Hahn
1052322080bSFlorian Hahn  ret void
1062322080bSFlorian Hahn}
1072322080bSFlorian Hahn
1082322080bSFlorian Hahndefine void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) {
1092322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.ugt(
1102322080bSFlorian Hahn; CHECK-NEXT:  entry:
1112322080bSFlorian Hahn; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
1122322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
1132322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1142322080bSFlorian Hahn; CHECK:       if.then:
1152322080bSFlorian Hahn; CHECK-NEXT:    ret void
1162322080bSFlorian Hahn; CHECK:       if.end:
1172322080bSFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
1182322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_0]])
1192322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
1202322080bSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]]
1212322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
1222322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
1232fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1242322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
1252fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1262322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
1272fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1282322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
1292fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1302322080bSFlorian Hahn; CHECK-NEXT:    ret void
1312322080bSFlorian Hahn;
1322322080bSFlorian Hahnentry:
1332322080bSFlorian Hahn  %sub.ptr.i = sub nuw i8 %start, 3
1342322080bSFlorian Hahn  %c.1 = icmp uge i8 %sub.ptr.i, %high
1352322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
1362322080bSFlorian Hahn
1372322080bSFlorian Hahnif.then:                                          ; preds = %entry
1382322080bSFlorian Hahn  ret void
1392322080bSFlorian Hahn
1402322080bSFlorian Hahnif.end:                                           ; preds = %entry
1412322080bSFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
1422322080bSFlorian Hahn  call void @use(i1 %f.0)
1432322080bSFlorian Hahn
1442322080bSFlorian Hahn  %start.1 = sub nuw i8 %start, 1
1452322080bSFlorian Hahn  %f.1 = icmp ugt i8 %start.1, %high
1462322080bSFlorian Hahn  call void @use(i1 %f.1)
1472322080bSFlorian Hahn
1482322080bSFlorian Hahn  %start.2 = sub nuw i8 %start, 2
1492322080bSFlorian Hahn  %f.2 = icmp ugt i8 %start.2, %high
1502322080bSFlorian Hahn  call void @use(i1 %f.2)
1512322080bSFlorian Hahn
1522322080bSFlorian Hahn  %start.3 = sub nuw i8 %start, 3
1532322080bSFlorian Hahn  %f.3 = icmp ugt i8 %start.3, %high
1542322080bSFlorian Hahn  call void @use(i1 %f.3)
1552322080bSFlorian Hahn
1562322080bSFlorian Hahn  %start.4 = sub nuw i8 %start, 4
1572322080bSFlorian Hahn  %f.4 = icmp ugt i8 %start.4, %high
1582322080bSFlorian Hahn  call void @use(i1 %f.4)
1592322080bSFlorian Hahn
1602322080bSFlorian Hahn  %start.5 = sub nuw i8 %start, 5
1612322080bSFlorian Hahn  %c.5 = icmp ugt i8 %start.5, %high
1622322080bSFlorian Hahn  call void @use(i1 %c.5)
1632322080bSFlorian Hahn
1642322080bSFlorian Hahn  ret void
1652322080bSFlorian Hahn}
1662322080bSFlorian Hahn
1672322080bSFlorian Hahndefine void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) {
1682322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.uge(
1692322080bSFlorian Hahn; CHECK-NEXT:  entry:
1702322080bSFlorian Hahn; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
1712322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
1722322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1732322080bSFlorian Hahn; CHECK:       if.then:
1742322080bSFlorian Hahn; CHECK-NEXT:    ret void
1752322080bSFlorian Hahn; CHECK:       if.end:
1762322080bSFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
1772322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_0]])
1782322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
1792322080bSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
1802322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
1812322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
1822322080bSFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
1832322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_2]])
1842322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
1852fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1862322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
1872fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1882322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
1892fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1902322080bSFlorian Hahn; CHECK-NEXT:    ret void
1912322080bSFlorian Hahn;
1922322080bSFlorian Hahnentry:
1932322080bSFlorian Hahn  %sub.ptr.i = sub nuw i8 %start, 3
1942322080bSFlorian Hahn  %c.1 = icmp uge i8 %sub.ptr.i, %high
1952322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
1962322080bSFlorian Hahn
1972322080bSFlorian Hahnif.then:                                          ; preds = %entry
1982322080bSFlorian Hahn  ret void
1992322080bSFlorian Hahn
2002322080bSFlorian Hahnif.end:                                           ; preds = %entry
2012322080bSFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
2022322080bSFlorian Hahn  call void @use(i1 %f.0)
2032322080bSFlorian Hahn
2042322080bSFlorian Hahn  %start.1 = sub nuw i8 %start, 1
2052322080bSFlorian Hahn  %f.1 = icmp uge i8 %start.1, %high
2062322080bSFlorian Hahn  call void @use(i1 %f.1)
2072322080bSFlorian Hahn
2082322080bSFlorian Hahn  %start.2 = sub nuw i8 %start, 2
2092322080bSFlorian Hahn  %f.2 = icmp uge i8 %start.2, %high
2102322080bSFlorian Hahn  call void @use(i1 %f.2)
2112322080bSFlorian Hahn
2122322080bSFlorian Hahn  %start.3 = sub nuw i8 %start, 3
2132322080bSFlorian Hahn  %f.3 = icmp uge i8 %start.3, %high
2142322080bSFlorian Hahn  call void @use(i1 %f.3)
2152322080bSFlorian Hahn
2162322080bSFlorian Hahn  %start.4 = sub nuw i8 %start, 4
2172322080bSFlorian Hahn  %c.4 = icmp uge i8 %start.4, %high
2182322080bSFlorian Hahn  call void @use(i1 %c.4)
2192322080bSFlorian Hahn
2202322080bSFlorian Hahn  %start.5 = sub nuw i8 %start, 5
2212322080bSFlorian Hahn  %c.5 = icmp uge i8 %start.5, %high
2222322080bSFlorian Hahn  call void @use(i1 %c.5)
2232322080bSFlorian Hahn
2242322080bSFlorian Hahn  ret void
2252322080bSFlorian Hahn}
2262322080bSFlorian Hahn
227830df62aSFlorian Hahndefine i16 @test_pr53123_sub_constraint_sign(i16 %v) {
228830df62aSFlorian Hahn; CHECK-LABEL: @test_pr53123_sub_constraint_sign(
229830df62aSFlorian Hahn; CHECK-NEXT:  bb.0:
230830df62aSFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i16 32767, [[V:%.*]]
231830df62aSFlorian Hahn; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i16 [[V]], [[SUB]]
232830df62aSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP1]], label [[BB_2:%.*]], label [[BB_1:%.*]]
233830df62aSFlorian Hahn; CHECK:       bb.1:
234830df62aSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = shl nuw nsw i16 [[V]], 1
235830df62aSFlorian Hahn; CHECK-NEXT:    [[SUB9:%.*]] = sub nuw nsw i16 32767, [[ADD]]
236830df62aSFlorian Hahn; CHECK-NEXT:    [[CMP11:%.*]] = icmp ugt i16 [[ADD]], [[SUB9]]
2378a15caaaSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP11]], label [[BB_3:%.*]], label [[BB_2]]
238830df62aSFlorian Hahn; CHECK:       bb.2:
239830df62aSFlorian Hahn; CHECK-NEXT:    ret i16 1
240830df62aSFlorian Hahn; CHECK:       bb.3:
241830df62aSFlorian Hahn; CHECK-NEXT:    ret i16 0
242830df62aSFlorian Hahn;
243830df62aSFlorian Hahnbb.0:
244830df62aSFlorian Hahn  %sub = sub nuw nsw i16 32767, %v
245830df62aSFlorian Hahn  %cmp1 = icmp ugt i16 %v, %sub
246830df62aSFlorian Hahn  br i1 %cmp1, label %bb.2, label %bb.1
247830df62aSFlorian Hahn
248830df62aSFlorian Hahnbb.1:
249830df62aSFlorian Hahn  %add = shl nuw nsw i16 %v, 1
250830df62aSFlorian Hahn  %sub9 = sub nuw nsw i16 32767, %add
251830df62aSFlorian Hahn  %cmp11 = icmp ugt i16 %add, %sub9
252830df62aSFlorian Hahn  br i1 %cmp11, label %bb.3, label %bb.2
253830df62aSFlorian Hahn
254830df62aSFlorian Hahnbb.2:
255830df62aSFlorian Hahn  ret i16 1
256830df62aSFlorian Hahn
257830df62aSFlorian Hahnbb.3:
258830df62aSFlorian Hahn  ret i16 0
259830df62aSFlorian Hahn}
260830df62aSFlorian Hahn
2612322080bSFlorian Hahndeclare void @use(i1)
262873e630dSFlorian Hahn
263873e630dSFlorian Hahndefine i1 @sub_nuw_i16_simp(i16 %a) {
264873e630dSFlorian Hahn; CHECK-LABEL: @sub_nuw_i16_simp(
265873e630dSFlorian Hahn; CHECK-NEXT:  entry:
266873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], 305
267873e630dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
268873e630dSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
269873e630dSFlorian Hahn; CHECK:       exit.1:
270873e630dSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i16 [[A]], 0
271873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_2]]
272873e630dSFlorian Hahn; CHECK:       exit.2:
273873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 true
274873e630dSFlorian Hahn;
275873e630dSFlorian Hahnentry:
276873e630dSFlorian Hahn  %neg2 = sub nuw i16 %a, 305
277873e630dSFlorian Hahn  %c.1 = icmp ugt i16 0, %neg2
278873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
279873e630dSFlorian Hahn
280873e630dSFlorian Hahnexit.1:
281873e630dSFlorian Hahn  %c.2 = icmp ugt i16 %a, 0
282873e630dSFlorian Hahn  ret i1 %c.2
283873e630dSFlorian Hahn
284873e630dSFlorian Hahnexit.2:
285873e630dSFlorian Hahn  %c.3 = icmp ugt i16 %a, 0
286873e630dSFlorian Hahn  ret i1 %c.3
287873e630dSFlorian Hahn}
288873e630dSFlorian Hahn
289873e630dSFlorian Hahndefine i1 @sub_nuw_i64_simp(i64 %a) {
290873e630dSFlorian Hahn; CHECK-LABEL: @sub_nuw_i64_simp(
291873e630dSFlorian Hahn; CHECK-NEXT:  entry:
292873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i64 [[A:%.*]], 305
293873e630dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
294873e630dSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
295873e630dSFlorian Hahn; CHECK:       exit.1:
296873e630dSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i64 [[A]], 0
297873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_2]]
298873e630dSFlorian Hahn; CHECK:       exit.2:
299873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 true
300873e630dSFlorian Hahn;
301873e630dSFlorian Hahnentry:
302873e630dSFlorian Hahn  %neg2 = sub nuw i64 %a, 305
303873e630dSFlorian Hahn  %c.1 = icmp ugt i64 0, %neg2
304873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
305873e630dSFlorian Hahn
306873e630dSFlorian Hahnexit.1:
307873e630dSFlorian Hahn  %c.2 = icmp ugt i64 %a, 0
308873e630dSFlorian Hahn  ret i1 %c.2
309873e630dSFlorian Hahn
310873e630dSFlorian Hahnexit.2:
311873e630dSFlorian Hahn  %c.3 = icmp ugt i64 %a, 0
312873e630dSFlorian Hahn  ret i1 %c.3
313873e630dSFlorian Hahn}
314873e630dSFlorian Hahn
315873e630dSFlorian Hahndefine i1 @sub_nuw_neg_i16(i16 %a) {
316873e630dSFlorian Hahn; CHECK-LABEL: @sub_nuw_neg_i16(
317873e630dSFlorian Hahn; CHECK-NEXT:  entry:
318873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], -305
319*3c127e83SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
320*3c127e83SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
321873e630dSFlorian Hahn; CHECK:       exit.1:
322*3c127e83SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i16 [[A]], 0
323*3c127e83SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_2]]
324873e630dSFlorian Hahn; CHECK:       exit.2:
325*3c127e83SFlorian Hahn; CHECK-NEXT:    ret i1 true
326873e630dSFlorian Hahn;
327873e630dSFlorian Hahnentry:
328873e630dSFlorian Hahn  %neg2 = sub nuw i16 %a, -305
329873e630dSFlorian Hahn  %c.1 = icmp ugt i16 0, %neg2
330873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
331873e630dSFlorian Hahn
332873e630dSFlorian Hahnexit.1:
333873e630dSFlorian Hahn  %c.2 = icmp ugt i16 %a, 0
334873e630dSFlorian Hahn  ret i1 %c.2
335873e630dSFlorian Hahn
336873e630dSFlorian Hahnexit.2:
337873e630dSFlorian Hahn  %c.3 = icmp ugt i16 %a, 0
338873e630dSFlorian Hahn  ret i1 %c.3
339873e630dSFlorian Hahn}
34085302599SFlorian Hahn
34185302599SFlorian Hahndeclare void @llvm.assume(i1)
34285302599SFlorian Hahn
34385302599SFlorian Hahndefine i1 @wrapping_offset_sum(i64 %x) {
34485302599SFlorian Hahn; CHECK-LABEL: @wrapping_offset_sum(
34585302599SFlorian Hahn; CHECK-NEXT:    [[NON_ZERO:%.*]] = icmp ugt i64 [[X:%.*]], 0
34685302599SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[NON_ZERO]])
34785302599SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = sub nuw i64 [[X]], 9223372036854775802
34885302599SFlorian Hahn; CHECK-NEXT:    [[ULT:%.*]] = icmp ugt i64 200, [[ADD]]
3498c3281dbSFlorian Hahn; CHECK-NEXT:    ret i1 [[ULT]]
35085302599SFlorian Hahn;
35185302599SFlorian Hahn  %non.zero = icmp ugt i64 %x, 0
35285302599SFlorian Hahn  call void @llvm.assume(i1 %non.zero)
35385302599SFlorian Hahn  %add = sub nuw i64 %x, 9223372036854775802
35485302599SFlorian Hahn  %ult = icmp ugt i64 200, %add
35585302599SFlorian Hahn  ret i1 %ult
35685302599SFlorian Hahn}
3572501ab5eSFlorian Hahn
3582501ab5eSFlorian Hahndefine i1 @sub_nuw_i64_signed_min(i64 %a) {
3592501ab5eSFlorian Hahn; CHECK-LABEL: @sub_nuw_i64_signed_min(
3602501ab5eSFlorian Hahn; CHECK-NEXT:  entry:
3612501ab5eSFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i64 [[A:%.*]], -9223372036854775808
3622501ab5eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 [[A]], [[SUB]]
3632501ab5eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
3642501ab5eSFlorian Hahn;
3652501ab5eSFlorian Hahnentry:
3662501ab5eSFlorian Hahn  %sub = sub nuw i64 %a, -9223372036854775808
3672501ab5eSFlorian Hahn  %c.1 = icmp ugt i64 %a, %sub
3682501ab5eSFlorian Hahn  ret i1 %c.1
3692501ab5eSFlorian Hahn}
3702501ab5eSFlorian Hahn
3712501ab5eSFlorian Hahndefine i1 @sub_nuw_i64_signed_min_const(i64 %a) {
3722501ab5eSFlorian Hahn; CHECK-LABEL: @sub_nuw_i64_signed_min_const(
3732501ab5eSFlorian Hahn; CHECK-NEXT:  entry:
3742501ab5eSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i64 0, -9223372036854775808
3752501ab5eSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ugt i64 [[NEG2]], 0
3762501ab5eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
3772501ab5eSFlorian Hahn;
3782501ab5eSFlorian Hahnentry:
3792501ab5eSFlorian Hahn  %neg2 = sub nuw i64 0, -9223372036854775808
3802501ab5eSFlorian Hahn  %c = icmp ugt i64 %neg2, 0
3812501ab5eSFlorian Hahn  ret i1 %c
3822501ab5eSFlorian Hahn}
3831fa18feeSFlorian Hahn
3841fa18feeSFlorian Hahndefine i1 @pr76713(i16 %i1, i16 %i3) {
3851fa18feeSFlorian Hahn; CHECK-LABEL: @pr76713(
3861fa18feeSFlorian Hahn; CHECK-NEXT:  entry:
3871fa18feeSFlorian Hahn; CHECK-NEXT:    [[C1:%.*]] = icmp ult i16 [[I1:%.*]], -1
3881fa18feeSFlorian Hahn; CHECK-NEXT:    [[C2:%.*]] = icmp uge i16 [[I1]], -3
3891fa18feeSFlorian Hahn; CHECK-NEXT:    [[C3:%.*]] = icmp ult i16 [[I3:%.*]], 2
3901fa18feeSFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C1]], [[C2]]
3911fa18feeSFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[AND]], [[C3]]
3921fa18feeSFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
3931fa18feeSFlorian Hahn; CHECK:       then:
3941fa18feeSFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i16 [[I1]], -3
3951fa18feeSFlorian Hahn; CHECK-NEXT:    [[ARRAYIDX_IDX:%.*]] = mul nuw nsw i16 [[I3]], 4
3961fa18feeSFlorian Hahn; CHECK-NEXT:    [[I6:%.*]] = add nuw nsw i16 [[ARRAYIDX_IDX]], [[SUB]]
397*3c127e83SFlorian Hahn; CHECK-NEXT:    [[C4:%.*]] = icmp ult i16 12, [[I6]]
398*3c127e83SFlorian Hahn; CHECK-NEXT:    ret i1 [[C4]]
3991fa18feeSFlorian Hahn; CHECK:       else:
4001fa18feeSFlorian Hahn; CHECK-NEXT:    ret i1 false
4011fa18feeSFlorian Hahn;
4021fa18feeSFlorian Hahnentry:
4031fa18feeSFlorian Hahn  %c1 = icmp ult i16 %i1, -1
4041fa18feeSFlorian Hahn  %c2 = icmp uge i16 %i1, -3
4051fa18feeSFlorian Hahn  %c3 = icmp ult i16 %i3, 2
4061fa18feeSFlorian Hahn  %and = and i1 %c1, %c2
4071fa18feeSFlorian Hahn  %and.2 = and i1 %and, %c3
4081fa18feeSFlorian Hahn  br i1 %and, label %then, label %else
4091fa18feeSFlorian Hahn
4101fa18feeSFlorian Hahnthen:
4111fa18feeSFlorian Hahn  %sub = sub nuw nsw i16 %i1, -3
4121fa18feeSFlorian Hahn  %arrayidx.idx = mul nuw nsw i16 %i3, 4
4131fa18feeSFlorian Hahn  %i6 = add nuw nsw i16 %arrayidx.idx, %sub
4141fa18feeSFlorian Hahn  %c4 = icmp ult i16 12, %i6
4151fa18feeSFlorian Hahn  ret i1 %c4
4161fa18feeSFlorian Hahn
4171fa18feeSFlorian Hahnelse:
4181fa18feeSFlorian Hahn  ret i1 0
4191fa18feeSFlorian Hahn}
4208c7dfafaSFlorian Hahn
4218c7dfafaSFlorian Hahndefine void @sub_nuw_chained_positive_constants(i16 %a) {
4228c7dfafaSFlorian Hahn; CHECK-LABEL: @sub_nuw_chained_positive_constants(
4238c7dfafaSFlorian Hahn; CHECK-NEXT:  entry:
4248c7dfafaSFlorian Hahn; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[A:%.*]], 10
4258c7dfafaSFlorian Hahn; CHECK-NEXT:    [[SUB2:%.*]] = sub nuw i16 [[SUB1]], 20
4268c7dfafaSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 [[SUB2]], 90
4278c7dfafaSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
4288c7dfafaSFlorian Hahn; CHECK:       exit.1:
429*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
4308c7dfafaSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i16 [[A]], 121
4318c7dfafaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
4328c7dfafaSFlorian Hahn; CHECK-NEXT:    ret void
4338c7dfafaSFlorian Hahn; CHECK:       exit.2:
434*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
435*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
4368c7dfafaSFlorian Hahn; CHECK-NEXT:    ret void
4378c7dfafaSFlorian Hahn;
4388c7dfafaSFlorian Hahnentry:
4398c7dfafaSFlorian Hahn  %sub1 = sub nuw i16 %a, 10
4408c7dfafaSFlorian Hahn  %sub2 = sub nuw i16 %sub1, 20
4418c7dfafaSFlorian Hahn  %c.1 = icmp ugt i16 %sub2, 90
4428c7dfafaSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
4438c7dfafaSFlorian Hahn
4448c7dfafaSFlorian Hahnexit.1:
4458c7dfafaSFlorian Hahn  %c.2 = icmp ugt i16 %a, 120
4468c7dfafaSFlorian Hahn  call void @use(i1 %c.2)
4478c7dfafaSFlorian Hahn  %c.3 = icmp ugt i16 %a, 121
4488c7dfafaSFlorian Hahn  call void @use(i1 %c.3)
4498c7dfafaSFlorian Hahn  ret void
4508c7dfafaSFlorian Hahn
4518c7dfafaSFlorian Hahnexit.2:
4528c7dfafaSFlorian Hahn  %c.4 = icmp ugt i16 %a, 120
4538c7dfafaSFlorian Hahn  call void @use(i1 %c.4)
4548c7dfafaSFlorian Hahn  %c.5 = icmp ugt i16 %a, 121
4558c7dfafaSFlorian Hahn  call void @use(i1 %c.5)
4568c7dfafaSFlorian Hahn  ret void
4578c7dfafaSFlorian Hahn}
4588c7dfafaSFlorian Hahn
4598c7dfafaSFlorian Hahndefine void @sub_nuw_chained_negative_constants(i8 %a) {
4608c7dfafaSFlorian Hahn; CHECK-LABEL: @sub_nuw_chained_negative_constants(
4618c7dfafaSFlorian Hahn; CHECK-NEXT:  entry:
4628c7dfafaSFlorian Hahn; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i8 [[A:%.*]], 10
4638c7dfafaSFlorian Hahn; CHECK-NEXT:    [[SUB2:%.*]] = sub nuw i8 [[SUB1]], -126
4648c7dfafaSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[SUB2]], 20
4658c7dfafaSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
4668c7dfafaSFlorian Hahn; CHECK:       exit.1:
467*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
4688c7dfafaSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[A]], -95
4698c7dfafaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
4708c7dfafaSFlorian Hahn; CHECK-NEXT:    ret void
4718c7dfafaSFlorian Hahn; CHECK:       exit.2:
472*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
473*3c127e83SFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
4748c7dfafaSFlorian Hahn; CHECK-NEXT:    ret void
4758c7dfafaSFlorian Hahn;
4768c7dfafaSFlorian Hahnentry:
4778c7dfafaSFlorian Hahn  %sub1 = sub nuw i8 %a, 10
4788c7dfafaSFlorian Hahn  %sub2 = sub nuw i8 %sub1, 130
4798c7dfafaSFlorian Hahn  %c.1 = icmp ugt i8 %sub2, 20
4808c7dfafaSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
4818c7dfafaSFlorian Hahn
4828c7dfafaSFlorian Hahnexit.1:
4838c7dfafaSFlorian Hahn  %c.2 = icmp ugt i8 %a, 160
4848c7dfafaSFlorian Hahn  call void @use(i1 %c.2)
4858c7dfafaSFlorian Hahn  %c.3 = icmp ugt i8 %a, 161
4868c7dfafaSFlorian Hahn  call void @use(i1 %c.3)
4878c7dfafaSFlorian Hahn  ret void
4888c7dfafaSFlorian Hahn
4898c7dfafaSFlorian Hahn
4908c7dfafaSFlorian Hahnexit.2:
4918c7dfafaSFlorian Hahn  %c.4 = icmp ugt i8 %a, 160
4928c7dfafaSFlorian Hahn  call void @use(i1 %c.4)
4938c7dfafaSFlorian Hahn  %c.5 = icmp ugt i8 %a, 161
4948c7dfafaSFlorian Hahn  call void @use(i1 %c.5)
4958c7dfafaSFlorian Hahn  ret void
4968c7dfafaSFlorian Hahn}
497