[llvm] [RISCV] Add unit strided load/store to whole register peephole (PR #100116)
Pengcheng Wang via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 23 20:47:28 PDT 2024
================
@@ -155,6 +156,58 @@ bool RISCVVectorPeephole::isAllOnesMask(const MachineInstr *MaskDef) const {
}
}
+/// Convert unit strided unmasked loads and stores to whole-register equivalents
+/// to avoid the dependency on $vl and $vtype.
+///
+/// %x = PseudoVLE8_V_M1 %passthru, %ptr, %vlmax, policy
+/// PseudoVSE8_V_M1 %v, %ptr, %vlmax
+///
+/// ->
+///
+/// %x = VL1RE8_V %ptr
+/// VS1R_V %v, %ptr
+bool RISCVVectorPeephole::convertToWholeRegister(MachineInstr &MI) const {
+#define CASE_WHOLE_REGISTER_LMUL_SEW(lmul, sew) \
+ case RISCV::PseudoVLE##sew##_V_M##lmul: \
+ NewOpc = RISCV::VL##lmul##RE##sew##_V; \
+ break; \
+ case RISCV::PseudoVSE##sew##_V_M##lmul: \
+ NewOpc = RISCV::VS##lmul##R_V; \
+ break;
+#define CASE_WHOLE_REGISTER_LMUL(lmul) \
+ CASE_WHOLE_REGISTER_LMUL_SEW(lmul, 8) \
+ CASE_WHOLE_REGISTER_LMUL_SEW(lmul, 16) \
+ CASE_WHOLE_REGISTER_LMUL_SEW(lmul, 32) \
+ CASE_WHOLE_REGISTER_LMUL_SEW(lmul, 64)
+
+ unsigned NewOpc;
+ switch (MI.getOpcode()) {
+ CASE_WHOLE_REGISTER_LMUL(1)
+ CASE_WHOLE_REGISTER_LMUL(2)
+ CASE_WHOLE_REGISTER_LMUL(4)
+ CASE_WHOLE_REGISTER_LMUL(8)
+ default:
+ return false;
+ }
+
+ MachineOperand &VLOp = MI.getOperand(RISCVII::getVLOpNum(MI.getDesc()));
+ if (!VLOp.isImm() || VLOp.getImm() != RISCV::VLMaxSentinel)
+ return false;
+
+ // Whole register instructions aren't pseudos so they don't have
+ // policy/SEW/AVL ops.
----------------
wangpc-pp wrote:
passthru?
https://github.com/llvm/llvm-project/pull/100116
More information about the llvm-commits
mailing list