[llvm] f493cba - [RISCV] Add a helper class to share Zicond/XVentanaCondOps patterns. NFC (#219576)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 31 08:01:47 PDT 2026
Author: Craig Topper
Date: 2026-08-31T08:01:41-07:00
New Revision: f493cba68234bbe9d460f0298e613606ca453ec2
URL: https://github.com/llvm/llvm-project/commit/f493cba68234bbe9d460f0298e613606ca453ec2
DIFF: https://github.com/llvm/llvm-project/commit/f493cba68234bbe9d460f0298e613606ca453ec2.diff
LOG: [RISCV] Add a helper class to share Zicond/XVentanaCondOps patterns. NFC (#219576)
Assisted-by: Claude
Added:
Modified:
llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td
llvm/lib/Target/RISCV/RISCVInstrInfoZicond.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td
index d309689378901..8cec2558f9923 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td
@@ -28,26 +28,5 @@ def VT_MASKC : VTMaskedMove<0b110, "vt.maskc">,
def VT_MASKCN : VTMaskedMove<0b111, "vt.maskcn">,
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
-let Predicates = [HasVendorXVentanaCondOps] in {
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, GPR:$rc)),
- (VT_MASKC GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, GPR:$rc)),
- (VT_MASKCN GPR:$rs1, GPR:$rc)>;
-
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
- (VT_MASKC GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
- (VT_MASKCN GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
- (VT_MASKCN GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
- (VT_MASKC GPR:$rs1, GPR:$rc)>;
-
-// (and (setcc a, b, ne), c) -> (vt.maskc c, (xor a, b))
-// (and (setcc a, b, eq), c) -> (vt.maskcn c, (xor a, b))
-// where c is known to be 0 or 1.
-def : Pat<(XLenVT (and (riscv_setne_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
- (VT_MASKC GPR:$rc, GPR:$rs1)>;
-def : Pat<(XLenVT (and (riscv_seteq_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
- (VT_MASKCN GPR:$rc, GPR:$rs1)>;
-} // Predicates = [HasVendorXVentanaCondOps]
+let Predicates = [HasVendorXVentanaCondOps] in
+defm : CondOpsPat<VT_MASKC, VT_MASKCN>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZicond.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZicond.td
index 4861dc47ff133..2059d2b5c2ddc 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZicond.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZicond.td
@@ -35,26 +35,31 @@ def CZERO_NEZ : ALU_rr<0b0000111, 0b111, "czero.nez">,
// Pseudo-instructions and codegen patterns
//===----------------------------------------------------------------------===//
-let Predicates = [HasStdExtZicond] in {
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, GPR:$rc)),
- (CZERO_EQZ GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, GPR:$rc)),
- (CZERO_NEZ GPR:$rs1, GPR:$rc)>;
-
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
- (CZERO_EQZ GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
- (CZERO_NEZ GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
- (CZERO_NEZ GPR:$rs1, GPR:$rc)>;
-def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
- (CZERO_EQZ GPR:$rs1, GPR:$rc)>;
-
-// (and (setcc a, b, ne), c) -> (czero.eqz c, (xor a, b))
-// (and (setcc a, b, eq), c) -> (czero.nez c, (xor a, b))
-// where c is known to be 0 or 1.
-def : Pat<(XLenVT (and (riscv_setne_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
- (CZERO_EQZ GPR:$rc, GPR:$rs1)>;
-def : Pat<(XLenVT (and (riscv_seteq_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
- (CZERO_NEZ GPR:$rc, GPR:$rs1)>;
-} // Predicates = [HasStdExtZicond]
+// Zero (eqz) is instantiated with CZERO_EQZ or a compatible custom
+// instruction, and nez with CZERO_NEZ or a compatible custom instruction.
+multiclass CondOpsPat<Instruction eqz, Instruction nez> {
+ def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, GPR:$rc)),
+ (eqz GPR:$rs1, GPR:$rc)>;
+ def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, GPR:$rc)),
+ (nez GPR:$rs1, GPR:$rc)>;
+
+ def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
+ (eqz GPR:$rs1, GPR:$rc)>;
+ def : Pat<(XLenVT (riscv_czero_eqz GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
+ (nez GPR:$rs1, GPR:$rc)>;
+ def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_setne (XLenVT GPR:$rc)))),
+ (nez GPR:$rs1, GPR:$rc)>;
+ def : Pat<(XLenVT (riscv_czero_nez GPR:$rs1, (riscv_seteq (XLenVT GPR:$rc)))),
+ (eqz GPR:$rs1, GPR:$rc)>;
+
+ // (and (setcc a, b, ne), c) -> (eqz c, (xor a, b))
+ // (and (setcc a, b, eq), c) -> (nez c, (xor a, b))
+ // where c is known to be 0 or 1.
+ def : Pat<(XLenVT (and (riscv_setne_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
+ (eqz GPR:$rc, GPR:$rs1)>;
+ def : Pat<(XLenVT (and (riscv_seteq_oneuse (XLenVT GPR:$rs1)), zero_or_one:$rc)),
+ (nez GPR:$rc, GPR:$rs1)>;
+}
+
+let Predicates = [HasStdExtZicond] in
+defm : CondOpsPat<CZERO_EQZ, CZERO_NEZ>;
More information about the llvm-commits
mailing list