@@ -1395,6 +1395,256 @@ define i32 @uadd_sat(i32 %x, i32 %y) {
1395
1395
%r = select i1 %c , i32 -1 , i32 %a
1396
1396
ret i32 %r
1397
1397
}
1398
+
1399
+ define i32 @uadd_sat_flipped (i32 %x ) {
1400
+ ; CHECK-LABEL: @uadd_sat_flipped(
1401
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -11
1402
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1403
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1404
+ ; CHECK-NEXT: ret i32 [[COND]]
1405
+ ;
1406
+ %cmp = icmp ugt i32 %x , -11
1407
+ %add = add i32 %x , 9
1408
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1409
+ ret i32 %cond
1410
+ }
1411
+
1412
+ define i32 @uadd_sat_flipped2 (i32 %x ) {
1413
+ ; CHECK-LABEL: @uadd_sat_flipped2(
1414
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -10
1415
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1416
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1417
+ ; CHECK-NEXT: ret i32 [[COND]]
1418
+ ;
1419
+ %cmp = icmp ugt i32 %x , -10
1420
+ %add = add i32 %x , 9
1421
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1422
+ ret i32 %cond
1423
+ }
1424
+
1425
+ define i32 @uadd_sat_flipped3 (i32 %x ) {
1426
+ ; CHECK-LABEL: @uadd_sat_flipped3(
1427
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -8
1428
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[X]], 9
1429
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1430
+ ; CHECK-NEXT: ret i32 [[COND]]
1431
+ ;
1432
+ %cmp = icmp ugt i32 %x , -8
1433
+ %add = add nuw i32 %x , 9
1434
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1435
+ ret i32 %cond
1436
+ }
1437
+
1438
+ ; Negative Test
1439
+
1440
+ define i32 @uadd_sat_flipped3_neg_no_nuw (i32 %x ) {
1441
+ ; CHECK-LABEL: @uadd_sat_flipped3_neg_no_nuw(
1442
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -8
1443
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1444
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1445
+ ; CHECK-NEXT: ret i32 [[COND]]
1446
+ ;
1447
+ %cmp = icmp ugt i32 %x , -8
1448
+ %add = add i32 %x , 9
1449
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1450
+ ret i32 %cond
1451
+ }
1452
+
1453
+ define i32 @uadd_sat_negative_one (i32 %x ) {
1454
+ ; CHECK-LABEL: @uadd_sat_negative_one(
1455
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], -1
1456
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 1
1457
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1458
+ ; CHECK-NEXT: ret i32 [[COND]]
1459
+ ;
1460
+ %cmp = icmp eq i32 %x , -1
1461
+ %add = add i32 %x , 1
1462
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1463
+ ret i32 %cond
1464
+ }
1465
+
1466
+ define <2 x i8 > @uadd_sat_flipped4_vector (<2 x i8 > %x ) {
1467
+ ; CHECK-LABEL: @uadd_sat_flipped4_vector(
1468
+ ; CHECK-NEXT: [[COND:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> [[X:%.*]], <2 x i8> <i8 9, i8 9>)
1469
+ ; CHECK-NEXT: ret <2 x i8> [[COND]]
1470
+ ;
1471
+ %cmp = icmp ult <2 x i8 > %x , <i8 -10 , i8 -10 >
1472
+ %add = add <2 x i8 > %x , <i8 9 , i8 9 >
1473
+ %cond = select <2 x i1 > %cmp , <2 x i8 > %add , <2 x i8 > <i8 -1 , i8 -1 >
1474
+ ret <2 x i8 > %cond
1475
+ }
1476
+
1477
+ define <2 x i8 > @uadd_sat_flipped4_poison_vector (<2 x i8 > %x ) {
1478
+ ; CHECK-LABEL: @uadd_sat_flipped4_poison_vector(
1479
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> [[X:%.*]], <i8 -10, i8 poison>
1480
+ ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], <i8 9, i8 9>
1481
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> <i8 -1, i8 -1>
1482
+ ; CHECK-NEXT: ret <2 x i8> [[COND]]
1483
+ ;
1484
+ %cmp = icmp ult <2 x i8 > %x , <i8 -10 , i8 poison>
1485
+ %add = add <2 x i8 > %x , <i8 9 , i8 9 >
1486
+ %cond = select <2 x i1 > %cmp , <2 x i8 > %add ,<2 x i8 > <i8 -1 , i8 -1 >
1487
+ ret <2 x i8 > %cond
1488
+ }
1489
+
1490
+ define <2 x i8 > @uadd_sat_flipped4_poison_vector_compare (<2 x i8 > %x ) {
1491
+ ; CHECK-LABEL: @uadd_sat_flipped4_poison_vector_compare(
1492
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> [[X:%.*]], <i8 -10, i8 poison>
1493
+ ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i8> [[X]], <i8 9, i8 poison>
1494
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[ADD]], <2 x i8> <i8 -1, i8 -1>
1495
+ ; CHECK-NEXT: ret <2 x i8> [[COND]]
1496
+ ;
1497
+ %cmp = icmp ult <2 x i8 > %x , <i8 -10 , i8 poison>
1498
+ %add = add <2 x i8 > %x , <i8 9 , i8 poison>
1499
+ %cond = select <2 x i1 > %cmp , <2 x i8 > %add ,<2 x i8 > <i8 -1 , i8 -1 >
1500
+ ret <2 x i8 > %cond
1501
+ }
1502
+
1503
+ define <2 x i8 > @uadd_sat_flipped4_poison_vector_compare2 (<2 x i8 > %x ) {
1504
+ ; CHECK-LABEL: @uadd_sat_flipped4_poison_vector_compare2(
1505
+ ; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1>
1506
+ ;
1507
+ %cmp = icmp ult <2 x i8 > %x , <i8 -10 , i8 poison>
1508
+ %add = add <2 x i8 > %x , <i8 poison, i8 poison>
1509
+ %cond = select <2 x i1 > %cmp , <2 x i8 > %add ,<2 x i8 > <i8 -1 , i8 -1 >
1510
+ ret <2 x i8 > %cond
1511
+ }
1512
+
1513
+ ; Negative test:
1514
+
1515
+ define i32 @uadd_sat_flipped_too_big (i32 %x ) {
1516
+ ; CHECK-LABEL: @uadd_sat_flipped_too_big(
1517
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], -8
1518
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1519
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[ADD]], i32 -1
1520
+ ; CHECK-NEXT: ret i32 [[COND]]
1521
+ ;
1522
+ %cmp = icmp ult i32 %x , -8
1523
+ %add = add i32 %x , 9
1524
+ %cond = select i1 %cmp , i32 %add , i32 -1
1525
+ ret i32 %cond
1526
+ }
1527
+
1528
+ ; Negative test:
1529
+
1530
+ define i32 @uadd_sat_flipped_wrong_bounds (i32 %x ) {
1531
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds(
1532
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -13
1533
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1534
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1535
+ ; CHECK-NEXT: ret i32 [[COND]]
1536
+ ;
1537
+ %cmp = icmp uge i32 %x , -12
1538
+ %add = add i32 %x , 9
1539
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1540
+ ret i32 %cond
1541
+ }
1542
+
1543
+ ; Negative test:
1544
+
1545
+ define i32 @uadd_sat_flipped_wrong_bounds2 (i32 %x ) {
1546
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds2(
1547
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -12
1548
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1549
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1550
+ ; CHECK-NEXT: ret i32 [[COND]]
1551
+ ;
1552
+ %cmp = icmp ugt i32 %x , -12
1553
+ %add = add i32 %x , 9
1554
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1555
+ ret i32 %cond
1556
+ }
1557
+
1558
+ ; Negative test:
1559
+
1560
+ define i32 @uadd_sat_flipped_wrong_bounds3 (i32 %x ) {
1561
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds3(
1562
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -12
1563
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1564
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1565
+ ; CHECK-NEXT: ret i32 [[COND]]
1566
+ ;
1567
+ %cmp = icmp ugt i32 %x , -12
1568
+ %add = add i32 %x , 9
1569
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1570
+ ret i32 %cond
1571
+ }
1572
+
1573
+ ; Negative test:
1574
+
1575
+ define i32 @uadd_sat_flipped_wrong_bounds4 (i32 %x ) {
1576
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds4(
1577
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], -9
1578
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1579
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 -1, i32 [[ADD]]
1580
+ ; CHECK-NEXT: ret i32 [[COND]]
1581
+ ;
1582
+ %cmp = icmp uge i32 %x , -8
1583
+ %add = add i32 %x , 9
1584
+ %cond = select i1 %cmp , i32 -1 , i32 %add
1585
+ ret i32 %cond
1586
+ }
1587
+
1588
+ ; Negative test:
1589
+
1590
+ define i32 @uadd_sat_flipped_wrong_bounds5 (i32 %x ) {
1591
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds5(
1592
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], -8
1593
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1594
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[ADD]], i32 -1
1595
+ ; CHECK-NEXT: ret i32 [[COND]]
1596
+ ;
1597
+ %cmp = icmp ult i32 %x , -8
1598
+ %add = add i32 %x , 9
1599
+ %cond = select i1 %cmp , i32 %add , i32 -1
1600
+ ret i32 %cond
1601
+ }
1602
+
1603
+ ; Negative test:
1604
+
1605
+ define i32 @uadd_sat_flipped_wrong_bounds6 (i32 %x ) {
1606
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds6(
1607
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], -11
1608
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1609
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[ADD]], i32 -1
1610
+ ; CHECK-NEXT: ret i32 [[COND]]
1611
+ ;
1612
+ %cmp = icmp ule i32 %x , -12
1613
+ %add = add i32 %x , 9
1614
+ %cond = select i1 %cmp , i32 %add , i32 -1
1615
+ ret i32 %cond
1616
+ }
1617
+
1618
+ ; Negative test:
1619
+
1620
+ define i32 @uadd_sat_flipped_wrong_bounds7 (i32 %x ) {
1621
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds7(
1622
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], -11
1623
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1624
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[ADD]], i32 -1
1625
+ ; CHECK-NEXT: ret i32 [[COND]]
1626
+ ;
1627
+ %cmp = icmp ule i32 %x , -12
1628
+ %add = add i32 %x , 9
1629
+ %cond = select i1 %cmp , i32 %add , i32 -1
1630
+ ret i32 %cond
1631
+ }
1632
+
1633
+ ; Negative test:
1634
+
1635
+ define i32 @uadd_sat_flipped_wrong_bounds8 (i32 %x ) {
1636
+ ; CHECK-LABEL: @uadd_sat_flipped_wrong_bounds8(
1637
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], -12
1638
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], 9
1639
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[ADD]], i32 -1
1640
+ ; CHECK-NEXT: ret i32 [[COND]]
1641
+ ;
1642
+ %cmp = icmp ult i32 %x , -12
1643
+ %add = add i32 %x , 9
1644
+ %cond = select i1 %cmp , i32 %add , i32 -1
1645
+ ret i32 %cond
1646
+ }
1647
+
1398
1648
define i32 @uadd_sat_nonstrict (i32 %x , i32 %y ) {
1399
1649
; CHECK-LABEL: @uadd_sat_nonstrict(
1400
1650
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
0 commit comments