@@ -1464,3 +1464,107 @@ entry:
1464
1464
%cmp = icmp slt i8 %mul1 , %mul2
1465
1465
ret i1 %cmp
1466
1466
}
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