16778e2f4SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 26778e2f4SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 36778e2f4SFlorian Hahn 4f12684d3SFlorian Hahndeclare void @use(i1) 5067b744dSFlorian Hahndeclare void @llvm.assume(i1) 6f12684d3SFlorian Hahn 7f12684d3SFlorian Hahndefine void @test.not.uge.ult(i8 %start, i8 %high) { 86778e2f4SFlorian Hahn; CHECK-LABEL: @test.not.uge.ult( 96778e2f4SFlorian Hahn; CHECK-NEXT: entry: 106778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], 3 116778e2f4SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]] 126778e2f4SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 136778e2f4SFlorian Hahn; CHECK: if.then: 146778e2f4SFlorian Hahn; CHECK-NEXT: ret void 156778e2f4SFlorian Hahn; CHECK: if.end: 166778e2f4SFlorian Hahn; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]] 176778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_0]]) 186778e2f4SFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = add nsw i8 [[START]], 1 196778e2f4SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]] 206778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 216778e2f4SFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = add nsw i8 [[START]], 2 226778e2f4SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]] 236778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_2]]) 246778e2f4SFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = add nsw i8 [[START]], 3 256778e2f4SFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]] 266778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_3]]) 276778e2f4SFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = add nsw i8 [[START]], 4 286778e2f4SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]] 296778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 306778e2f4SFlorian Hahn; CHECK-NEXT: ret void 316778e2f4SFlorian Hahn; 326778e2f4SFlorian Hahnentry: 336778e2f4SFlorian Hahn %add.ptr.i = add nsw i8 %start, 3 346778e2f4SFlorian Hahn %c.1 = icmp uge i8 %add.ptr.i, %high 356778e2f4SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 366778e2f4SFlorian Hahn 376778e2f4SFlorian Hahnif.then: ; preds = %entry 386778e2f4SFlorian Hahn ret void 396778e2f4SFlorian Hahn 406778e2f4SFlorian Hahnif.end: ; preds = %entry 416778e2f4SFlorian Hahn %t.0 = icmp ult i8 %start, %high 426778e2f4SFlorian Hahn call void @use(i1 %t.0) 436778e2f4SFlorian Hahn %start.1 = add nsw i8 %start, 1 446778e2f4SFlorian Hahn %t.1 = icmp ult i8 %start.1, %high 456778e2f4SFlorian Hahn call void @use(i1 %t.1) 466778e2f4SFlorian Hahn %start.2 = add nsw i8 %start, 2 476778e2f4SFlorian Hahn %t.2 = icmp ult i8 %start.2, %high 486778e2f4SFlorian Hahn call void @use(i1 %t.2) 496778e2f4SFlorian Hahn %start.3 = add nsw i8 %start, 3 506778e2f4SFlorian Hahn %t.3 = icmp ult i8 %start.3, %high 516778e2f4SFlorian Hahn call void @use(i1 %t.3) 526778e2f4SFlorian Hahn %start.4 = add nsw i8 %start, 4 536778e2f4SFlorian Hahn %c.4 = icmp ult i8 %start.4, %high 546778e2f4SFlorian Hahn call void @use(i1 %c.4) 556778e2f4SFlorian Hahn ret void 566778e2f4SFlorian Hahn} 576778e2f4SFlorian Hahn 58f12684d3SFlorian Hahndefine void @test.not.sge.slt(i8 %start, i8 %high) { 596778e2f4SFlorian Hahn; CHECK-LABEL: @test.not.sge.slt( 606778e2f4SFlorian Hahn; CHECK-NEXT: entry: 616778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], 3 626778e2f4SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[ADD_PTR_I]], [[HIGH:%.*]] 636778e2f4SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 646778e2f4SFlorian Hahn; CHECK: if.then: 656778e2f4SFlorian Hahn; CHECK-NEXT: ret void 666778e2f4SFlorian Hahn; CHECK: if.end: 67f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 686778e2f4SFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = add nsw i8 [[START]], 1 69f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 706778e2f4SFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = add nsw i8 [[START]], 2 71f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 726778e2f4SFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = add nsw i8 [[START]], 3 73f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 746778e2f4SFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = add nsw i8 [[START]], 4 756778e2f4SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_4]], [[HIGH]] 766778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 776778e2f4SFlorian Hahn; CHECK-NEXT: ret void 786778e2f4SFlorian Hahn; 796778e2f4SFlorian Hahnentry: 806778e2f4SFlorian Hahn %add.ptr.i = add nsw i8 %start, 3 816778e2f4SFlorian Hahn %c.1 = icmp sge i8 %add.ptr.i, %high 826778e2f4SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 836778e2f4SFlorian Hahn 846778e2f4SFlorian Hahnif.then: ; preds = %entry 856778e2f4SFlorian Hahn ret void 866778e2f4SFlorian Hahn 876778e2f4SFlorian Hahnif.end: ; preds = %entry 886778e2f4SFlorian Hahn %t.0 = icmp slt i8 %start, %high 896778e2f4SFlorian Hahn call void @use(i1 %t.0) 906778e2f4SFlorian Hahn %start.1 = add nsw i8 %start, 1 916778e2f4SFlorian Hahn %t.1 = icmp slt i8 %start.1, %high 926778e2f4SFlorian Hahn call void @use(i1 %t.1) 936778e2f4SFlorian Hahn %start.2 = add nsw i8 %start, 2 946778e2f4SFlorian Hahn %t.2 = icmp slt i8 %start.2, %high 956778e2f4SFlorian Hahn call void @use(i1 %t.2) 966778e2f4SFlorian Hahn %start.3 = add nsw i8 %start, 3 976778e2f4SFlorian Hahn %t.3 = icmp slt i8 %start.3, %high 986778e2f4SFlorian Hahn call void @use(i1 %t.3) 996778e2f4SFlorian Hahn %start.4 = add nsw i8 %start, 4 1006778e2f4SFlorian Hahn %c.4 = icmp slt i8 %start.4, %high 1016778e2f4SFlorian Hahn call void @use(i1 %c.4) 1026778e2f4SFlorian Hahn ret void 1036778e2f4SFlorian Hahn} 1046778e2f4SFlorian Hahn 1056778e2f4SFlorian Hahndefine void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) { 1066778e2f4SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst( 1076778e2f4SFlorian Hahn; CHECK-NEXT: entry: 1086778e2f4SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[A:%.*]], [[C:%.*]] 1096778e2f4SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[C]] 1106778e2f4SFlorian Hahn; CHECK-NEXT: [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]] 1116778e2f4SFlorian Hahn; CHECK-NEXT: br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 1126778e2f4SFlorian Hahn; CHECK: if.then: 1136778e2f4SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0 1146778e2f4SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[B]], 0 1156778e2f4SFlorian Hahn; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[C_2]], [[C_3]] 1166778e2f4SFlorian Hahn; CHECK-NEXT: br i1 [[AND_1]], label [[IF_THEN_2:%.*]], label [[IF_END]] 1176778e2f4SFlorian Hahn; CHECK: if.then.2: 1186778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_0:%.*]] = add nsw i8 [[A]], [[B]] 119f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1206778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i8 [[A]], [[A]] 121f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1226778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i8 [[A]], [[D:%.*]] 1236778e2f4SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[ADD_2]], [[C]] 1246778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 1256778e2f4SFlorian Hahn; CHECK-NEXT: ret void 1266778e2f4SFlorian Hahn; CHECK: if.end: 1276778e2f4SFlorian Hahn; CHECK-NEXT: ret void 1286778e2f4SFlorian Hahn; 1296778e2f4SFlorian Hahnentry: 1306778e2f4SFlorian Hahn %c.0 = icmp sge i8 %a, %c 1316778e2f4SFlorian Hahn %c.1 = icmp sge i8 %b, %c 1326778e2f4SFlorian Hahn %and.0 = and i1 %c.0, %c.1 1336778e2f4SFlorian Hahn br i1 %and.0, label %if.then, label %if.end 1346778e2f4SFlorian Hahn 1356778e2f4SFlorian Hahnif.then: ; preds = %entry 1366778e2f4SFlorian Hahn %c.2 = icmp sge i8 %a, 0 1376778e2f4SFlorian Hahn %c.3 = icmp sge i8 %b, 0 1386778e2f4SFlorian Hahn %and.1 = and i1 %c.2, %c.3 1396778e2f4SFlorian Hahn br i1 %and.1, label %if.then.2, label %if.end 1406778e2f4SFlorian Hahn 1416778e2f4SFlorian Hahnif.then.2: 1426778e2f4SFlorian Hahn %add.0 = add nsw i8 %a, %b 1436778e2f4SFlorian Hahn %t.0 = icmp sge i8 %add.0, %c 1446778e2f4SFlorian Hahn call void @use(i1 %t.0) 1456778e2f4SFlorian Hahn %add.1 = add nsw i8 %a, %a 1466778e2f4SFlorian Hahn %t.1 = icmp sge i8 %add.0, %c 1476778e2f4SFlorian Hahn call void @use(i1 %t.1) 1486778e2f4SFlorian Hahn %add.2 = add nsw i8 %a, %d 1496778e2f4SFlorian Hahn %c.4 = icmp sge i8 %add.2, %c 1506778e2f4SFlorian Hahn call void @use(i1 %c.4) 1516778e2f4SFlorian Hahn ret void 1526778e2f4SFlorian Hahn 1536778e2f4SFlorian Hahnif.end: ; preds = %entry 1546778e2f4SFlorian Hahn ret void 1556778e2f4SFlorian Hahn} 1566778e2f4SFlorian Hahn 1576778e2f4SFlorian Hahndefine void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) { 1586778e2f4SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst.no.null.check( 1596778e2f4SFlorian Hahn; CHECK-NEXT: entry: 1606778e2f4SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[A:%.*]], [[C:%.*]] 1616778e2f4SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[C]] 1626778e2f4SFlorian Hahn; CHECK-NEXT: [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]] 1636778e2f4SFlorian Hahn; CHECK-NEXT: br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 1646778e2f4SFlorian Hahn; CHECK: if.then: 1656778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_0:%.*]] = add nsw i8 [[A]], [[B]] 1666778e2f4SFlorian Hahn; CHECK-NEXT: [[T_0:%.*]] = icmp sge i8 [[ADD_0]], [[C]] 1676778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_0]]) 1686778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i8 [[A]], [[A]] 1696778e2f4SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp sge i8 [[ADD_0]], [[C]] 1706778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 1716778e2f4SFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i8 [[A]], [[D:%.*]] 1726778e2f4SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[ADD_2]], [[C]] 1736778e2f4SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 1746778e2f4SFlorian Hahn; CHECK-NEXT: ret void 1756778e2f4SFlorian Hahn; CHECK: if.end: 1766778e2f4SFlorian Hahn; CHECK-NEXT: ret void 1776778e2f4SFlorian Hahn; 1786778e2f4SFlorian Hahnentry: 1796778e2f4SFlorian Hahn %c.0 = icmp sge i8 %a, %c 1806778e2f4SFlorian Hahn %c.1 = icmp sge i8 %b, %c 1816778e2f4SFlorian Hahn %and.0 = and i1 %c.0, %c.1 1826778e2f4SFlorian Hahn br i1 %and.0, label %if.then, label %if.end 1836778e2f4SFlorian Hahn 1846778e2f4SFlorian Hahnif.then: ; preds = %entry 1856778e2f4SFlorian Hahn %add.0 = add nsw i8 %a, %b 1866778e2f4SFlorian Hahn %t.0 = icmp sge i8 %add.0, %c 1876778e2f4SFlorian Hahn call void @use(i1 %t.0) 1886778e2f4SFlorian Hahn %add.1 = add nsw i8 %a, %a 1896778e2f4SFlorian Hahn %t.1 = icmp sge i8 %add.0, %c 1906778e2f4SFlorian Hahn call void @use(i1 %t.1) 1916778e2f4SFlorian Hahn %add.2 = add nsw i8 %a, %d 1926778e2f4SFlorian Hahn %c.4 = icmp sge i8 %add.2, %c 1936778e2f4SFlorian Hahn call void @use(i1 %c.4) 1946778e2f4SFlorian Hahn ret void 1956778e2f4SFlorian Hahn 1966778e2f4SFlorian Hahnif.end: ; preds = %entry 1976778e2f4SFlorian Hahn ret void 1986778e2f4SFlorian Hahn} 1996778e2f4SFlorian Hahn 200f12684d3SFlorian Hahndefine void @test.sge.slt.add.neg(i8 %start, i8 %high) { 201f12684d3SFlorian Hahn; CHECK-LABEL: @test.sge.slt.add.neg( 202f12684d3SFlorian Hahn; CHECK-NEXT: entry: 203f12684d3SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], -3 204f12684d3SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[ADD_PTR_I]], [[HIGH:%.*]] 205f12684d3SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 206f12684d3SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[START]], [[HIGH]] 207f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 208f12684d3SFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = add nsw i8 [[START]], 1 209f12684d3SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[START_1]], [[HIGH]] 210f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 211f12684d3SFlorian Hahn; CHECK-NEXT: [[START_2:%.*]] = add nsw i8 [[START]], -2 212f12684d3SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[START_2]], [[HIGH]] 213f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 214f12684d3SFlorian Hahn; CHECK-NEXT: [[START_3:%.*]] = add nsw i8 [[START]], -3 215f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 216f12684d3SFlorian Hahn; CHECK-NEXT: [[START_4:%.*]] = add nsw i8 [[START]], -4 217f12684d3SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 218f12684d3SFlorian Hahn; CHECK-NEXT: ret void 219f12684d3SFlorian Hahn; 220f12684d3SFlorian Hahnentry: 221f12684d3SFlorian Hahn %add.ptr.i = add nsw i8 %start, -3 222f12684d3SFlorian Hahn %c.1 = icmp slt i8 %add.ptr.i, %high 223f12684d3SFlorian Hahn call void @llvm.assume(i1 %c.1) 224f12684d3SFlorian Hahn %c.2 = icmp slt i8 %start, %high 225f12684d3SFlorian Hahn call void @use(i1 %c.2) 226f12684d3SFlorian Hahn %start.1 = add nsw i8 %start, 1 227f12684d3SFlorian Hahn %c.3 = icmp slt i8 %start.1, %high 228f12684d3SFlorian Hahn call void @use(i1 %c.3) 229f12684d3SFlorian Hahn %start.2 = add nsw i8 %start, -2 230f12684d3SFlorian Hahn %c.4 = icmp slt i8 %start.2, %high 231f12684d3SFlorian Hahn call void @use(i1 %c.4) 232f12684d3SFlorian Hahn %start.3 = add nsw i8 %start, -3 233f12684d3SFlorian Hahn %t.1 = icmp slt i8 %start.3, %high 234f12684d3SFlorian Hahn call void @use(i1 %t.1) 235f12684d3SFlorian Hahn %start.4 = add nsw i8 %start, -4 236f12684d3SFlorian Hahn %t.2 = icmp slt i8 %start.4, %high 237f12684d3SFlorian Hahn call void @use(i1 %t.2) 238f12684d3SFlorian Hahn ret void 239f12684d3SFlorian Hahn} 240f12684d3SFlorian Hahn 241067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1(i8 %start, i8 %high) { 242067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1( 243067b744dSFlorian Hahn; CHECK-NEXT: entry: 244067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 245067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 246067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 247067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 248067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 249a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 250067b744dSFlorian Hahn; 251067b744dSFlorian Hahnentry: 252067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 253067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 254067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 255067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 256067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 257067b744dSFlorian Hahn 258067b744dSFlorian Hahn %t = icmp ult i16 %start.ext, %high.ext 259067b744dSFlorian Hahn ret i1 %t 260067b744dSFlorian Hahn} 261067b744dSFlorian Hahn 262067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_assume_pos(i8 %start, i8 %high) { 263067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_assume_pos( 264067b744dSFlorian Hahn; CHECK-NEXT: entry: 265067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 266067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 267067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], 3 268067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 269067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 270a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 271067b744dSFlorian Hahn; 272067b744dSFlorian Hahnentry: 273067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 274067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 275067b744dSFlorian Hahn %add = add nsw i8 %start, 3 276067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 277067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 278067b744dSFlorian Hahn 279067b744dSFlorian Hahn %t = icmp ult i8 %start, %high 280067b744dSFlorian Hahn ret i1 %t 281067b744dSFlorian Hahn} 282067b744dSFlorian Hahn 283067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_no_assume_pos(i8 %start, i8 %high) { 284067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_no_assume_pos( 285067b744dSFlorian Hahn; CHECK-NEXT: entry: 286067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 287067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 288067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 289067b744dSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START]], [[HIGH]] 290067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 291067b744dSFlorian Hahn; 292067b744dSFlorian Hahnentry: 293067b744dSFlorian Hahn %add = add nsw i8 %start, 3 294067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 295067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 296067b744dSFlorian Hahn 297067b744dSFlorian Hahn %t = icmp ult i8 %start, %high 298067b744dSFlorian Hahn ret i1 %t 299067b744dSFlorian Hahn} 300067b744dSFlorian Hahn 301067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_cmp_no_ext(i8 %start, i8 %high) { 302067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_cmp_no_ext( 303067b744dSFlorian Hahn; CHECK-NEXT: entry: 304067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 305067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 306067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 307067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 308067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 309a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 310067b744dSFlorian Hahn; 311067b744dSFlorian Hahnentry: 312067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 313067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 314067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 315067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 316067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 317067b744dSFlorian Hahn 318067b744dSFlorian Hahn %t = icmp ult i8 %start, %high 319067b744dSFlorian Hahn ret i1 %t 320067b744dSFlorian Hahn} 321067b744dSFlorian Hahn 322067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2(i8 %start, i8 %high) { 323067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2( 324067b744dSFlorian Hahn; CHECK-NEXT: entry: 325067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 326067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 327067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 328067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 329067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 330a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 false 331067b744dSFlorian Hahn; 332067b744dSFlorian Hahnentry: 333067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 334067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 335067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 336067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 337067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 338067b744dSFlorian Hahn 339067b744dSFlorian Hahn %f = icmp uge i16 %start.ext, %high.ext 340067b744dSFlorian Hahn ret i1 %f 341067b744dSFlorian Hahn} 342067b744dSFlorian Hahn 343067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2_assume_pos(i8 %start, i8 %high) { 344067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2_assume_pos( 345067b744dSFlorian Hahn; CHECK-NEXT: entry: 346067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 347067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 348067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], 3 349067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 350067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 351a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 false 352067b744dSFlorian Hahn; 353067b744dSFlorian Hahnentry: 354067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 355067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 356067b744dSFlorian Hahn %add = add nsw i8 %start, 3 357067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 358067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 359067b744dSFlorian Hahn 360067b744dSFlorian Hahn %f = icmp uge i8 %start, %high 361067b744dSFlorian Hahn ret i1 %f 362067b744dSFlorian Hahn} 363067b744dSFlorian Hahn 364067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2_cmp_no_ext(i8 %start, i8 %high) { 365067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2_cmp_no_ext( 366067b744dSFlorian Hahn; CHECK-NEXT: entry: 367067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 368067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 369067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 370067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 371067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 372a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 false 373067b744dSFlorian Hahn; 374067b744dSFlorian Hahnentry: 375067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 376067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 377067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 378067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 379067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 380067b744dSFlorian Hahn 381067b744dSFlorian Hahn %c = icmp uge i8 %start, %high 382067b744dSFlorian Hahn ret i1 %c 383067b744dSFlorian Hahn} 384067b744dSFlorian Hahn 385067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_3(i8 %start, i8 %high) { 386067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_3( 387067b744dSFlorian Hahn; CHECK-NEXT: entry: 388067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 389067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 390067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 391067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 392067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 393067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i16 [[START_EXT]], 4 394067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[ADD_4]], [[HIGH_EXT]] 395067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 396067b744dSFlorian Hahn; 397067b744dSFlorian Hahnentry: 398067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 399067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 400067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 401067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 402067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 403067b744dSFlorian Hahn 404067b744dSFlorian Hahn %add.4 = add nsw i16 %start.ext, 4 405067b744dSFlorian Hahn %c = icmp ult i16 %add.4, %high.ext 406067b744dSFlorian Hahn ret i1 %c 407067b744dSFlorian Hahn} 408067b744dSFlorian Hahn 409067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_3_assume_pos(i8 %start, i8 %high) { 410067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_3_assume_pos( 411067b744dSFlorian Hahn; CHECK-NEXT: entry: 412067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 413067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 414067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], 3 415067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 416067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 417067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i8 [[START]], 4 418067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[ADD_4]], [[HIGH]] 419067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 420067b744dSFlorian Hahn; 421067b744dSFlorian Hahnentry: 422067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 423067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 424067b744dSFlorian Hahn %add = add nsw i8 %start, 3 425067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 426067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 427067b744dSFlorian Hahn 428067b744dSFlorian Hahn %add.4 = add nsw i8 %start, 4 429067b744dSFlorian Hahn %c = icmp ult i8 %add.4, %high 430067b744dSFlorian Hahn ret i1 %c 431067b744dSFlorian Hahn} 432067b744dSFlorian Hahn 433067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_4(i8 %start, i8 %high) { 434067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_4( 435067b744dSFlorian Hahn; CHECK-NEXT: entry: 436067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 437067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 438067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 439067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 440067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 441067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i16 [[START_EXT]], 2 442a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 443067b744dSFlorian Hahn; 444067b744dSFlorian Hahnentry: 445067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 446067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 447067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 448067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 449067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 450067b744dSFlorian Hahn 451067b744dSFlorian Hahn %add.2 = add nsw i16 %start.ext, 2 452067b744dSFlorian Hahn %c = icmp ult i16 %add.2, %high.ext 453067b744dSFlorian Hahn ret i1 %c 454067b744dSFlorian Hahn} 455067b744dSFlorian Hahn 456067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_4_assume_pos(i8 %start, i8 %high) { 457067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_4_assume_pos( 458067b744dSFlorian Hahn; CHECK-NEXT: entry: 459067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 460067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 461067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], 3 462067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 463067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 464067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i8 [[START]], 2 465a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 466067b744dSFlorian Hahn; 467067b744dSFlorian Hahnentry: 468067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 469067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 470067b744dSFlorian Hahn %add = add nsw i8 %start, 3 471067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 472067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 473067b744dSFlorian Hahn 474067b744dSFlorian Hahn %add.2 = add nsw i8 %start, 2 475067b744dSFlorian Hahn %c = icmp ult i8 %add.2, %high 476067b744dSFlorian Hahn ret i1 %c 477067b744dSFlorian Hahn} 478067b744dSFlorian Hahn 479067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_neg_5(i8 %start, i8 %high) { 480067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_neg_5( 481067b744dSFlorian Hahn; CHECK-NEXT: entry: 482067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 483067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 484067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3 485067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 486067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 487067b744dSFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add nsw i16 [[START_EXT]], -2 488067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[SUB_2]], [[HIGH_EXT]] 489067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 490067b744dSFlorian Hahn; 491067b744dSFlorian Hahnentry: 492067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 493067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 494067b744dSFlorian Hahn %add.ext = add nsw i16 %start.ext, 3 495067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 496067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 497067b744dSFlorian Hahn 498067b744dSFlorian Hahn %sub.2 = add nsw i16 %start.ext, -2 499067b744dSFlorian Hahn %c = icmp ult i16 %sub.2, %high.ext 500067b744dSFlorian Hahn ret i1 %c 501067b744dSFlorian Hahn} 502067b744dSFlorian Hahn 503067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_neg_5_assume_pos(i8 %start, i8 %high) { 504067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_neg_5_assume_pos( 505067b744dSFlorian Hahn; CHECK-NEXT: entry: 506067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 507067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 508067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], 3 509067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 510067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 511067b744dSFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add nsw i8 [[START]], -2 512067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[SUB_2]], [[HIGH]] 513067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 514067b744dSFlorian Hahn; 515067b744dSFlorian Hahnentry: 516067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 517067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 518067b744dSFlorian Hahn %add = add nsw i8 %start, 3 519067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 520067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 521067b744dSFlorian Hahn 522067b744dSFlorian Hahn %sub.2 = add nsw i8 %start, -2 523067b744dSFlorian Hahn %c = icmp ult i8 %sub.2, %high 524067b744dSFlorian Hahn ret i1 %c 525067b744dSFlorian Hahn} 526067b744dSFlorian Hahn 527067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_pos_6(i8 %start, i8 %high) { 528067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_pos_6( 529067b744dSFlorian Hahn; CHECK-NEXT: entry: 530067b744dSFlorian Hahn; CHECK-NEXT: [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16 531067b744dSFlorian Hahn; CHECK-NEXT: [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16 532067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_EXT:%.*]] = add i16 [[START_EXT]], 3 533067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]] 534067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 535067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add i16 [[START_EXT]], 2 536067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[ADD_2]], [[HIGH_EXT]] 537067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 538067b744dSFlorian Hahn; 539067b744dSFlorian Hahnentry: 540067b744dSFlorian Hahn %high.ext = zext i8 %high to i16 541067b744dSFlorian Hahn %start.ext = zext i8 %start to i16 542067b744dSFlorian Hahn %add.ext = add i16 %start.ext, 3 543067b744dSFlorian Hahn %c.1 = icmp ult i16 %add.ext, %high.ext 544067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 545067b744dSFlorian Hahn 546067b744dSFlorian Hahn %add.2 = add i16 %start.ext, 2 547067b744dSFlorian Hahn %c = icmp ult i16 %add.2, %high.ext 548067b744dSFlorian Hahn ret i1 %c 549067b744dSFlorian Hahn} 550067b744dSFlorian Hahn 551067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_pos_6_assume_pos(i8 %start, i8 %high) { 552067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_pos_6_assume_pos( 553067b744dSFlorian Hahn; CHECK-NEXT: entry: 554067b744dSFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 555067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 556067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START]], 3 557067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 558067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 559067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_2:%.*]] = add i8 [[START]], 2 560067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[ADD_2]], [[HIGH]] 561067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 562067b744dSFlorian Hahn; 563067b744dSFlorian Hahnentry: 564067b744dSFlorian Hahn %start.pos = icmp sge i8 %start, 0 565067b744dSFlorian Hahn call void @llvm.assume(i1 %start.pos) 566067b744dSFlorian Hahn %add = add i8 %start, 3 567067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 568067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 569067b744dSFlorian Hahn 570067b744dSFlorian Hahn %add.2 = add i8 %start, 2 571067b744dSFlorian Hahn %c = icmp ult i8 %add.2, %high 572067b744dSFlorian Hahn ret i1 %c 573067b744dSFlorian Hahn} 574067b744dSFlorian Hahn 575067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_var_7(i8 %start, i8 %off, i8 %high) { 576067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_7( 577067b744dSFlorian Hahn; CHECK-NEXT: entry: 578067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], [[OFF:%.*]] 579067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 580067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 581067b744dSFlorian Hahn; CHECK-NEXT: [[OFF_POS:%.*]] = icmp sge i8 [[OFF]], 0 582067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_POS]]) 583067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[START]], [[HIGH]] 584067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 585067b744dSFlorian Hahn; 586067b744dSFlorian Hahnentry: 587067b744dSFlorian Hahn %add = add nsw i8 %start, %off 588067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 589067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 590067b744dSFlorian Hahn %off.pos = icmp sge i8 %off, 0 591067b744dSFlorian Hahn call void @llvm.assume(i1 %off.pos) 592067b744dSFlorian Hahn 593067b744dSFlorian Hahn %c = icmp ult i8 %start, %high 594067b744dSFlorian Hahn ret i1 %c 595067b744dSFlorian Hahn} 596067b744dSFlorian Hahn 597067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_var_7(i8 %start, i8 %off, i8 %high) { 598067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_var_7( 599067b744dSFlorian Hahn; CHECK-NEXT: entry: 600067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], [[OFF:%.*]] 601067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 602067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 603067b744dSFlorian Hahn; CHECK-NEXT: [[OFF_POS:%.*]] = icmp sge i8 [[OFF]], 0 604067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_POS]]) 605067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[START]], [[HIGH]] 606067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 607067b744dSFlorian Hahn; 608067b744dSFlorian Hahnentry: 609067b744dSFlorian Hahn %add = add i8 %start, %off 610067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 611067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 612067b744dSFlorian Hahn %off.pos = icmp sge i8 %off, 0 613067b744dSFlorian Hahn call void @llvm.assume(i1 %off.pos) 614067b744dSFlorian Hahn 615067b744dSFlorian Hahn %c = icmp ult i8 %start, %high 616067b744dSFlorian Hahn ret i1 %c 617067b744dSFlorian Hahn} 618067b744dSFlorian Hahn 619067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_var_8(i8 %start, i8 %off.1, i8 %off.2, i8 %high) { 620067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_8( 621067b744dSFlorian Hahn; CHECK-NEXT: entry: 622067b744dSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], [[OFF_2:%.*]] 623067b744dSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 624067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 625067b744dSFlorian Hahn; CHECK-NEXT: [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0 626067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_POS]]) 627067b744dSFlorian Hahn; CHECK-NEXT: [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0 628067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_2_POS]]) 629067b744dSFlorian Hahn; CHECK-NEXT: [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]] 630067b744dSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_ULT]]) 631067b744dSFlorian Hahn; CHECK-NEXT: [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]] 632067b744dSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]] 633067b744dSFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 634067b744dSFlorian Hahn; 635067b744dSFlorian Hahnentry: 636067b744dSFlorian Hahn %add = add nsw i8 %start, %off.2 637067b744dSFlorian Hahn %c.1 = icmp ult i8 %add, %high 638067b744dSFlorian Hahn call void @llvm.assume(i1 %c.1) 639067b744dSFlorian Hahn %off.1.pos = icmp sge i8 %off.1, 0 640067b744dSFlorian Hahn call void @llvm.assume(i1 %off.1.pos) 641067b744dSFlorian Hahn %off.2.pos = icmp sge i8 %off.2, 0 642067b744dSFlorian Hahn call void @llvm.assume(i1 %off.2.pos) 643067b744dSFlorian Hahn %off.1.ult = icmp ult i8 %off.1, %off.2 644067b744dSFlorian Hahn call void @llvm.assume(i1 %off.1.ult) 645067b744dSFlorian Hahn 646067b744dSFlorian Hahn %add.off.2 = add nsw i8 %start, %off.1 647067b744dSFlorian Hahn %c = icmp ult i8 %add.off.2, %high 648067b744dSFlorian Hahn ret i1 %c 649067b744dSFlorian Hahn} 650a4635ec7SFlorian Hahn 651a4635ec7SFlorian Hahndefine i1 @test_ult_add_nsw_var_8_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) { 652a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_8_all_pos( 653a4635ec7SFlorian Hahn; CHECK-NEXT: entry: 654a4635ec7SFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 655a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 656a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], [[OFF_2:%.*]] 657a4635ec7SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 658a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 659a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0 660a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_POS]]) 661a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0 662a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_2_POS]]) 663a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]] 664a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_ULT]]) 665a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]] 666a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 true 667a4635ec7SFlorian Hahn; 668a4635ec7SFlorian Hahnentry: 669a4635ec7SFlorian Hahn %start.pos = icmp sge i8 %start, 0 670a4635ec7SFlorian Hahn call void @llvm.assume(i1 %start.pos) 671a4635ec7SFlorian Hahn %add = add nsw i8 %start, %off.2 672a4635ec7SFlorian Hahn %c.1 = icmp ult i8 %add, %high 673a4635ec7SFlorian Hahn call void @llvm.assume(i1 %c.1) 674a4635ec7SFlorian Hahn %off.1.pos = icmp sge i8 %off.1, 0 675a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.1.pos) 676a4635ec7SFlorian Hahn %off.2.pos = icmp sge i8 %off.2, 0 677a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.2.pos) 678a4635ec7SFlorian Hahn %off.1.ult = icmp ult i8 %off.1, %off.2 679a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.1.ult) 680a4635ec7SFlorian Hahn 681a4635ec7SFlorian Hahn %add.off.2 = add nsw i8 %start, %off.1 682a4635ec7SFlorian Hahn %c = icmp ult i8 %add.off.2, %high 683a4635ec7SFlorian Hahn ret i1 %c 684a4635ec7SFlorian Hahn} 685a4635ec7SFlorian Hahn 686a4635ec7SFlorian Hahndefine i1 @test_ult_add_no_nsw_var_8_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) { 687a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_var_8_all_pos( 688a4635ec7SFlorian Hahn; CHECK-NEXT: entry: 689a4635ec7SFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 690a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 691a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START]], [[OFF_2:%.*]] 692a4635ec7SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 693a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 694a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0 695a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_POS]]) 696a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0 697a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_2_POS]]) 698a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]] 699a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_ULT]]) 700a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]] 701a4635ec7SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]] 702a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 703a4635ec7SFlorian Hahn; 704a4635ec7SFlorian Hahnentry: 705a4635ec7SFlorian Hahn %start.pos = icmp sge i8 %start, 0 706a4635ec7SFlorian Hahn call void @llvm.assume(i1 %start.pos) 707a4635ec7SFlorian Hahn %add = add i8 %start, %off.2 708a4635ec7SFlorian Hahn %c.1 = icmp ult i8 %add, %high 709a4635ec7SFlorian Hahn call void @llvm.assume(i1 %c.1) 710a4635ec7SFlorian Hahn %off.1.pos = icmp sge i8 %off.1, 0 711a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.1.pos) 712a4635ec7SFlorian Hahn %off.2.pos = icmp sge i8 %off.2, 0 713a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.2.pos) 714a4635ec7SFlorian Hahn %off.1.ult = icmp ult i8 %off.1, %off.2 715a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.1.ult) 716a4635ec7SFlorian Hahn 717a4635ec7SFlorian Hahn %add.off.2 = add nsw i8 %start, %off.1 718a4635ec7SFlorian Hahn %c = icmp ult i8 %add.off.2, %high 719a4635ec7SFlorian Hahn ret i1 %c 720a4635ec7SFlorian Hahn} 721a4635ec7SFlorian Hahn 722a4635ec7SFlorian Hahndefine i1 @test_ult_add_nsw_var_9_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) { 723a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_9_all_pos( 724a4635ec7SFlorian Hahn; CHECK-NEXT: entry: 725a4635ec7SFlorian Hahn; CHECK-NEXT: [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0 726a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[START_POS]]) 727a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START]], [[OFF_2:%.*]] 728a4635ec7SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]] 729a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 730a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0 731a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_1_POS]]) 732a4635ec7SFlorian Hahn; CHECK-NEXT: [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0 733a4635ec7SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[OFF_2_POS]]) 734a4635ec7SFlorian Hahn; CHECK-NEXT: [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]] 735a4635ec7SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]] 736a4635ec7SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 737a4635ec7SFlorian Hahn; 738a4635ec7SFlorian Hahnentry: 739a4635ec7SFlorian Hahn %start.pos = icmp sge i8 %start, 0 740a4635ec7SFlorian Hahn call void @llvm.assume(i1 %start.pos) 741a4635ec7SFlorian Hahn %add = add nsw i8 %start, %off.2 742a4635ec7SFlorian Hahn %c.1 = icmp ult i8 %add, %high 743a4635ec7SFlorian Hahn call void @llvm.assume(i1 %c.1) 744a4635ec7SFlorian Hahn %off.1.pos = icmp sge i8 %off.1, 0 745a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.1.pos) 746a4635ec7SFlorian Hahn %off.2.pos = icmp sge i8 %off.2, 0 747a4635ec7SFlorian Hahn call void @llvm.assume(i1 %off.2.pos) 748a4635ec7SFlorian Hahn 749a4635ec7SFlorian Hahn %add.off.2 = add nsw i8 %start, %off.1 750a4635ec7SFlorian Hahn %c = icmp ult i8 %add.off.2, %high 751a4635ec7SFlorian Hahn ret i1 %c 752a4635ec7SFlorian Hahn} 753b0fb7161SFlorian Hahn 754b0fb7161SFlorian Hahndefine i1 @add_neg_1_known_sge_ult_1(i32 %a) { 755b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_known_sge_ult_1( 756b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 757b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 1 758b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 759b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -1 760b0fb7161SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[SUB]], [[A]] 761b0fb7161SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 762b0fb7161SFlorian Hahn; 763b0fb7161SFlorian Hahnentry: 764b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 1 765b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 766b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -1 767b0fb7161SFlorian Hahn %c = icmp ult i32 %sub, %a 768b0fb7161SFlorian Hahn ret i1 %c 769b0fb7161SFlorian Hahn} 770b0fb7161SFlorian Hahn 771b0fb7161SFlorian Hahndefine i1 @add_neg_1_known_sge_uge_1(i32 %a) { 772b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_known_sge_uge_1( 773b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 774b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 1 775b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 776b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -1 777*98e016d9SFlorian Hahn; CHECK-NEXT: ret i1 true 778b0fb7161SFlorian Hahn; 779b0fb7161SFlorian Hahnentry: 780b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 1 781b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 782b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -1 783b0fb7161SFlorian Hahn %c = icmp uge i32 %sub, 0 784b0fb7161SFlorian Hahn ret i1 %c 785b0fb7161SFlorian Hahn} 786b0fb7161SFlorian Hahn 787b0fb7161SFlorian Hahndefine i1 @add_neg_1_not_known_sge_ult_1(i32 %a) { 788b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_not_known_sge_ult_1( 789b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 790b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 0 791b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 792b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -1 793b0fb7161SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[SUB]], [[A]] 794b0fb7161SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 795b0fb7161SFlorian Hahn; 796b0fb7161SFlorian Hahnentry: 797b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 0 798b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 799b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -1 800b0fb7161SFlorian Hahn %c = icmp ult i32 %sub, %a 801b0fb7161SFlorian Hahn ret i1 %c 802b0fb7161SFlorian Hahn} 803b0fb7161SFlorian Hahn 804b0fb7161SFlorian Hahndefine i1 @add_neg_1_not_known_sge_uge_1(i32 %a) { 805b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_not_known_sge_uge_1( 806b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 807b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 0 808b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 809b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -1 810*98e016d9SFlorian Hahn; CHECK-NEXT: ret i1 true 811b0fb7161SFlorian Hahn; 812b0fb7161SFlorian Hahnentry: 813b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 0 814b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 815b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -1 816b0fb7161SFlorian Hahn %c = icmp uge i32 %sub, 0 817b0fb7161SFlorian Hahn ret i1 %c 818b0fb7161SFlorian Hahn} 819b0fb7161SFlorian Hahn 820b0fb7161SFlorian Hahndefine i1 @add_neg_3_known_sge_ult_1(i32 %a) { 821b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_known_sge_ult_1( 822b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 823b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 3 824b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 825b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -3 826b0fb7161SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[SUB]], [[A]] 827b0fb7161SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 828b0fb7161SFlorian Hahn; 829b0fb7161SFlorian Hahnentry: 830b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 3 831b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 832b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -3 833b0fb7161SFlorian Hahn %c = icmp ult i32 %sub, %a 834b0fb7161SFlorian Hahn ret i1 %c 835b0fb7161SFlorian Hahn} 836b0fb7161SFlorian Hahn 837b0fb7161SFlorian Hahndefine i1 @add_neg_3_known_sge_uge_1(i32 %a) { 838b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_known_sge_uge_1( 839b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 840b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 4 841b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 842b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -3 843*98e016d9SFlorian Hahn; CHECK-NEXT: ret i1 true 844b0fb7161SFlorian Hahn; 845b0fb7161SFlorian Hahnentry: 846b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 4 847b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 848b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -3 849b0fb7161SFlorian Hahn %c = icmp uge i32 %sub, 0 850b0fb7161SFlorian Hahn ret i1 %c 851b0fb7161SFlorian Hahn} 852b0fb7161SFlorian Hahn 853b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_ult_1(i32 %a) { 854b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_ult_1( 855b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 856b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 2 857b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 858b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -3 859b0fb7161SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[SUB]], [[A]] 860b0fb7161SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 861b0fb7161SFlorian Hahn; 862b0fb7161SFlorian Hahnentry: 863b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 2 864b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 865b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -3 866b0fb7161SFlorian Hahn %c = icmp ult i32 %sub, %a 867b0fb7161SFlorian Hahn ret i1 %c 868b0fb7161SFlorian Hahn} 869b0fb7161SFlorian Hahn 870b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_uge_1(i32 %a) { 871b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_uge_1( 872b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 873b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 2 874b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 875b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -3 876*98e016d9SFlorian Hahn; CHECK-NEXT: ret i1 true 877b0fb7161SFlorian Hahn; 878b0fb7161SFlorian Hahnentry: 879b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, 2 880b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 881b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -3 882b0fb7161SFlorian Hahn %c = icmp uge i32 %sub, 0 883b0fb7161SFlorian Hahn ret i1 %c 884b0fb7161SFlorian Hahn} 885b0fb7161SFlorian Hahn 886b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_ult_2(i32 %a, i32 %b) { 887b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_ult_2( 888b0fb7161SFlorian Hahn; CHECK-NEXT: entry: 889b0fb7161SFlorian Hahn; CHECK-NEXT: [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], [[B:%.*]] 890b0fb7161SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE]]) 891b0fb7161SFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[A]], -3 892b0fb7161SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[SUB]], [[A]] 893b0fb7161SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 894b0fb7161SFlorian Hahn; 895b0fb7161SFlorian Hahnentry: 896b0fb7161SFlorian Hahn %a.sge = icmp sge i32 %a, %b 897b0fb7161SFlorian Hahn call void @llvm.assume(i1 %a.sge) 898b0fb7161SFlorian Hahn %sub = add nsw i32 %a, -3 899b0fb7161SFlorian Hahn %c = icmp ult i32 %sub, %a 900b0fb7161SFlorian Hahn ret i1 %c 901b0fb7161SFlorian Hahn} 902