Skip to content

Commit 37eb9c9

Browse files
authored
[RISC-V][ISel] Remove redundant czero.eqz like 'czero.eqz a0, a0, a0' (#90208)
In RISC-V ISel, the instruction `czero.eqz a0, a0, a0` is meaningless. This patch does the following folds in ISel: ``` czero_eqz x, (setcc x, 0, ne) -> x czero_nez x, (setcc x, 0, eq) -> x ``` --------- Signed-off-by: Zhijin Zeng <[email protected]>
1 parent 2c1c887 commit 37eb9c9

File tree

2 files changed

+125
-7
lines changed

2 files changed

+125
-7
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16164,23 +16164,31 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1616416164
case ISD::SELECT:
1616516165
return performSELECTCombine(N, DAG, Subtarget);
1616616166
case RISCVISD::CZERO_EQZ:
16167-
case RISCVISD::CZERO_NEZ:
16167+
case RISCVISD::CZERO_NEZ: {
16168+
SDValue LHS = N->getOperand(0);
16169+
SDValue RHS = N->getOperand(1);
1616816170
// czero_eq X, (xor Y, 1) -> czero_ne X, Y if Y is 0 or 1.
1616916171
// czero_ne X, (xor Y, 1) -> czero_eq X, Y if Y is 0 or 1.
16170-
if (N->getOperand(1).getOpcode() == ISD::XOR &&
16171-
isOneConstant(N->getOperand(1).getOperand(1))) {
16172-
SDValue Cond = N->getOperand(1).getOperand(0);
16172+
if (RHS.getOpcode() == ISD::XOR && isOneConstant(RHS.getOperand(1))) {
16173+
SDValue Cond = RHS.getOperand(0);
1617316174
APInt Mask = APInt::getBitsSetFrom(Cond.getValueSizeInBits(), 1);
1617416175
if (DAG.MaskedValueIsZero(Cond, Mask)) {
1617516176
unsigned NewOpc = N->getOpcode() == RISCVISD::CZERO_EQZ
1617616177
? RISCVISD::CZERO_NEZ
1617716178
: RISCVISD::CZERO_EQZ;
16178-
return DAG.getNode(NewOpc, SDLoc(N), N->getValueType(0),
16179-
N->getOperand(0), Cond);
16179+
return DAG.getNode(NewOpc, SDLoc(N), N->getValueType(0), LHS, Cond);
1618016180
}
1618116181
}
16182+
// czero_eqz x, (setcc x, 0, ne) -> x
16183+
// czero_nez x, (setcc x, 0, eq) -> x
16184+
if (RHS.getOpcode() == ISD::SETCC && isNullConstant(RHS.getOperand(1)) &&
16185+
cast<CondCodeSDNode>(RHS.getOperand(2))->get() ==
16186+
(N->getOpcode() == RISCVISD::CZERO_EQZ ? ISD::CondCode::SETNE
16187+
: ISD::CondCode::SETEQ) &&
16188+
LHS == RHS.getOperand(0))
16189+
return LHS;
1618216190
return SDValue();
16183-
16191+
}
1618416192
case RISCVISD::SELECT_CC: {
1618516193
// Transform
1618616194
SDValue LHS = N->getOperand(0);

llvm/test/CodeGen/RISCV/select.ll

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,3 +1858,113 @@ define i32 @select_cst6(i1 zeroext %cond) {
18581858
%ret = select i1 %cond, i32 2049, i32 2047
18591859
ret i32 %ret
18601860
}
1861+
1862+
@select_redundant_czero_eqz_data = global i32 0, align 4
1863+
1864+
define void @select_redundant_czero_eqz1(ptr %0, ptr %1) {
1865+
; RV32IM-LABEL: select_redundant_czero_eqz1:
1866+
; RV32IM: # %bb.0: # %entry
1867+
; RV32IM-NEXT: bnez a0, .LBB49_2
1868+
; RV32IM-NEXT: # %bb.1:
1869+
; RV32IM-NEXT: lui a0, %hi(select_redundant_czero_eqz_data)
1870+
; RV32IM-NEXT: addi a0, a0, %lo(select_redundant_czero_eqz_data)
1871+
; RV32IM-NEXT: .LBB49_2: # %entry
1872+
; RV32IM-NEXT: sw a0, 0(a1)
1873+
; RV32IM-NEXT: ret
1874+
;
1875+
; RV64IM-LABEL: select_redundant_czero_eqz1:
1876+
; RV64IM: # %bb.0: # %entry
1877+
; RV64IM-NEXT: bnez a0, .LBB49_2
1878+
; RV64IM-NEXT: # %bb.1:
1879+
; RV64IM-NEXT: lui a0, %hi(select_redundant_czero_eqz_data)
1880+
; RV64IM-NEXT: addi a0, a0, %lo(select_redundant_czero_eqz_data)
1881+
; RV64IM-NEXT: .LBB49_2: # %entry
1882+
; RV64IM-NEXT: sd a0, 0(a1)
1883+
; RV64IM-NEXT: ret
1884+
;
1885+
; RV64IMXVTCONDOPS-LABEL: select_redundant_czero_eqz1:
1886+
; RV64IMXVTCONDOPS: # %bb.0: # %entry
1887+
; RV64IMXVTCONDOPS-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1888+
; RV64IMXVTCONDOPS-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1889+
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a2, a2, a0
1890+
; RV64IMXVTCONDOPS-NEXT: or a0, a2, a0
1891+
; RV64IMXVTCONDOPS-NEXT: sd a0, 0(a1)
1892+
; RV64IMXVTCONDOPS-NEXT: ret
1893+
;
1894+
; RV32IMZICOND-LABEL: select_redundant_czero_eqz1:
1895+
; RV32IMZICOND: # %bb.0: # %entry
1896+
; RV32IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1897+
; RV32IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1898+
; RV32IMZICOND-NEXT: czero.nez a2, a2, a0
1899+
; RV32IMZICOND-NEXT: or a0, a2, a0
1900+
; RV32IMZICOND-NEXT: sw a0, 0(a1)
1901+
; RV32IMZICOND-NEXT: ret
1902+
;
1903+
; RV64IMZICOND-LABEL: select_redundant_czero_eqz1:
1904+
; RV64IMZICOND: # %bb.0: # %entry
1905+
; RV64IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1906+
; RV64IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1907+
; RV64IMZICOND-NEXT: czero.nez a2, a2, a0
1908+
; RV64IMZICOND-NEXT: or a0, a2, a0
1909+
; RV64IMZICOND-NEXT: sd a0, 0(a1)
1910+
; RV64IMZICOND-NEXT: ret
1911+
entry:
1912+
%3 = icmp eq ptr %0, null
1913+
%4 = select i1 %3, ptr @select_redundant_czero_eqz_data, ptr %0
1914+
store ptr %4, ptr %1, align 8
1915+
ret void
1916+
}
1917+
1918+
define void @select_redundant_czero_eqz2(ptr %0, ptr %1) {
1919+
; RV32IM-LABEL: select_redundant_czero_eqz2:
1920+
; RV32IM: # %bb.0: # %entry
1921+
; RV32IM-NEXT: bnez a0, .LBB50_2
1922+
; RV32IM-NEXT: # %bb.1: # %entry
1923+
; RV32IM-NEXT: lui a0, %hi(select_redundant_czero_eqz_data)
1924+
; RV32IM-NEXT: addi a0, a0, %lo(select_redundant_czero_eqz_data)
1925+
; RV32IM-NEXT: .LBB50_2: # %entry
1926+
; RV32IM-NEXT: sw a0, 0(a1)
1927+
; RV32IM-NEXT: ret
1928+
;
1929+
; RV64IM-LABEL: select_redundant_czero_eqz2:
1930+
; RV64IM: # %bb.0: # %entry
1931+
; RV64IM-NEXT: bnez a0, .LBB50_2
1932+
; RV64IM-NEXT: # %bb.1: # %entry
1933+
; RV64IM-NEXT: lui a0, %hi(select_redundant_czero_eqz_data)
1934+
; RV64IM-NEXT: addi a0, a0, %lo(select_redundant_czero_eqz_data)
1935+
; RV64IM-NEXT: .LBB50_2: # %entry
1936+
; RV64IM-NEXT: sd a0, 0(a1)
1937+
; RV64IM-NEXT: ret
1938+
;
1939+
; RV64IMXVTCONDOPS-LABEL: select_redundant_czero_eqz2:
1940+
; RV64IMXVTCONDOPS: # %bb.0: # %entry
1941+
; RV64IMXVTCONDOPS-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1942+
; RV64IMXVTCONDOPS-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1943+
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a2, a2, a0
1944+
; RV64IMXVTCONDOPS-NEXT: or a0, a0, a2
1945+
; RV64IMXVTCONDOPS-NEXT: sd a0, 0(a1)
1946+
; RV64IMXVTCONDOPS-NEXT: ret
1947+
;
1948+
; RV32IMZICOND-LABEL: select_redundant_czero_eqz2:
1949+
; RV32IMZICOND: # %bb.0: # %entry
1950+
; RV32IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1951+
; RV32IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1952+
; RV32IMZICOND-NEXT: czero.nez a2, a2, a0
1953+
; RV32IMZICOND-NEXT: or a0, a0, a2
1954+
; RV32IMZICOND-NEXT: sw a0, 0(a1)
1955+
; RV32IMZICOND-NEXT: ret
1956+
;
1957+
; RV64IMZICOND-LABEL: select_redundant_czero_eqz2:
1958+
; RV64IMZICOND: # %bb.0: # %entry
1959+
; RV64IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
1960+
; RV64IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
1961+
; RV64IMZICOND-NEXT: czero.nez a2, a2, a0
1962+
; RV64IMZICOND-NEXT: or a0, a0, a2
1963+
; RV64IMZICOND-NEXT: sd a0, 0(a1)
1964+
; RV64IMZICOND-NEXT: ret
1965+
entry:
1966+
%3 = icmp ne ptr %0, null
1967+
%4 = select i1 %3, ptr %0, ptr @select_redundant_czero_eqz_data
1968+
store ptr %4, ptr %1, align 8
1969+
ret void
1970+
}

0 commit comments

Comments
 (0)