Skip to content

Commit 05b2bc6

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 6cac8a7 commit 05b2bc6

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

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

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

llvm/test/CodeGen/RISCV/select.ll

+3-9
Original file line numberDiff line numberDiff line change
@@ -1887,8 +1887,7 @@ define void @select_redundant_czero_eqz1(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_eqz1(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_eqz1(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:
@@ -1944,7 +1941,6 @@ define void @select_redundant_czero_eqz2(ptr %0, ptr %1) {
19441941
; RV64IMXVTCONDOPS-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
19451942
; RV64IMXVTCONDOPS-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
19461943
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a2, a2, a0
1947-
; RV64IMXVTCONDOPS-NEXT: vt.maskc a0, a0, a0
19481944
; RV64IMXVTCONDOPS-NEXT: or a0, a0, a2
19491945
; RV64IMXVTCONDOPS-NEXT: sd a0, 0(a1)
19501946
; RV64IMXVTCONDOPS-NEXT: ret
@@ -1954,7 +1950,6 @@ define void @select_redundant_czero_eqz2(ptr %0, ptr %1) {
19541950
; RV32IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
19551951
; RV32IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
19561952
; RV32IMZICOND-NEXT: czero.nez a2, a2, a0
1957-
; RV32IMZICOND-NEXT: czero.eqz a0, a0, a0
19581953
; RV32IMZICOND-NEXT: or a0, a0, a2
19591954
; RV32IMZICOND-NEXT: sw a0, 0(a1)
19601955
; RV32IMZICOND-NEXT: ret
@@ -1964,7 +1959,6 @@ define void @select_redundant_czero_eqz2(ptr %0, ptr %1) {
19641959
; RV64IMZICOND-NEXT: lui a2, %hi(select_redundant_czero_eqz_data)
19651960
; RV64IMZICOND-NEXT: addi a2, a2, %lo(select_redundant_czero_eqz_data)
19661961
; RV64IMZICOND-NEXT: czero.nez a2, a2, a0
1967-
; RV64IMZICOND-NEXT: czero.eqz a0, a0, a0
19681962
; RV64IMZICOND-NEXT: or a0, a0, a2
19691963
; RV64IMZICOND-NEXT: sd a0, 0(a1)
19701964
; RV64IMZICOND-NEXT: ret

0 commit comments

Comments
 (0)