Skip to content

Commit 00e3511

Browse files
committed
[RISC-V][ISel] Remove redundant czero.eqz like 'czero.eqz a0, a0, a0'
Signed-off-by: Zhijin Zeng <[email protected]>
1 parent 6844c2f commit 00e3511

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -7503,6 +7503,17 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
75037503
return DAG.getNode(ISD::ADD, DL, VT, CMOV, RHSVal);
75047504
}
75057505

7506+
// c = setcc f, 0, seteq
7507+
// (select c, t, f) -> (or f, (czero_nez t, f))
7508+
if (CondV.getOpcode() == ISD::SETCC &&
7509+
ISD::SETEQ == cast<CondCodeSDNode>(CondV.getOperand(2))->get()) {
7510+
SDValue LHS = CondV.getOperand(0);
7511+
SDValue RHS = CondV.getOperand(1);
7512+
if (isNullConstant(RHS) && LHS == FalseV)
7513+
return DAG.getNode(
7514+
ISD::OR, DL, VT, FalseV,
7515+
DAG.getNode(RISCVISD::CZERO_NEZ, DL, VT, TrueV, LHS));
7516+
}
75067517
// (select c, t, f) -> (or (czero_eqz t, c), (czero_nez f, c))
75077518
// Unless we have the short forward branch optimization.
75087519
if (!Subtarget.hasConditionalMoveFusion())

llvm/test/CodeGen/RISCV/select.ll

+55
Original file line numberDiff line numberDiff line change
@@ -1858,3 +1858,58 @@ 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_eqz(ptr %0, ptr %1) {
1865+
; RV32IM-LABEL: select_redundant_czero_eqz:
1866+
; RV32IM: # %bb.0:
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:
1872+
; RV32IM-NEXT: sw a0, 0(a1)
1873+
; RV32IM-NEXT: ret
1874+
;
1875+
; RV64IM-LABEL: select_redundant_czero_eqz:
1876+
; RV64IM: # %bb.0:
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:
1882+
; RV64IM-NEXT: sd a0, 0(a1)
1883+
; RV64IM-NEXT: ret
1884+
;
1885+
; RV64IMXVTCONDOPS-LABEL: select_redundant_czero_eqz:
1886+
; RV64IMXVTCONDOPS: # %bb.0:
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, a0, a2
1891+
; RV64IMXVTCONDOPS-NEXT: sd a0, 0(a1)
1892+
; RV64IMXVTCONDOPS-NEXT: ret
1893+
;
1894+
; RV32IMZICOND-LABEL: select_redundant_czero_eqz:
1895+
; RV32IMZICOND: # %bb.0:
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, a0, a2
1900+
; RV32IMZICOND-NEXT: sw a0, 0(a1)
1901+
; RV32IMZICOND-NEXT: ret
1902+
;
1903+
; RV64IMZICOND-LABEL: select_redundant_czero_eqz:
1904+
; RV64IMZICOND: # %bb.0:
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, a0, a2
1909+
; RV64IMZICOND-NEXT: sd a0, 0(a1)
1910+
; RV64IMZICOND-NEXT: ret
1911+
%3 = icmp eq ptr %0, null
1912+
%4 = select i1 %3, ptr @select_redundant_czero_eqz_data, ptr %0
1913+
store ptr %4, ptr %1, align 8
1914+
ret void
1915+
}

0 commit comments

Comments
 (0)