Skip to content

Commit 75b5292

Browse files
committed
[RISCV] Prevent transform on >XLEN types
1 parent d67978a commit 75b5292

File tree

3 files changed

+96
-192
lines changed

3 files changed

+96
-192
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14917,7 +14917,11 @@ static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG,
1491714917
if (SDValue V = combineSubShiftToOrcB(N, DAG, Subtarget))
1491814918
return V;
1491914919

14920-
if (Subtarget.hasStdExtZbb()) {
14920+
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
14921+
auto LK = TLI.getTypeConversion(*DAG.getContext(), VT);
14922+
if ((LK.first == TargetLoweringBase::TypeLegal ||
14923+
LK.first == TargetLoweringBase::TypePromoteInteger) &&
14924+
TLI.isOperationLegal(ISD::UMIN, LK.second)) {
1492114925
// fold (sub x, (select (ult x, y), 0, y)) -> (umin x, (sub x, y))
1492214926
using namespace llvm::SDPatternMatch;
1492314927
SDValue Y;

llvm/test/CodeGen/RISCV/rv32zbb.ll

Lines changed: 74 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,167 +1551,87 @@ define i32 @sub_if_uge_i32(i32 %x, i32 %y) {
15511551
}
15521552

15531553
define i64 @sub_if_uge_i64(i64 %x, i64 %y) {
1554-
; RV32I-LABEL: sub_if_uge_i64:
1555-
; RV32I: # %bb.0:
1556-
; RV32I-NEXT: beq a1, a3, .LBB52_2
1557-
; RV32I-NEXT: # %bb.1:
1558-
; RV32I-NEXT: sltu a4, a1, a3
1559-
; RV32I-NEXT: j .LBB52_3
1560-
; RV32I-NEXT: .LBB52_2:
1561-
; RV32I-NEXT: sltu a4, a0, a2
1562-
; RV32I-NEXT: .LBB52_3:
1563-
; RV32I-NEXT: addi a4, a4, -1
1564-
; RV32I-NEXT: and a3, a4, a3
1565-
; RV32I-NEXT: and a2, a4, a2
1566-
; RV32I-NEXT: sltu a4, a0, a2
1567-
; RV32I-NEXT: sub a1, a1, a3
1568-
; RV32I-NEXT: sub a1, a1, a4
1569-
; RV32I-NEXT: sub a0, a0, a2
1570-
; RV32I-NEXT: ret
1571-
;
1572-
; RV32ZBB-LABEL: sub_if_uge_i64:
1573-
; RV32ZBB: # %bb.0:
1574-
; RV32ZBB-NEXT: sltu a4, a0, a2
1575-
; RV32ZBB-NEXT: sub a3, a1, a3
1576-
; RV32ZBB-NEXT: sub a3, a3, a4
1577-
; RV32ZBB-NEXT: sub a2, a0, a2
1578-
; RV32ZBB-NEXT: beq a1, a3, .LBB52_2
1579-
; RV32ZBB-NEXT: # %bb.1:
1580-
; RV32ZBB-NEXT: sltu a4, a1, a3
1581-
; RV32ZBB-NEXT: beqz a4, .LBB52_3
1582-
; RV32ZBB-NEXT: j .LBB52_4
1583-
; RV32ZBB-NEXT: .LBB52_2:
1584-
; RV32ZBB-NEXT: sltu a4, a0, a2
1585-
; RV32ZBB-NEXT: bnez a4, .LBB52_4
1586-
; RV32ZBB-NEXT: .LBB52_3:
1587-
; RV32ZBB-NEXT: mv a0, a2
1588-
; RV32ZBB-NEXT: mv a1, a3
1589-
; RV32ZBB-NEXT: .LBB52_4:
1590-
; RV32ZBB-NEXT: ret
1554+
; CHECK-LABEL: sub_if_uge_i64:
1555+
; CHECK: # %bb.0:
1556+
; CHECK-NEXT: beq a1, a3, .LBB52_2
1557+
; CHECK-NEXT: # %bb.1:
1558+
; CHECK-NEXT: sltu a4, a1, a3
1559+
; CHECK-NEXT: j .LBB52_3
1560+
; CHECK-NEXT: .LBB52_2:
1561+
; CHECK-NEXT: sltu a4, a0, a2
1562+
; CHECK-NEXT: .LBB52_3:
1563+
; CHECK-NEXT: addi a4, a4, -1
1564+
; CHECK-NEXT: and a3, a4, a3
1565+
; CHECK-NEXT: and a2, a4, a2
1566+
; CHECK-NEXT: sltu a4, a0, a2
1567+
; CHECK-NEXT: sub a1, a1, a3
1568+
; CHECK-NEXT: sub a1, a1, a4
1569+
; CHECK-NEXT: sub a0, a0, a2
1570+
; CHECK-NEXT: ret
15911571
%cmp = icmp ult i64 %x, %y
15921572
%select = select i1 %cmp, i64 0, i64 %y
15931573
%sub = sub nuw i64 %x, %select
15941574
ret i64 %sub
15951575
}
15961576

15971577
define i128 @sub_if_uge_i128(i128 %x, i128 %y) {
1598-
; RV32I-LABEL: sub_if_uge_i128:
1599-
; RV32I: # %bb.0:
1600-
; RV32I-NEXT: lw a7, 4(a2)
1601-
; RV32I-NEXT: lw a6, 8(a2)
1602-
; RV32I-NEXT: lw t0, 12(a2)
1603-
; RV32I-NEXT: lw a4, 12(a1)
1604-
; RV32I-NEXT: lw a3, 4(a1)
1605-
; RV32I-NEXT: lw a5, 8(a1)
1606-
; RV32I-NEXT: beq a4, t0, .LBB53_2
1607-
; RV32I-NEXT: # %bb.1:
1608-
; RV32I-NEXT: sltu t1, a4, t0
1609-
; RV32I-NEXT: j .LBB53_3
1610-
; RV32I-NEXT: .LBB53_2:
1611-
; RV32I-NEXT: sltu t1, a5, a6
1612-
; RV32I-NEXT: .LBB53_3:
1613-
; RV32I-NEXT: lw a2, 0(a2)
1614-
; RV32I-NEXT: lw a1, 0(a1)
1615-
; RV32I-NEXT: beq a3, a7, .LBB53_5
1616-
; RV32I-NEXT: # %bb.4:
1617-
; RV32I-NEXT: sltu t2, a3, a7
1618-
; RV32I-NEXT: j .LBB53_6
1619-
; RV32I-NEXT: .LBB53_5:
1620-
; RV32I-NEXT: sltu t2, a1, a2
1621-
; RV32I-NEXT: .LBB53_6:
1622-
; RV32I-NEXT: xor t3, a4, t0
1623-
; RV32I-NEXT: xor t4, a5, a6
1624-
; RV32I-NEXT: or t3, t4, t3
1625-
; RV32I-NEXT: beqz t3, .LBB53_8
1626-
; RV32I-NEXT: # %bb.7:
1627-
; RV32I-NEXT: mv t2, t1
1628-
; RV32I-NEXT: .LBB53_8:
1629-
; RV32I-NEXT: addi t2, t2, -1
1630-
; RV32I-NEXT: and t1, t2, t0
1631-
; RV32I-NEXT: and t0, t2, a2
1632-
; RV32I-NEXT: and a7, t2, a7
1633-
; RV32I-NEXT: sltu a2, a1, t0
1634-
; RV32I-NEXT: and t2, t2, a6
1635-
; RV32I-NEXT: mv a6, a2
1636-
; RV32I-NEXT: beq a3, a7, .LBB53_10
1637-
; RV32I-NEXT: # %bb.9:
1638-
; RV32I-NEXT: sltu a6, a3, a7
1639-
; RV32I-NEXT: .LBB53_10:
1640-
; RV32I-NEXT: sub t3, a5, t2
1641-
; RV32I-NEXT: sltu a5, a5, t2
1642-
; RV32I-NEXT: sub a4, a4, t1
1643-
; RV32I-NEXT: sub a3, a3, a7
1644-
; RV32I-NEXT: sub a1, a1, t0
1645-
; RV32I-NEXT: sltu a7, t3, a6
1646-
; RV32I-NEXT: sub a4, a4, a5
1647-
; RV32I-NEXT: sub a5, t3, a6
1648-
; RV32I-NEXT: sub a3, a3, a2
1649-
; RV32I-NEXT: sub a2, a4, a7
1650-
; RV32I-NEXT: sw a1, 0(a0)
1651-
; RV32I-NEXT: sw a3, 4(a0)
1652-
; RV32I-NEXT: sw a5, 8(a0)
1653-
; RV32I-NEXT: sw a2, 12(a0)
1654-
; RV32I-NEXT: ret
1655-
;
1656-
; RV32ZBB-LABEL: sub_if_uge_i128:
1657-
; RV32ZBB: # %bb.0:
1658-
; RV32ZBB-NEXT: lw a7, 0(a2)
1659-
; RV32ZBB-NEXT: lw t0, 4(a2)
1660-
; RV32ZBB-NEXT: lw a5, 8(a2)
1661-
; RV32ZBB-NEXT: lw a6, 12(a2)
1662-
; RV32ZBB-NEXT: lw a2, 8(a1)
1663-
; RV32ZBB-NEXT: lw a3, 12(a1)
1664-
; RV32ZBB-NEXT: lw a4, 0(a1)
1665-
; RV32ZBB-NEXT: lw a1, 4(a1)
1666-
; RV32ZBB-NEXT: sltu t1, a2, a5
1667-
; RV32ZBB-NEXT: sub a6, a3, a6
1668-
; RV32ZBB-NEXT: sltu t2, a4, a7
1669-
; RV32ZBB-NEXT: sub a6, a6, t1
1670-
; RV32ZBB-NEXT: mv t1, t2
1671-
; RV32ZBB-NEXT: beq a1, t0, .LBB53_2
1672-
; RV32ZBB-NEXT: # %bb.1:
1673-
; RV32ZBB-NEXT: sltu t1, a1, t0
1674-
; RV32ZBB-NEXT: .LBB53_2:
1675-
; RV32ZBB-NEXT: sub t3, a2, a5
1676-
; RV32ZBB-NEXT: sltu a5, t3, t1
1677-
; RV32ZBB-NEXT: sub a5, a6, a5
1678-
; RV32ZBB-NEXT: sub a6, t3, t1
1679-
; RV32ZBB-NEXT: beq a3, a5, .LBB53_4
1680-
; RV32ZBB-NEXT: # %bb.3:
1681-
; RV32ZBB-NEXT: sltu t1, a3, a5
1682-
; RV32ZBB-NEXT: j .LBB53_5
1683-
; RV32ZBB-NEXT: .LBB53_4:
1684-
; RV32ZBB-NEXT: sltu t1, a2, a6
1685-
; RV32ZBB-NEXT: .LBB53_5:
1686-
; RV32ZBB-NEXT: sub t0, a1, t0
1687-
; RV32ZBB-NEXT: sub t0, t0, t2
1688-
; RV32ZBB-NEXT: sub a7, a4, a7
1689-
; RV32ZBB-NEXT: beq a1, t0, .LBB53_7
1690-
; RV32ZBB-NEXT: # %bb.6:
1691-
; RV32ZBB-NEXT: sltu t2, a1, t0
1692-
; RV32ZBB-NEXT: j .LBB53_8
1693-
; RV32ZBB-NEXT: .LBB53_7:
1694-
; RV32ZBB-NEXT: sltu t2, a4, a7
1695-
; RV32ZBB-NEXT: .LBB53_8:
1696-
; RV32ZBB-NEXT: xor t3, a3, a5
1697-
; RV32ZBB-NEXT: xor t4, a2, a6
1698-
; RV32ZBB-NEXT: or t3, t4, t3
1699-
; RV32ZBB-NEXT: beqz t3, .LBB53_10
1700-
; RV32ZBB-NEXT: # %bb.9:
1701-
; RV32ZBB-NEXT: mv t2, t1
1702-
; RV32ZBB-NEXT: .LBB53_10:
1703-
; RV32ZBB-NEXT: bnez t2, .LBB53_12
1704-
; RV32ZBB-NEXT: # %bb.11:
1705-
; RV32ZBB-NEXT: mv a4, a7
1706-
; RV32ZBB-NEXT: mv a1, t0
1707-
; RV32ZBB-NEXT: mv a2, a6
1708-
; RV32ZBB-NEXT: mv a3, a5
1709-
; RV32ZBB-NEXT: .LBB53_12:
1710-
; RV32ZBB-NEXT: sw a4, 0(a0)
1711-
; RV32ZBB-NEXT: sw a1, 4(a0)
1712-
; RV32ZBB-NEXT: sw a2, 8(a0)
1713-
; RV32ZBB-NEXT: sw a3, 12(a0)
1714-
; RV32ZBB-NEXT: ret
1578+
; CHECK-LABEL: sub_if_uge_i128:
1579+
; CHECK: # %bb.0:
1580+
; CHECK-NEXT: lw a7, 4(a2)
1581+
; CHECK-NEXT: lw a6, 8(a2)
1582+
; CHECK-NEXT: lw t0, 12(a2)
1583+
; CHECK-NEXT: lw a4, 12(a1)
1584+
; CHECK-NEXT: lw a3, 4(a1)
1585+
; CHECK-NEXT: lw a5, 8(a1)
1586+
; CHECK-NEXT: beq a4, t0, .LBB53_2
1587+
; CHECK-NEXT: # %bb.1:
1588+
; CHECK-NEXT: sltu t1, a4, t0
1589+
; CHECK-NEXT: j .LBB53_3
1590+
; CHECK-NEXT: .LBB53_2:
1591+
; CHECK-NEXT: sltu t1, a5, a6
1592+
; CHECK-NEXT: .LBB53_3:
1593+
; CHECK-NEXT: lw a2, 0(a2)
1594+
; CHECK-NEXT: lw a1, 0(a1)
1595+
; CHECK-NEXT: beq a3, a7, .LBB53_5
1596+
; CHECK-NEXT: # %bb.4:
1597+
; CHECK-NEXT: sltu t2, a3, a7
1598+
; CHECK-NEXT: j .LBB53_6
1599+
; CHECK-NEXT: .LBB53_5:
1600+
; CHECK-NEXT: sltu t2, a1, a2
1601+
; CHECK-NEXT: .LBB53_6:
1602+
; CHECK-NEXT: xor t3, a4, t0
1603+
; CHECK-NEXT: xor t4, a5, a6
1604+
; CHECK-NEXT: or t3, t4, t3
1605+
; CHECK-NEXT: beqz t3, .LBB53_8
1606+
; CHECK-NEXT: # %bb.7:
1607+
; CHECK-NEXT: mv t2, t1
1608+
; CHECK-NEXT: .LBB53_8:
1609+
; CHECK-NEXT: addi t2, t2, -1
1610+
; CHECK-NEXT: and t1, t2, t0
1611+
; CHECK-NEXT: and t0, t2, a2
1612+
; CHECK-NEXT: and a7, t2, a7
1613+
; CHECK-NEXT: sltu a2, a1, t0
1614+
; CHECK-NEXT: and t2, t2, a6
1615+
; CHECK-NEXT: mv a6, a2
1616+
; CHECK-NEXT: beq a3, a7, .LBB53_10
1617+
; CHECK-NEXT: # %bb.9:
1618+
; CHECK-NEXT: sltu a6, a3, a7
1619+
; CHECK-NEXT: .LBB53_10:
1620+
; CHECK-NEXT: sub t3, a5, t2
1621+
; CHECK-NEXT: sltu a5, a5, t2
1622+
; CHECK-NEXT: sub a4, a4, t1
1623+
; CHECK-NEXT: sub a3, a3, a7
1624+
; CHECK-NEXT: sub a1, a1, t0
1625+
; CHECK-NEXT: sltu a7, t3, a6
1626+
; CHECK-NEXT: sub a4, a4, a5
1627+
; CHECK-NEXT: sub a5, t3, a6
1628+
; CHECK-NEXT: sub a3, a3, a2
1629+
; CHECK-NEXT: sub a2, a4, a7
1630+
; CHECK-NEXT: sw a1, 0(a0)
1631+
; CHECK-NEXT: sw a3, 4(a0)
1632+
; CHECK-NEXT: sw a5, 8(a0)
1633+
; CHECK-NEXT: sw a2, 12(a0)
1634+
; CHECK-NEXT: ret
17151635
%cmp = icmp ult i128 %x, %y
17161636
%select = select i1 %cmp, i128 0, i128 %y
17171637
%sub = sub nuw i128 %x, %select

llvm/test/CodeGen/RISCV/rv64zbb.ll

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,43 +1775,23 @@ define i64 @sub_if_uge_i64(i64 %x, i64 %y) {
17751775
}
17761776

17771777
define i128 @sub_if_uge_i128(i128 %x, i128 %y) {
1778-
; RV64I-LABEL: sub_if_uge_i128:
1779-
; RV64I: # %bb.0:
1780-
; RV64I-NEXT: beq a1, a3, .LBB66_2
1781-
; RV64I-NEXT: # %bb.1:
1782-
; RV64I-NEXT: sltu a4, a1, a3
1783-
; RV64I-NEXT: j .LBB66_3
1784-
; RV64I-NEXT: .LBB66_2:
1785-
; RV64I-NEXT: sltu a4, a0, a2
1786-
; RV64I-NEXT: .LBB66_3:
1787-
; RV64I-NEXT: addi a4, a4, -1
1788-
; RV64I-NEXT: and a3, a4, a3
1789-
; RV64I-NEXT: and a2, a4, a2
1790-
; RV64I-NEXT: sltu a4, a0, a2
1791-
; RV64I-NEXT: sub a1, a1, a3
1792-
; RV64I-NEXT: sub a1, a1, a4
1793-
; RV64I-NEXT: sub a0, a0, a2
1794-
; RV64I-NEXT: ret
1795-
;
1796-
; RV64ZBB-LABEL: sub_if_uge_i128:
1797-
; RV64ZBB: # %bb.0:
1798-
; RV64ZBB-NEXT: sltu a4, a0, a2
1799-
; RV64ZBB-NEXT: sub a3, a1, a3
1800-
; RV64ZBB-NEXT: sub a3, a3, a4
1801-
; RV64ZBB-NEXT: sub a2, a0, a2
1802-
; RV64ZBB-NEXT: beq a1, a3, .LBB66_2
1803-
; RV64ZBB-NEXT: # %bb.1:
1804-
; RV64ZBB-NEXT: sltu a4, a1, a3
1805-
; RV64ZBB-NEXT: beqz a4, .LBB66_3
1806-
; RV64ZBB-NEXT: j .LBB66_4
1807-
; RV64ZBB-NEXT: .LBB66_2:
1808-
; RV64ZBB-NEXT: sltu a4, a0, a2
1809-
; RV64ZBB-NEXT: bnez a4, .LBB66_4
1810-
; RV64ZBB-NEXT: .LBB66_3:
1811-
; RV64ZBB-NEXT: mv a0, a2
1812-
; RV64ZBB-NEXT: mv a1, a3
1813-
; RV64ZBB-NEXT: .LBB66_4:
1814-
; RV64ZBB-NEXT: ret
1778+
; CHECK-LABEL: sub_if_uge_i128:
1779+
; CHECK: # %bb.0:
1780+
; CHECK-NEXT: beq a1, a3, .LBB66_2
1781+
; CHECK-NEXT: # %bb.1:
1782+
; CHECK-NEXT: sltu a4, a1, a3
1783+
; CHECK-NEXT: j .LBB66_3
1784+
; CHECK-NEXT: .LBB66_2:
1785+
; CHECK-NEXT: sltu a4, a0, a2
1786+
; CHECK-NEXT: .LBB66_3:
1787+
; CHECK-NEXT: addi a4, a4, -1
1788+
; CHECK-NEXT: and a3, a4, a3
1789+
; CHECK-NEXT: and a2, a4, a2
1790+
; CHECK-NEXT: sltu a4, a0, a2
1791+
; CHECK-NEXT: sub a1, a1, a3
1792+
; CHECK-NEXT: sub a1, a1, a4
1793+
; CHECK-NEXT: sub a0, a0, a2
1794+
; CHECK-NEXT: ret
18151795
%cmp = icmp ult i128 %x, %y
18161796
%select = select i1 %cmp, i128 0, i128 %y
18171797
%sub = sub nuw i128 %x, %select

0 commit comments

Comments
 (0)