Skip to content

Commit ced5571

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 0b71c58 commit ced5571

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 11 additions & 0 deletions
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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,8 +1887,7 @@ define void @select_redundant_czero_eqz(ptr %0, ptr %1) {
18871887
; RV64IMXVTCONDOPS-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
18881888
; RV64IMXVTCONDOPS-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
18891889
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a2, a2, a0
1890-
; RV64IMXVTCONDOPS-NEXT: vt.maskc a0, a0, a0
1891-
; RV64IMXVTCONDOPS-NEXT: or a0, a2, a0
1890+
; RV64IMXVTCONDOPS-NEXT: or a0, a0, a2
18921891
; RV64IMXVTCONDOPS-NEXT: sd a0, 0(a1)
18931892
; RV64IMXVTCONDOPS-NEXT: ret
18941893
;
@@ -1897,8 +1896,7 @@ define void @select_redundant_czero_eqz(ptr %0, ptr %1) {
18971896
; RV32IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
18981897
; RV32IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
18991898
; RV32IMZICOND-NEXT: czero.nez a2, a2, a0
1900-
; RV32IMZICOND-NEXT: czero.eqz a0, a0, a0
1901-
; RV32IMZICOND-NEXT: or a0, a2, a0
1899+
; RV32IMZICOND-NEXT: or a0, a0, a2
19021900
; RV32IMZICOND-NEXT: sw a0, 0(a1)
19031901
; RV32IMZICOND-NEXT: ret
19041902
;
@@ -1907,8 +1905,7 @@ define void @select_redundant_czero_eqz(ptr %0, ptr %1) {
19071905
; RV64IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
19081906
; RV64IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
19091907
; RV64IMZICOND-NEXT: czero.nez a2, a2, a0
1910-
; RV64IMZICOND-NEXT: czero.eqz a0, a0, a0
1911-
; RV64IMZICOND-NEXT: or a0, a2, a0
1908+
; RV64IMZICOND-NEXT: or a0, a0, a2
19121909
; RV64IMZICOND-NEXT: sd a0, 0(a1)
19131910
; RV64IMZICOND-NEXT: ret
19141911
entry:

0 commit comments

Comments
 (0)