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