@@ -1464,3 +1464,107 @@ entry:
14641464 %cmp = icmp slt i8 %mul1 , %mul2
14651465 ret i1 %cmp
14661466}
1467+
1468+ define i1 @test_icmp_slt_mul_known_sgt (i64 %x , i64 %z ) {
1469+ ; CHECK-LABEL: @test_icmp_slt_mul_known_sgt(
1470+ ; CHECK-NEXT: entry:
1471+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[Z:%.*]], 0
1472+ ; CHECK-NEXT: ret i1 [[CMP]]
1473+ ;
1474+ entry:
1475+ %y = add nsw i64 %x , 1
1476+ %mul1 = mul nsw i64 %x , %z
1477+ %mul2 = mul nsw i64 %y , %z
1478+ %cmp = icmp slt i64 %mul1 , %mul2
1479+ ret i1 %cmp
1480+ }
1481+
1482+ define i1 @test_icmp_sle_mul_known_sgt (i64 %x , i64 %z ) {
1483+ ; CHECK-LABEL: @test_icmp_sle_mul_known_sgt(
1484+ ; CHECK-NEXT: entry:
1485+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[Z:%.*]], -1
1486+ ; CHECK-NEXT: ret i1 [[CMP]]
1487+ ;
1488+ entry:
1489+ %y = add nsw i64 %x , 1
1490+ %mul1 = mul nsw i64 %x , %z
1491+ %mul2 = mul nsw i64 %y , %z
1492+ %cmp = icmp sle i64 %mul1 , %mul2
1493+ ret i1 %cmp
1494+ }
1495+
1496+ define i1 @test_icmp_mul_known_slt (i64 %x , i64 %z ) {
1497+ ; CHECK-LABEL: @test_icmp_mul_known_slt(
1498+ ; CHECK-NEXT: entry:
1499+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[Z:%.*]], 0
1500+ ; CHECK-NEXT: ret i1 [[CMP]]
1501+ ;
1502+ entry:
1503+ %y = add nsw i64 %x , 1
1504+ %mul1 = mul nsw i64 %x , %z
1505+ %mul2 = mul nsw i64 %y , %z
1506+ %cmp = icmp slt i64 %mul2 , %mul1
1507+ ret i1 %cmp
1508+ }
1509+
1510+ define i1 @test_icmp_slt_mul_known_sgt_commuted1 (i64 %x , i64 %z ) {
1511+ ; CHECK-LABEL: @test_icmp_slt_mul_known_sgt_commuted1(
1512+ ; CHECK-NEXT: entry:
1513+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[Z:%.*]], 0
1514+ ; CHECK-NEXT: ret i1 [[CMP]]
1515+ ;
1516+ entry:
1517+ %y = add nsw i64 %x , 1
1518+ %mul1 = mul nsw i64 %z , %x
1519+ %mul2 = mul nsw i64 %y , %z
1520+ %cmp = icmp slt i64 %mul1 , %mul2
1521+ ret i1 %cmp
1522+ }
1523+
1524+ define i1 @test_icmp_slt_mul_known_sgt_commuted2 (i64 %x , i64 %z ) {
1525+ ; CHECK-LABEL: @test_icmp_slt_mul_known_sgt_commuted2(
1526+ ; CHECK-NEXT: entry:
1527+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[Z:%.*]], 0
1528+ ; CHECK-NEXT: ret i1 [[CMP]]
1529+ ;
1530+ entry:
1531+ %y = add nsw i64 %x , 1
1532+ %mul1 = mul nsw i64 %x , %z
1533+ %mul2 = mul nsw i64 %z , %y
1534+ %cmp = icmp slt i64 %mul1 , %mul2
1535+ ret i1 %cmp
1536+ }
1537+
1538+ define i1 @test_icmp_slt_mul_unknown (i64 %x , i64 %z ) {
1539+ ; CHECK-LABEL: @test_icmp_slt_mul_unknown(
1540+ ; CHECK-NEXT: entry:
1541+ ; CHECK-NEXT: [[Y:%.*]] = add i64 [[X:%.*]], 1
1542+ ; CHECK-NEXT: [[MUL1:%.*]] = mul nsw i64 [[X]], [[Z:%.*]]
1543+ ; CHECK-NEXT: [[MUL2:%.*]] = mul nsw i64 [[Z]], [[Y]]
1544+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[MUL1]], [[MUL2]]
1545+ ; CHECK-NEXT: ret i1 [[CMP]]
1546+ ;
1547+ entry:
1548+ %y = add i64 %x , 1
1549+ %mul1 = mul nsw i64 %x , %z
1550+ %mul2 = mul nsw i64 %z , %y
1551+ %cmp = icmp slt i64 %mul1 , %mul2
1552+ ret i1 %cmp
1553+ }
1554+
1555+ define i1 @test_icmp_slt_mul_no_nsw (i64 %x , i64 %z ) {
1556+ ; CHECK-LABEL: @test_icmp_slt_mul_no_nsw(
1557+ ; CHECK-NEXT: entry:
1558+ ; CHECK-NEXT: [[Y:%.*]] = add nsw i64 [[X:%.*]], 1
1559+ ; CHECK-NEXT: [[MUL1:%.*]] = mul i64 [[X]], [[Z:%.*]]
1560+ ; CHECK-NEXT: [[MUL2:%.*]] = mul nsw i64 [[Z]], [[Y]]
1561+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[MUL1]], [[MUL2]]
1562+ ; CHECK-NEXT: ret i1 [[CMP]]
1563+ ;
1564+ entry:
1565+ %y = add nsw i64 %x , 1
1566+ %mul1 = mul i64 %x , %z
1567+ %mul2 = mul nsw i64 %z , %y
1568+ %cmp = icmp slt i64 %mul1 , %mul2
1569+ ret i1 %cmp
1570+ }
0 commit comments