xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/add-nuw.ll (revision fbcf8a8cbb2461730bfd0603b396842925a88ef2)
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:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3
82322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_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:
132fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
142322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
152fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
162322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
172fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
182322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
192fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
202322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
212322080bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]
222322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
232322080bSFlorian Hahn; CHECK-NEXT:    ret void
242322080bSFlorian Hahn;
252322080bSFlorian Hahnentry:
262322080bSFlorian Hahn  %add.ptr.i = add nuw i8 %start, 3
272322080bSFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
282322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
292322080bSFlorian Hahn
302322080bSFlorian Hahnif.then:                                          ; preds = %entry
312322080bSFlorian Hahn  ret void
322322080bSFlorian Hahn
332322080bSFlorian Hahnif.end:                                           ; preds = %entry
342322080bSFlorian Hahn  %t.0 = icmp ult i8 %start, %high
352322080bSFlorian Hahn  call void @use(i1 %t.0)
362322080bSFlorian Hahn  %start.1 = add nuw i8 %start, 1
372322080bSFlorian Hahn  %t.1 = icmp ult i8 %start.1, %high
382322080bSFlorian Hahn  call void @use(i1 %t.1)
392322080bSFlorian Hahn  %start.2 = add nuw i8 %start, 2
402322080bSFlorian Hahn  %t.2 = icmp ult i8 %start.2, %high
412322080bSFlorian Hahn  call void @use(i1 %t.2)
422322080bSFlorian Hahn  %start.3 = add nuw i8 %start, 3
432322080bSFlorian Hahn  %t.3 = icmp ult i8 %start.3, %high
442322080bSFlorian Hahn  call void @use(i1 %t.3)
452322080bSFlorian Hahn  %start.4 = add nuw i8 %start, 4
462322080bSFlorian Hahn  %c.4 = icmp ult i8 %start.4, %high
472322080bSFlorian Hahn  call void @use(i1 %c.4)
482322080bSFlorian Hahn  ret void
492322080bSFlorian Hahn}
502322080bSFlorian Hahn
512322080bSFlorian Hahndefine void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) {
522322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.ule(
532322080bSFlorian Hahn; CHECK-NEXT:  entry:
542322080bSFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3
552322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
562322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
572322080bSFlorian Hahn; CHECK:       if.then:
582322080bSFlorian Hahn; CHECK-NEXT:    ret void
592322080bSFlorian Hahn; CHECK:       if.end:
602fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
612322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
622fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
632322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
642fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
652322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
662fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
672322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
682fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
692322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 5
702322080bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]]
712322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
722322080bSFlorian Hahn; CHECK-NEXT:    ret void
732322080bSFlorian Hahn;
742322080bSFlorian Hahnentry:
752322080bSFlorian Hahn  %add.ptr.i = add nuw i8 %start, 3
762322080bSFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
772322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
782322080bSFlorian Hahn
792322080bSFlorian Hahnif.then:                                          ; preds = %entry
802322080bSFlorian Hahn  ret void
812322080bSFlorian Hahn
822322080bSFlorian Hahnif.end:                                           ; preds = %entry
832322080bSFlorian Hahn  %t.0 = icmp ule i8 %start, %high
842322080bSFlorian Hahn  call void @use(i1 %t.0)
852322080bSFlorian Hahn  %start.1 = add nuw i8 %start, 1
862322080bSFlorian Hahn  %t.1 = icmp ule i8 %start.1, %high
872322080bSFlorian Hahn  call void @use(i1 %t.1)
882322080bSFlorian Hahn  %start.2 = add nuw i8 %start, 2
892322080bSFlorian Hahn  %t.2 = icmp ule i8 %start.2, %high
902322080bSFlorian Hahn  call void @use(i1 %t.2)
912322080bSFlorian Hahn  %start.3 = add nuw i8 %start, 3
922322080bSFlorian Hahn  %t.3 = icmp ule i8 %start.3, %high
932322080bSFlorian Hahn  call void @use(i1 %t.3)
942322080bSFlorian Hahn  %start.4 = add nuw i8 %start, 4
952322080bSFlorian Hahn  %t.4 = icmp ule i8 %start.4, %high
962322080bSFlorian Hahn  call void @use(i1 %t.4)
972322080bSFlorian Hahn
982322080bSFlorian Hahn  %start.5 = add nuw i8 %start, 5
992322080bSFlorian Hahn  %c.5 = icmp ule i8 %start.5, %high
1002322080bSFlorian Hahn  call void @use(i1 %c.5)
1012322080bSFlorian Hahn
1022322080bSFlorian Hahn  ret void
1032322080bSFlorian Hahn}
1042322080bSFlorian Hahn
1052322080bSFlorian Hahndefine void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) {
1062322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.ugt(
1072322080bSFlorian Hahn; CHECK-NEXT:  entry:
1082322080bSFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3
1092322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
1102322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1112322080bSFlorian Hahn; CHECK:       if.then:
1122322080bSFlorian Hahn; CHECK-NEXT:    ret void
1132322080bSFlorian Hahn; CHECK:       if.end:
1142fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1152322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
1162fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1172322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
1182fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1192322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
1202fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1212322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
1222fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1232322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 5
1242322080bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]]
1252322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
1262322080bSFlorian Hahn; CHECK-NEXT:    ret void
1272322080bSFlorian Hahn;
1282322080bSFlorian Hahnentry:
1292322080bSFlorian Hahn  %add.ptr.i = add nuw i8 %start, 3
1302322080bSFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
1312322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
1322322080bSFlorian Hahn
1332322080bSFlorian Hahnif.then:                                          ; preds = %entry
1342322080bSFlorian Hahn  ret void
1352322080bSFlorian Hahn
1362322080bSFlorian Hahnif.end:                                           ; preds = %entry
1372322080bSFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
1382322080bSFlorian Hahn  call void @use(i1 %f.0)
1392322080bSFlorian Hahn
1402322080bSFlorian Hahn  %start.1 = add nuw i8 %start, 1
1412322080bSFlorian Hahn  %f.1 = icmp ugt i8 %start.1, %high
1422322080bSFlorian Hahn  call void @use(i1 %f.1)
1432322080bSFlorian Hahn
1442322080bSFlorian Hahn  %start.2 = add nuw i8 %start, 2
1452322080bSFlorian Hahn  %f.2 = icmp ugt i8 %start.2, %high
1462322080bSFlorian Hahn  call void @use(i1 %f.2)
1472322080bSFlorian Hahn
1482322080bSFlorian Hahn  %start.3 = add nuw i8 %start, 3
1492322080bSFlorian Hahn  %f.3 = icmp ugt i8 %start.3, %high
1502322080bSFlorian Hahn  call void @use(i1 %f.3)
1512322080bSFlorian Hahn
1522322080bSFlorian Hahn  %start.4 = add nuw i8 %start, 4
1532322080bSFlorian Hahn  %f.4 = icmp ugt i8 %start.4, %high
1542322080bSFlorian Hahn  call void @use(i1 %f.4)
1552322080bSFlorian Hahn
1562322080bSFlorian Hahn  %start.5 = add nuw i8 %start, 5
1572322080bSFlorian Hahn  %c.5 = icmp ugt i8 %start.5, %high
1582322080bSFlorian Hahn  call void @use(i1 %c.5)
1592322080bSFlorian Hahn
1602322080bSFlorian Hahn  ret void
1612322080bSFlorian Hahn}
1622322080bSFlorian Hahn
1632322080bSFlorian Hahndefine void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) {
1642322080bSFlorian Hahn; CHECK-LABEL: @test.not.uge.uge(
1652322080bSFlorian Hahn; CHECK-NEXT:  entry:
1662322080bSFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3
1672322080bSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
1682322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1692322080bSFlorian Hahn; CHECK:       if.then:
1702322080bSFlorian Hahn; CHECK-NEXT:    ret void
1712322080bSFlorian Hahn; CHECK:       if.end:
1722fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1732322080bSFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
1742fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1752322080bSFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
1762fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1772322080bSFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
1782fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1792322080bSFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
1802322080bSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
1812322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
1822322080bSFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 5
1832322080bSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
1842322080bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
1852322080bSFlorian Hahn; CHECK-NEXT:    ret void
1862322080bSFlorian Hahn;
1872322080bSFlorian Hahnentry:
1882322080bSFlorian Hahn  %add.ptr.i = add nuw i8 %start, 3
1892322080bSFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
1902322080bSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
1912322080bSFlorian Hahn
1922322080bSFlorian Hahnif.then:                                          ; preds = %entry
1932322080bSFlorian Hahn  ret void
1942322080bSFlorian Hahn
1952322080bSFlorian Hahnif.end:                                           ; preds = %entry
1962322080bSFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
1972322080bSFlorian Hahn  call void @use(i1 %f.0)
1982322080bSFlorian Hahn
1992322080bSFlorian Hahn  %start.1 = add nuw i8 %start, 1
2002322080bSFlorian Hahn  %f.1 = icmp uge i8 %start.1, %high
2012322080bSFlorian Hahn  call void @use(i1 %f.1)
2022322080bSFlorian Hahn
2032322080bSFlorian Hahn  %start.2 = add nuw i8 %start, 2
2042322080bSFlorian Hahn  %f.2 = icmp uge i8 %start.2, %high
2052322080bSFlorian Hahn  call void @use(i1 %f.2)
2062322080bSFlorian Hahn
2072322080bSFlorian Hahn  %start.3 = add nuw i8 %start, 3
2082322080bSFlorian Hahn  %f.3 = icmp uge i8 %start.3, %high
2092322080bSFlorian Hahn  call void @use(i1 %f.3)
2102322080bSFlorian Hahn
2112322080bSFlorian Hahn  %start.4 = add nuw i8 %start, 4
2122322080bSFlorian Hahn  %c.4 = icmp uge i8 %start.4, %high
2132322080bSFlorian Hahn  call void @use(i1 %c.4)
2142322080bSFlorian Hahn
2152322080bSFlorian Hahn  %start.5 = add nuw i8 %start, 5
2162322080bSFlorian Hahn  %c.5 = icmp uge i8 %start.5, %high
2172322080bSFlorian Hahn  call void @use(i1 %c.5)
2182322080bSFlorian Hahn
2192322080bSFlorian Hahn  ret void
2202322080bSFlorian Hahn}
2212322080bSFlorian Hahn
22215beb4e2SFlorian Hahndefine void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) {
22315beb4e2SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst(
22415beb4e2SFlorian Hahn; CHECK-NEXT:  entry:
22515beb4e2SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp uge i8 [[A:%.*]], [[C:%.*]]
22615beb4e2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[C]]
22715beb4e2SFlorian Hahn; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]
22815beb4e2SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
22915beb4e2SFlorian Hahn; CHECK:       if.then:
23098e016d9SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 true, true
23115beb4e2SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[IF_THEN_2:%.*]], label [[IF_END]]
23215beb4e2SFlorian Hahn; CHECK:       if.then.2:
23315beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]]
2342fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
23515beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]
2362fead1acSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
23715beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]
238*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
23915beb4e2SFlorian Hahn; CHECK-NEXT:    ret void
24015beb4e2SFlorian Hahn; CHECK:       if.end:
24115beb4e2SFlorian Hahn; CHECK-NEXT:    ret void
24215beb4e2SFlorian Hahn;
24315beb4e2SFlorian Hahnentry:
24415beb4e2SFlorian Hahn  %c.0 = icmp uge i8 %a, %c
24515beb4e2SFlorian Hahn  %c.1 = icmp uge i8 %b, %c
24615beb4e2SFlorian Hahn  %and.0 = and i1 %c.0, %c.1
24715beb4e2SFlorian Hahn  br i1 %and.0, label %if.then, label %if.end
24815beb4e2SFlorian Hahn
24915beb4e2SFlorian Hahnif.then:                                          ; preds = %entry
25015beb4e2SFlorian Hahn  %c.2 = icmp uge i8 %a, 0
25115beb4e2SFlorian Hahn  %c.3 = icmp uge i8 %b, 0
25215beb4e2SFlorian Hahn  %and.1 = and i1 %c.2, %c.3
25315beb4e2SFlorian Hahn  br i1 %and.1, label %if.then.2, label %if.end
25415beb4e2SFlorian Hahn
25515beb4e2SFlorian Hahnif.then.2:
25615beb4e2SFlorian Hahn  %add.0 = add nuw i8 %a, %b
25715beb4e2SFlorian Hahn  %t.0 = icmp uge i8 %add.0, %c
25815beb4e2SFlorian Hahn  call void @use(i1 %t.0)
25915beb4e2SFlorian Hahn  %add.1 = add nuw i8 %a, %a
26015beb4e2SFlorian Hahn  %t.1 = icmp uge i8 %add.0, %c
26115beb4e2SFlorian Hahn  call void @use(i1 %t.1)
26215beb4e2SFlorian Hahn  %add.2 = add nuw i8 %a, %d
26315beb4e2SFlorian Hahn  %c.4 = icmp uge i8 %add.2, %c
26415beb4e2SFlorian Hahn  call void @use(i1 %c.4)
26515beb4e2SFlorian Hahn  ret void
26615beb4e2SFlorian Hahn
26715beb4e2SFlorian Hahnif.end:                                           ; preds = %entry
26815beb4e2SFlorian Hahn  ret void
26915beb4e2SFlorian Hahn}
27015beb4e2SFlorian Hahn
27115beb4e2SFlorian Hahndefine void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) {
27215beb4e2SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst.no.null.check(
27315beb4e2SFlorian Hahn; CHECK-NEXT:  entry:
27415beb4e2SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp uge i8 [[A:%.*]], [[C:%.*]]
27515beb4e2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[C]]
27615beb4e2SFlorian Hahn; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]
27715beb4e2SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
27815beb4e2SFlorian Hahn; CHECK:       if.then:
27915beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]]
280*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
28115beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]
282*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
28315beb4e2SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]
284*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
28515beb4e2SFlorian Hahn; CHECK-NEXT:    ret void
28615beb4e2SFlorian Hahn; CHECK:       if.end:
28715beb4e2SFlorian Hahn; CHECK-NEXT:    ret void
28815beb4e2SFlorian Hahn;
28915beb4e2SFlorian Hahnentry:
29015beb4e2SFlorian Hahn  %c.0 = icmp uge i8 %a, %c
29115beb4e2SFlorian Hahn  %c.1 = icmp uge i8 %b, %c
29215beb4e2SFlorian Hahn  %and.0 = and i1 %c.0, %c.1
29315beb4e2SFlorian Hahn  br i1 %and.0, label %if.then, label %if.end
29415beb4e2SFlorian Hahn
29515beb4e2SFlorian Hahnif.then:                                          ; preds = %entry
29615beb4e2SFlorian Hahn  %add.0 = add nuw i8 %a, %b
29715beb4e2SFlorian Hahn  %t.0 = icmp uge i8 %add.0, %c
29815beb4e2SFlorian Hahn  call void @use(i1 %t.0)
29915beb4e2SFlorian Hahn  %add.1 = add nuw i8 %a, %a
30015beb4e2SFlorian Hahn  %t.1 = icmp uge i8 %add.0, %c
30115beb4e2SFlorian Hahn  call void @use(i1 %t.1)
30215beb4e2SFlorian Hahn  %add.2 = add nuw i8 %a, %d
30315beb4e2SFlorian Hahn  %c.4 = icmp uge i8 %add.2, %c
30415beb4e2SFlorian Hahn  call void @use(i1 %c.4)
30515beb4e2SFlorian Hahn  ret void
30615beb4e2SFlorian Hahn
30715beb4e2SFlorian Hahnif.end:                                           ; preds = %entry
30815beb4e2SFlorian Hahn  ret void
30915beb4e2SFlorian Hahn}
31015beb4e2SFlorian Hahn
3112322080bSFlorian Hahn
31214da287eSFlorian Hahndefine i1 @test_n_must_ule_1_due_to_nuw(i8 %n, i8 %i) {
313a14a59f2SFlorian Hahn; CHECK-LABEL: @test_n_must_ule_1_due_to_nuw(
314a14a59f2SFlorian Hahn; CHECK-NEXT:  entry:
315a14a59f2SFlorian Hahn; CHECK-NEXT:    [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -1
316a14a59f2SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]
317*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
318a14a59f2SFlorian Hahn; CHECK:       if.then:
319f213128bSFlorian Hahn; CHECK-NEXT:    ret i1 true
320a14a59f2SFlorian Hahn; CHECK:       if.end:
321a14a59f2SFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1
322a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
323a14a59f2SFlorian Hahn;
32414da287eSFlorian Hahnentry:
32514da287eSFlorian Hahn  %sub.n.1 = add nuw i8 %n, -1
32614da287eSFlorian Hahn  %add = add nuw i8 %i, %sub.n.1
32714da287eSFlorian Hahn  %c.1 = icmp uge i8 %i, %add
32814da287eSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
32914da287eSFlorian Hahn
33014da287eSFlorian Hahnif.then:                                          ; preds = %entry
33114da287eSFlorian Hahn  %t = icmp ule i8 %n, 1
33214da287eSFlorian Hahn  ret i1 %t
33314da287eSFlorian Hahn
33414da287eSFlorian Hahnif.end:                                           ; preds = %entry
33514da287eSFlorian Hahn  %f = icmp ule i8 %n, 1
33614da287eSFlorian Hahn  ret i1 %f
33714da287eSFlorian Hahn}
33814da287eSFlorian Hahn
33914da287eSFlorian Hahn
34014da287eSFlorian Hahndefine i1 @test_n_unknown_missing_nuw(i8 %n, i8 %i) {
341a14a59f2SFlorian Hahn; CHECK-LABEL: @test_n_unknown_missing_nuw(
342a14a59f2SFlorian Hahn; CHECK-NEXT:  entry:
343a14a59f2SFlorian Hahn; CHECK-NEXT:    [[SUB_N_1:%.*]] = add i8 [[N:%.*]], -1
344a14a59f2SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[I:%.*]], [[SUB_N_1]]
345a14a59f2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]
346a14a59f2SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
347a14a59f2SFlorian Hahn; CHECK:       if.then:
348a14a59f2SFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[N]], 1
349a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
350a14a59f2SFlorian Hahn; CHECK:       if.end:
351a14a59f2SFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1
352a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
353a14a59f2SFlorian Hahn;
35414da287eSFlorian Hahnentry:
35514da287eSFlorian Hahn  %sub.n.1 = add i8 %n, -1
35614da287eSFlorian Hahn  %add = add i8 %i, %sub.n.1
35714da287eSFlorian Hahn  %c.1 = icmp uge i8 %i, %add
35814da287eSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
35914da287eSFlorian Hahn
36014da287eSFlorian Hahnif.then:                                          ; preds = %entry
36114da287eSFlorian Hahn  %t = icmp ule i8 %n, 1
36214da287eSFlorian Hahn  ret i1 %t
36314da287eSFlorian Hahn
36414da287eSFlorian Hahnif.end:                                           ; preds = %entry
36514da287eSFlorian Hahn  %f = icmp ule i8 %n, 1
36614da287eSFlorian Hahn  ret i1 %f
36714da287eSFlorian Hahn}
36814da287eSFlorian Hahn
36914da287eSFlorian Hahndefine i1 @test_n_must_ule_2_due_to_nuw(i8 %n, i8 %i) {
370a14a59f2SFlorian Hahn; CHECK-LABEL: @test_n_must_ule_2_due_to_nuw(
371a14a59f2SFlorian Hahn; CHECK-NEXT:  entry:
372a14a59f2SFlorian Hahn; CHECK-NEXT:    [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -2
373a14a59f2SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]
374*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
375a14a59f2SFlorian Hahn; CHECK:       if.then:
376f213128bSFlorian Hahn; CHECK-NEXT:    ret i1 true
377a14a59f2SFlorian Hahn; CHECK:       if.end:
378a14a59f2SFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 2
379a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
380a14a59f2SFlorian Hahn;
38114da287eSFlorian Hahnentry:
38214da287eSFlorian Hahn  %sub.n.1 = add nuw i8 %n, -2
38314da287eSFlorian Hahn  %add = add nuw i8 %i, %sub.n.1
38414da287eSFlorian Hahn  %c.1 = icmp uge i8 %i, %add
38514da287eSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
38614da287eSFlorian Hahn
38714da287eSFlorian Hahnif.then:                                          ; preds = %entry
38814da287eSFlorian Hahn  %t = icmp ule i8 %n, 2
38914da287eSFlorian Hahn  ret i1 %t
39014da287eSFlorian Hahn
39114da287eSFlorian Hahnif.end:                                           ; preds = %entry
39214da287eSFlorian Hahn  %f = icmp ule i8 %n, 2
39314da287eSFlorian Hahn  ret i1 %f
39414da287eSFlorian Hahn}
39514da287eSFlorian Hahn
39614da287eSFlorian Hahn
39714da287eSFlorian Hahndefine i1 @test_n_unknown_missing_nuw2(i8 %n, i8 %i) {
398a14a59f2SFlorian Hahn; CHECK-LABEL: @test_n_unknown_missing_nuw2(
399a14a59f2SFlorian Hahn; CHECK-NEXT:  entry:
400a14a59f2SFlorian Hahn; CHECK-NEXT:    [[SUB_N_1:%.*]] = add i8 [[N:%.*]], -2
401a14a59f2SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[I:%.*]], [[SUB_N_1]]
402a14a59f2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]
403a14a59f2SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
404a14a59f2SFlorian Hahn; CHECK:       if.then:
405a14a59f2SFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[N]], 1
406a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
407a14a59f2SFlorian Hahn; CHECK:       if.end:
408a14a59f2SFlorian Hahn; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1
409a14a59f2SFlorian Hahn; CHECK-NEXT:    ret i1 [[F]]
410a14a59f2SFlorian Hahn;
41114da287eSFlorian Hahnentry:
41214da287eSFlorian Hahn  %sub.n.1 = add i8 %n, -2
41314da287eSFlorian Hahn  %add = add i8 %i, %sub.n.1
41414da287eSFlorian Hahn  %c.1 = icmp uge i8 %i, %add
41514da287eSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
41614da287eSFlorian Hahn
41714da287eSFlorian Hahnif.then:                                          ; preds = %entry
41814da287eSFlorian Hahn  %t = icmp ule i8 %n, 1
41914da287eSFlorian Hahn  ret i1 %t
42014da287eSFlorian Hahn
42114da287eSFlorian Hahnif.end:                                           ; preds = %entry
42214da287eSFlorian Hahn  %f = icmp ule i8 %n, 1
42314da287eSFlorian Hahn  ret i1 %f
42414da287eSFlorian Hahn}
42514da287eSFlorian Hahn
4262322080bSFlorian Hahndeclare void @use(i1)
427873e630dSFlorian Hahn
428873e630dSFlorian Hahndefine i1 @add_nuw_neg_pr54224_i16(i16 %a) {
429873e630dSFlorian Hahn; CHECK-LABEL: @add_nuw_neg_pr54224_i16(
430873e630dSFlorian Hahn; CHECK-NEXT:  entry:
431873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i16 [[A:%.*]], -305
432*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    br i1 false, label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
433873e630dSFlorian Hahn; CHECK:       exit.1:
434*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
435873e630dSFlorian Hahn; CHECK:       exit.2:
436873e630dSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i16 [[A]], 0
4374bbee17eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_3]]
438873e630dSFlorian Hahn;
439873e630dSFlorian Hahnentry:
440873e630dSFlorian Hahn  %neg2 = add nuw i16 %a, -305
441873e630dSFlorian Hahn  %c.1 = icmp ugt i16 0, %neg2
442873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
443873e630dSFlorian Hahn
444873e630dSFlorian Hahnexit.1:
445873e630dSFlorian Hahn  %c.2 = icmp ugt i16 %a, 0
446873e630dSFlorian Hahn  ret i1 %c.2
447873e630dSFlorian Hahn
448873e630dSFlorian Hahnexit.2:
449873e630dSFlorian Hahn  %c.3 = icmp ugt i16 %a, 0
450873e630dSFlorian Hahn  ret i1 %c.3
451873e630dSFlorian Hahn}
452873e630dSFlorian Hahn
453873e630dSFlorian Hahndefine i1 @add_nuw_neg_pr54224_i64(i64 %a) {
454873e630dSFlorian Hahn; CHECK-LABEL: @add_nuw_neg_pr54224_i64(
455873e630dSFlorian Hahn; CHECK-NEXT:  entry:
456873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -305
457873e630dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
458873e630dSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
459873e630dSFlorian Hahn; CHECK:       exit.1:
460*fbcf8a8cSFlorian Hahn; CHECK-NEXT:    ret i1 true
461873e630dSFlorian Hahn; CHECK:       exit.2:
462873e630dSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i64 [[A]], 0
4634bbee17eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_3]]
464873e630dSFlorian Hahn;
465873e630dSFlorian Hahnentry:
466873e630dSFlorian Hahn  %neg2 = add nuw i64 %a, -305
467873e630dSFlorian Hahn  %c.1 = icmp ugt i64 0, %neg2
468873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
469873e630dSFlorian Hahn
470873e630dSFlorian Hahnexit.1:
471873e630dSFlorian Hahn  %c.2 = icmp ugt i64 %a, 0
472873e630dSFlorian Hahn  ret i1 %c.2
473873e630dSFlorian Hahn
474873e630dSFlorian Hahnexit.2:
475873e630dSFlorian Hahn  %c.3 = icmp ugt i64 %a, 0
476873e630dSFlorian Hahn  ret i1 %c.3
477873e630dSFlorian Hahn}
478873e630dSFlorian Hahn
479873e630dSFlorian Hahndefine i1 @add_nuw_neg2_i8(i8 %a) {
480873e630dSFlorian Hahn; CHECK-LABEL: @add_nuw_neg2_i8(
481873e630dSFlorian Hahn; CHECK-NEXT:  entry:
482873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i8 [[A:%.*]], -4
483873e630dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[NEG2]], -2
484873e630dSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
485873e630dSFlorian Hahn; CHECK:       exit.1:
486873e630dSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[A]], 1
4874bbee17eSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_2]]
488873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
489873e630dSFlorian Hahn; CHECK:       exit.2:
490873e630dSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[A]], 3
4914bbee17eSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_3]], false
492873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
493873e630dSFlorian Hahn;
494873e630dSFlorian Hahnentry:
495873e630dSFlorian Hahn  %neg2 = add nuw i8 %a, -4
496873e630dSFlorian Hahn  %c.1 = icmp ult i8 %neg2, -2
497873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
498873e630dSFlorian Hahn
499873e630dSFlorian Hahnexit.1:
500873e630dSFlorian Hahn  %t.1 = icmp ult i8 %a, 2
501873e630dSFlorian Hahn  %c.2 = icmp ult i8 %a, 1
502873e630dSFlorian Hahn  %res.1 = xor i1 %t.1, %c.2
503873e630dSFlorian Hahn  ret i1 %res.1
504873e630dSFlorian Hahn
505873e630dSFlorian Hahnexit.2:
506873e630dSFlorian Hahn  %c.3 = icmp ult i8 %a, 3
507873e630dSFlorian Hahn  %f.1 = icmp ult i8 %a, 2
508873e630dSFlorian Hahn  %res.2 = xor i1 %c.3, %f.1
509873e630dSFlorian Hahn  ret i1 %res.2
510873e630dSFlorian Hahn}
511873e630dSFlorian Hahn
512873e630dSFlorian Hahndefine i1 @add_nuw_neg2_i64(i64 %a) {
513873e630dSFlorian Hahn; CHECK-LABEL: @add_nuw_neg2_i64(
514873e630dSFlorian Hahn; CHECK-NEXT:  entry:
515873e630dSFlorian Hahn; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -4
516873e630dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i64 [[NEG2]], -2
517873e630dSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
518873e630dSFlorian Hahn; CHECK:       exit.1:
519873e630dSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i64 [[A]], 2
520873e630dSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i64 [[A]], 1
521873e630dSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[C_2]]
522873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
523873e630dSFlorian Hahn; CHECK:       exit.2:
524873e630dSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i64 [[A]], 3
525873e630dSFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ult i64 [[A]], 2
526873e630dSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_3]], [[F_1]]
527873e630dSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
528873e630dSFlorian Hahn;
529873e630dSFlorian Hahnentry:
530873e630dSFlorian Hahn  %neg2 = add nuw i64 %a, -4
531873e630dSFlorian Hahn  %c.1 = icmp ult i64 %neg2, -2
532873e630dSFlorian Hahn  br i1 %c.1, label %exit.1, label %exit.2
533873e630dSFlorian Hahn
534873e630dSFlorian Hahnexit.1:
535873e630dSFlorian Hahn  %t.1 = icmp ult i64 %a, 2
536873e630dSFlorian Hahn  %c.2 = icmp ult i64 %a, 1
537873e630dSFlorian Hahn  %res.1 = xor i1 %t.1, %c.2
538873e630dSFlorian Hahn  ret i1 %res.1
539873e630dSFlorian Hahn
540873e630dSFlorian Hahnexit.2:
541873e630dSFlorian Hahn  %c.3 = icmp ult i64 %a, 3
542873e630dSFlorian Hahn  %f.1 = icmp ult i64 %a, 2
543873e630dSFlorian Hahn  %res.2 = xor i1 %c.3, %f.1
544873e630dSFlorian Hahn  ret i1 %res.2
545873e630dSFlorian Hahn}
54662c19284SFlorian Hahn
54762c19284SFlorian Hahndefine i1 @test_chained_adds_nuw_1(i8 %a, i8 %b) {
54862c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_nuw_1(
54962c19284SFlorian Hahn; CHECK-NEXT:  entry:
55062c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
55162c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
55262c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
55362c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
55462c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]
55562c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2
55662c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_2]], 14
557f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
55862c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
55962c19284SFlorian Hahn;
56062c19284SFlorian Hahnentry:
56162c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
56262c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
56362c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
56462c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
56562c19284SFlorian Hahn  %add.1 = add nuw i8 %a, %b
56662c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, 2
56762c19284SFlorian Hahn  %t.1 = icmp uge i8 %add.2, 13
56862c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.2, 14
56962c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
57062c19284SFlorian Hahn  ret i1 %res.1
57162c19284SFlorian Hahn}
57262c19284SFlorian Hahn
57362c19284SFlorian Hahndefine i1 @test_chained_adds_nuw_2(i8 %a, i8 %b) {
57462c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_nuw_2(
57562c19284SFlorian Hahn; CHECK-NEXT:  entry:
57662c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
57762c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
57862c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
57962c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
58062c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]
58162c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2
58262c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
58362c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
584f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
58562c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
58662c19284SFlorian Hahn;
58762c19284SFlorian Hahnentry:
58862c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
58962c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
59062c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
59162c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
59262c19284SFlorian Hahn  %add.1 = add nuw i8 %a, %b
59362c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, 2
59462c19284SFlorian Hahn  %add.3 = add nuw i8 %add.2, %a
59562c19284SFlorian Hahn  %t.1 = icmp uge i8 %add.3, 18
59662c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 19
59762c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
59862c19284SFlorian Hahn  ret i1 %res.1
59962c19284SFlorian Hahn}
60062c19284SFlorian Hahn
60162c19284SFlorian Hahndefine i1 @test_chained_adds_nuw_3(i8 %a, i8 %b) {
60262c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_nuw_3(
60362c19284SFlorian Hahn; CHECK-NEXT:  entry:
60462c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
60562c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
60662c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
60762c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
60862c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2
60962c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
61062c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
61162c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
612f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
61362c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
61462c19284SFlorian Hahn;
61562c19284SFlorian Hahnentry:
61662c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
61762c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
61862c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
61962c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
62062c19284SFlorian Hahn  %add.1 = add nuw i8 %a, 2
62162c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, %b
62262c19284SFlorian Hahn  %add.3 = add nuw i8 %add.2, %a
62362c19284SFlorian Hahn  %t.1 = icmp uge i8 %add.3, 18
62462c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 19
62562c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
62662c19284SFlorian Hahn  ret i1 %res.1
62762c19284SFlorian Hahn}
62862c19284SFlorian Hahn
62962c19284SFlorian Hahndefine i1 @test_chained_adds_nuw_4(i8 %a, i8 %b) {
63062c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_nuw_4(
63162c19284SFlorian Hahn; CHECK-NEXT:  entry:
63262c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
63362c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
63462c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
63562c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
63662c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2
63762c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
63862c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], 10
63962c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 24
640f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
64162c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
64262c19284SFlorian Hahn;
64362c19284SFlorian Hahnentry:
64462c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
64562c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
64662c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
64762c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
64862c19284SFlorian Hahn  %add.1 = add nuw i8 %a, 2
64962c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, %b
65062c19284SFlorian Hahn  %add.3 = add nuw i8 %add.2, 10
65162c19284SFlorian Hahn  %t.1 = icmp uge i8 %add.3, 23
65262c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 24
65362c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
65462c19284SFlorian Hahn  ret i1 %res.1
65562c19284SFlorian Hahn}
65662c19284SFlorian Hahn
65762c19284SFlorian Hahndefine i1 @test_chained_adds_missing_nuw_1(i8 %a, i8 %b) {
65862c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_missing_nuw_1(
65962c19284SFlorian Hahn; CHECK-NEXT:  entry:
66062c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
66162c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
66262c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
66362c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
66462c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add i8 [[A]], 2
66562c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
66662c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
66762c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
66862c19284SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
66962c19284SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
67062c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
67162c19284SFlorian Hahn;
67262c19284SFlorian Hahnentry:
67362c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
67462c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
67562c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
67662c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
67762c19284SFlorian Hahn  %add.1 = add i8 %a, 2
67862c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, %b
67962c19284SFlorian Hahn  %add.3 = add nuw i8 %add.2, %a
68062c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 18
68162c19284SFlorian Hahn  %c.2 = icmp uge i8 %add.3, 19
68262c19284SFlorian Hahn  %res.1 = xor i1 %c.1, %c.2
68362c19284SFlorian Hahn  ret i1 %res.1
68462c19284SFlorian Hahn}
68562c19284SFlorian Hahn
68662c19284SFlorian Hahndefine i1 @test_chained_adds_missing_nuw_2(i8 %a, i8 %b) {
68762c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_missing_nuw_2(
68862c19284SFlorian Hahn; CHECK-NEXT:  entry:
68962c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
69062c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
69162c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
69262c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
69362c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2
69462c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add i8 [[ADD_1]], [[B]]
69562c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
69662c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
69762c19284SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
69862c19284SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
69962c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
70062c19284SFlorian Hahn;
70162c19284SFlorian Hahnentry:
70262c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
70362c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
70462c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
70562c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
70662c19284SFlorian Hahn  %add.1 = add nuw i8 %a, 2
70762c19284SFlorian Hahn  %add.2 = add i8 %add.1, %b
70862c19284SFlorian Hahn  %add.3 = add nuw i8 %add.2, %a
70962c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 18
71062c19284SFlorian Hahn  %c.2 = icmp uge i8 %add.3, 19
71162c19284SFlorian Hahn  %res.1 = xor i1 %c.1, %c.2
71262c19284SFlorian Hahn  ret i1 %res.1
71362c19284SFlorian Hahn}
71462c19284SFlorian Hahn
71562c19284SFlorian Hahndefine i1 @test_chained_adds_missing_nuw_3(i8 %a, i8 %b) {
71662c19284SFlorian Hahn; CHECK-LABEL: @test_chained_adds_missing_nuw_3(
71762c19284SFlorian Hahn; CHECK-NEXT:  entry:
71862c19284SFlorian Hahn; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5
71962c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])
72062c19284SFlorian Hahn; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6
72162c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])
72262c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2
72362c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]
72462c19284SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add i8 [[ADD_2]], [[A]]
72562c19284SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18
72662c19284SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19
72762c19284SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
72862c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
72962c19284SFlorian Hahn;
73062c19284SFlorian Hahnentry:
73162c19284SFlorian Hahn  %c.a = icmp uge i8 %a, 5
73262c19284SFlorian Hahn  call void @llvm.assume(i1 %c.a)
73362c19284SFlorian Hahn  %c.b = icmp uge i8 %b, 6
73462c19284SFlorian Hahn  call void @llvm.assume(i1 %c.b)
73562c19284SFlorian Hahn  %add.1 = add nuw i8 %a, 2
73662c19284SFlorian Hahn  %add.2 = add nuw i8 %add.1, %b
73762c19284SFlorian Hahn  %add.3 = add i8 %add.2, %a
73862c19284SFlorian Hahn  %c.1 = icmp uge i8 %add.3, 18
73962c19284SFlorian Hahn  %c.2 = icmp uge i8 %add.3, 19
74062c19284SFlorian Hahn  %res.1 = xor i1 %c.1, %c.2
74162c19284SFlorian Hahn  ret i1 %res.1
74262c19284SFlorian Hahn}
74362c19284SFlorian Hahn
74462c19284SFlorian Hahndeclare void @llvm.assume(i1)
745