@@ -1350,6 +1350,10 @@ class QCIMVCCIPat<CondCode Cond, QCIMVCCI Inst, DAGOperand InTyImm>
13501350 : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), InTyImm:$imm, Cond, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
13511351 (Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, GPRNoX0:$rs3)>;
13521352
1353+ class QCIMVCCIZeroPat<CondCode Cond, QCIMVCCI Inst>
1354+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 0), Cond, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
1355+ (Inst GPRNoX0:$rd, GPRNoX0:$rs1, 0, GPRNoX0:$rs3)>;
1356+
13531357class QCISELECTCCIPat<CondCode Cond, QCISELECTCCI Inst>
13541358 : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), simm5:$imm, Cond, (i32 GPRNoX0:$rs2), (i32 GPRNoX0:$rs3))),
13551359 (Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, GPRNoX0:$rs3)>;
@@ -1538,27 +1542,32 @@ def: Pat<(i32 (ctlz (not (i32 GPR:$rs1)))), (QC_CLO GPR:$rs1)>;
15381542let Predicates = [HasVendorXqciint, IsRV32] in
15391543def : Pat<(riscv_mileaveret_glue), (QC_C_MILEAVERET)>;
15401544
1541- let Predicates = [HasVendorXqcicm, IsRV32] in {
1542- // (SELECT X, Y, Z) is canonicalised to `(riscv_selectcc x, 0, NE, y, z)`.
1543- // This exists to prioritise over the `Select_GPR_Using_CC_GPR` pattern.
1544- def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 0), SETNE, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
1545- (QC_MVNEI GPRNoX0:$rd, GPRNoX0:$rs1, 0, GPRNoX0:$rs3)>;
1546- def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 0), SETEQ, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
1547- (QC_MVEQI GPRNoX0:$rd, GPRNoX0:$rs1, 0, GPRNoX0:$rs3)>;
1548-
1545+ let Predicates = [HasVendorXqcicm, NoShortForwardBranchOpt, IsRV32] in {
15491546def : QCIMVCCPat<SETEQ, QC_MVEQ>;
15501547def : QCIMVCCPat<SETNE, QC_MVNE>;
15511548def : QCIMVCCPat<SETLT, QC_MVLT>;
15521549def : QCIMVCCPat<SETULT, QC_MVLTU>;
15531550def : QCIMVCCPat<SETGE, QC_MVGE>;
15541551def : QCIMVCCPat<SETUGE, QC_MVGEU>;
15551552
1556- def : QCIMVCCIPat<SETEQ, QC_MVEQI, simm5>;
1557- def : QCIMVCCIPat<SETNE, QC_MVNEI, simm5>;
1558- def : QCIMVCCIPat<SETLT, QC_MVLTI, simm5>;
1559- def : QCIMVCCIPat<SETULT, QC_MVLTUI, uimm5>;
1560- def : QCIMVCCIPat<SETGE, QC_MVGEI, simm5>;
1561- def : QCIMVCCIPat<SETUGE, QC_MVGEUI, uimm5>;
1553+ // These exist to prioritise over the `Select_GPR_Using_CC_GPR` pattern for X0.
1554+ def : QCIMVCCIZeroPat<SETEQ, QC_MVEQI>;
1555+ def : QCIMVCCIZeroPat<SETNE, QC_MVNEI>;
1556+ def : QCIMVCCIZeroPat<SETLT, QC_MVLTI>;
1557+ def : QCIMVCCIZeroPat<SETULT, QC_MVLTUI>;
1558+ def : QCIMVCCIZeroPat<SETGE, QC_MVGEI>;
1559+ def : QCIMVCCIZeroPat<SETUGE, QC_MVGEUI>;
1560+ }
1561+
1562+ let Predicates = [HasVendorXqcicm, IsRV32] in {
1563+ // These all use *imm5nonzero because we want to use PseudoCCMOVGPR with X0 when SFB is enabled.
1564+ // When SFB is not enabled, the `QCIMVCCIZeroPat`s above will be used if RHS=0.
1565+ def : QCIMVCCIPat<SETEQ, QC_MVEQI, simm5nonzero>;
1566+ def : QCIMVCCIPat<SETNE, QC_MVNEI, simm5nonzero>;
1567+ def : QCIMVCCIPat<SETLT, QC_MVLTI, simm5nonzero>;
1568+ def : QCIMVCCIPat<SETULT, QC_MVLTUI, uimm5nonzero>;
1569+ def : QCIMVCCIPat<SETGE, QC_MVGEI, simm5nonzero>;
1570+ def : QCIMVCCIPat<SETUGE, QC_MVGEUI, uimm5nonzero>;
15621571}
15631572
15641573let Predicates = [HasVendorXqcicli, IsRV32] in {
0 commit comments