@@ -1381,9 +1381,9 @@ define i16 @test_atomicrmw_usub_cond_i16_global_agent(ptr addrspace(1) %ptr, i16
1381
1381
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1382
1382
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
1383
1383
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1384
- ; CHECK-NEXT: [[TMP5 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1385
- ; CHECK-NEXT: [[TMP7 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1386
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5 ]], i16 [[TMP7 ]], i16 [[VALUE ]]
1384
+ ; CHECK-NEXT: [[TMP4 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1385
+ ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1386
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4 ]], i16 [[TMP5 ]], i16 [[EXTRACTED ]]
1387
1387
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1388
1388
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
1389
1389
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
@@ -1408,9 +1408,9 @@ define i16 @test_atomicrmw_usub_cond_i16_global_agent_align4(ptr addrspace(1) %p
1408
1408
; CHECK: atomicrmw.start:
1409
1409
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1410
1410
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1411
- ; CHECK-NEXT: [[TMP3 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1412
- ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1413
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3 ]], i16 [[TMP5 ]], i16 [[VALUE ]]
1411
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1412
+ ; CHECK-NEXT: [[TMP3 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1413
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2 ]], i16 [[TMP3 ]], i16 [[EXTRACTED ]]
1414
1414
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1415
1415
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1416
1416
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
@@ -1440,9 +1440,9 @@ define i16 @test_atomicrmw_usub_cond_i16_local(ptr addrspace(3) %ptr, i16 %value
1440
1440
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1441
1441
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]
1442
1442
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1443
- ; CHECK-NEXT: [[TMP5 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1444
- ; CHECK-NEXT: [[TMP7 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1445
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5 ]], i16 [[TMP7 ]], i16 [[VALUE ]]
1443
+ ; CHECK-NEXT: [[TMP4 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1444
+ ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1445
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4 ]], i16 [[TMP5 ]], i16 [[EXTRACTED ]]
1446
1446
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1447
1447
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]
1448
1448
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
@@ -1467,9 +1467,9 @@ define i16 @test_atomicrmw_usub_cond_i16_local_align4(ptr addrspace(3) %ptr, i16
1467
1467
; CHECK: atomicrmw.start:
1468
1468
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1469
1469
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1470
- ; CHECK-NEXT: [[TMP3 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1471
- ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1472
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3 ]], i16 [[TMP5 ]], i16 [[VALUE ]]
1470
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1471
+ ; CHECK-NEXT: [[TMP3 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1472
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2 ]], i16 [[TMP3 ]], i16 [[EXTRACTED ]]
1473
1473
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1474
1474
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1475
1475
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
@@ -1500,9 +1500,9 @@ define i16 @test_atomicrmw_usub_cond_i16_flat_agent(ptr %ptr, i16 %value) {
1500
1500
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1501
1501
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
1502
1502
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1503
- ; CHECK-NEXT: [[TMP5 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1504
- ; CHECK-NEXT: [[TMP7 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1505
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5 ]], i16 [[TMP7 ]], i16 [[VALUE ]]
1503
+ ; CHECK-NEXT: [[TMP4 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1504
+ ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1505
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4 ]], i16 [[TMP5 ]], i16 [[EXTRACTED ]]
1506
1506
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1507
1507
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
1508
1508
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
@@ -1527,9 +1527,9 @@ define i16 @test_atomicrmw_usub_cond_i16_flat_agent_align4(ptr %ptr, i16 %value)
1527
1527
; CHECK: atomicrmw.start:
1528
1528
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1529
1529
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1530
- ; CHECK-NEXT: [[TMP3 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1531
- ; CHECK-NEXT: [[TMP5 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1532
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3 ]], i16 [[TMP5 ]], i16 [[VALUE ]]
1530
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1531
+ ; CHECK-NEXT: [[TMP3 :%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1532
+ ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2 ]], i16 [[TMP3 ]], i16 [[EXTRACTED ]]
1533
1533
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1534
1534
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1535
1535
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
@@ -1560,16 +1560,14 @@ define i16 @test_atomicrmw_usub_sat_i16_global_agent(ptr addrspace(1) %ptr, i16
1560
1560
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1561
1561
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
1562
1562
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1563
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1564
- ; CHECK-NEXT: [[TMP5:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1565
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i16 [[TMP5]], i16 0
1563
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1566
1564
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1567
1565
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
1568
1566
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
1569
1567
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
1570
- ; CHECK-NEXT: [[TMP8 :%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1571
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8 ]], 1
1572
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8 ]], 0
1568
+ ; CHECK-NEXT: [[TMP4 :%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1569
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4 ]], 1
1570
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4 ]], 0
1573
1571
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1574
1572
; CHECK: atomicrmw.end:
1575
1573
; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]
@@ -1587,15 +1585,13 @@ define i16 @test_atomicrmw_usub_sat_i16_global_agent_align4(ptr addrspace(1) %pt
1587
1585
; CHECK: atomicrmw.start:
1588
1586
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1589
1587
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1590
- ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1591
- ; CHECK-NEXT: [[TMP3:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1592
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i16 [[TMP3]], i16 0
1588
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1593
1589
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1594
1590
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1595
1591
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
1596
- ; CHECK-NEXT: [[TMP6 :%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1597
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6 ]], 1
1598
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6 ]], 0
1592
+ ; CHECK-NEXT: [[TMP2 :%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1593
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2 ]], 1
1594
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2 ]], 0
1599
1595
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1600
1596
; CHECK: atomicrmw.end:
1601
1597
; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i16
@@ -1619,16 +1615,14 @@ define i16 @test_atomicrmw_usub_sat_i16_local(ptr addrspace(3) %ptr, i16 %value)
1619
1615
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1620
1616
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]
1621
1617
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1622
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1623
- ; CHECK-NEXT: [[TMP5:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1624
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i16 [[TMP5]], i16 0
1618
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1625
1619
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1626
1620
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]
1627
1621
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
1628
1622
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
1629
- ; CHECK-NEXT: [[TMP8 :%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
1630
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8 ]], 1
1631
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8 ]], 0
1623
+ ; CHECK-NEXT: [[TMP4 :%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
1624
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4 ]], 1
1625
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4 ]], 0
1632
1626
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1633
1627
; CHECK: atomicrmw.end:
1634
1628
; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]
@@ -1646,15 +1640,13 @@ define i16 @test_atomicrmw_usub_sat_i16_local_align4(ptr addrspace(3) %ptr, i16
1646
1640
; CHECK: atomicrmw.start:
1647
1641
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1648
1642
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1649
- ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1650
- ; CHECK-NEXT: [[TMP3:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1651
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i16 [[TMP3]], i16 0
1643
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1652
1644
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1653
1645
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1654
1646
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
1655
- ; CHECK-NEXT: [[TMP6 :%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
1656
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6 ]], 1
1657
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6 ]], 0
1647
+ ; CHECK-NEXT: [[TMP2 :%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
1648
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2 ]], 1
1649
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2 ]], 0
1658
1650
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1659
1651
; CHECK: atomicrmw.end:
1660
1652
; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i16
@@ -1679,16 +1671,14 @@ define i16 @test_atomicrmw_usub_sat_i16_flat_agent(ptr %ptr, i16 %value) {
1679
1671
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1680
1672
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
1681
1673
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
1682
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1683
- ; CHECK-NEXT: [[TMP5:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1684
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i16 [[TMP5]], i16 0
1674
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1685
1675
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1686
1676
; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
1687
1677
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
1688
1678
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
1689
- ; CHECK-NEXT: [[TMP8 :%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1690
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8 ]], 1
1691
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8 ]], 0
1679
+ ; CHECK-NEXT: [[TMP4 :%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1680
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4 ]], 1
1681
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4 ]], 0
1692
1682
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1693
1683
; CHECK: atomicrmw.end:
1694
1684
; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]
@@ -1706,15 +1696,13 @@ define i16 @test_atomicrmw_usub_sat_i16_flat_agent_align4(ptr %ptr, i16 %value)
1706
1696
; CHECK: atomicrmw.start:
1707
1697
; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
1708
1698
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
1709
- ; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i16 [[EXTRACTED]], [[VALUE:%.*]]
1710
- ; CHECK-NEXT: [[TMP3:%.*]] = sub i16 [[EXTRACTED]], [[VALUE]]
1711
- ; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i16 [[TMP3]], i16 0
1699
+ ; CHECK-NEXT: [[NEW:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[EXTRACTED]], i16 [[VALUE:%.*]])
1712
1700
; CHECK-NEXT: [[EXTENDED:%.*]] = zext i16 [[NEW]] to i32
1713
1701
; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
1714
1702
; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
1715
- ; CHECK-NEXT: [[TMP6 :%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1716
- ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6 ]], 1
1717
- ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6 ]], 0
1703
+ ; CHECK-NEXT: [[TMP2 :%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4
1704
+ ; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2 ]], 1
1705
+ ; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2 ]], 0
1718
1706
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
1719
1707
; CHECK: atomicrmw.end:
1720
1708
; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i16
0 commit comments