[llvm] [RISCV][VLOPT] Support segmented store instructions (PR #155467)
Min-Yih Hsu via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 4 10:46:27 PDT 2025
================
@@ -1376,6 +1405,60 @@ RISCVVLOptimizer::getMinimumVLForUser(const MachineOperand &UserOp) const {
return VLOp;
}
+/// Return true if MI is an instruction used for assembling registers
+/// for segmented store instructions, namely, RISCVISD::TUPLE_INSERT.
+/// Currently it's lowered to INSERT_SUBREG.
+static bool isTupleInsertInstr(const MachineInstr &MI,
+ const MachineRegisterInfo &MRI) {
+ if (MI.getOpcode() != RISCV::INSERT_SUBREG)
+ return false;
+
+ const TargetRegisterClass *DstRC = MRI.getRegClass(MI.getOperand(0).getReg());
+ if (!RISCVRI::isVRegClass(DstRC->TSFlags))
+ return false;
+ unsigned NF = RISCVRI::getNF(DstRC->TSFlags);
+ if (NF < 2)
+ return false;
+
+ // Check whether INSERT_SUBREG was lowered with the correct subreg index.
+ auto VLMul = RISCVRI::getLMul(DstRC->TSFlags);
+ [[maybe_unused]] auto [LMul, IsFractional] = RISCVVType::decodeVLMUL(VLMul);
+ assert(!IsFractional && "unexpected LMUL for tuple register classes");
+ [[maybe_unused]] const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();
+ [[maybe_unused]] unsigned SubRegIdx = MI.getOperand(3).getImm();
+ assert(TRI->getSubRegIdxSize(SubRegIdx) == RISCV::RVVBitsPerBlock * LMul &&
+ "unexpected subreg index of tuple register class");
+ return true;
+}
+
+static bool isSegmentedStoreInstr(const MachineInstr &MI) {
+ const RISCVVPseudosTable::PseudoInfo *RVV =
+ RISCVVPseudosTable::getPseudoInfo(MI.getOpcode());
+ if (!RVV)
+ return false;
+ switch (RVV->BaseInstr) {
----------------
mshockwave wrote:
Fixed.
https://github.com/llvm/llvm-project/pull/155467
More information about the llvm-commits
mailing list