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