[llvm] [RISCV] enable VTYPE before whole RVVReg move (PR #117866)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 1 23:11:37 PST 2024
================
@@ -1768,6 +1769,56 @@ void RISCVInsertVSETVLI::insertReadVL(MachineBasicBlock &MBB) {
}
}
+static bool isRVVCopy(const MachineInstr &MI) {
+ static const TargetRegisterClass *RVVRegClasses[] = {
+ &RISCV::VRRegClass, &RISCV::VRM2RegClass, &RISCV::VRM4RegClass,
+ &RISCV::VRM8RegClass, &RISCV::VRN2M1RegClass, &RISCV::VRN2M2RegClass,
+ &RISCV::VRN2M4RegClass, &RISCV::VRN3M1RegClass, &RISCV::VRN3M2RegClass,
+ &RISCV::VRN4M1RegClass, &RISCV::VRN4M2RegClass, &RISCV::VRN5M1RegClass,
+ &RISCV::VRN6M1RegClass, &RISCV::VRN7M1RegClass, &RISCV::VRN8M1RegClass};
+
+ if (MI.getOpcode() != TargetOpcode::COPY)
+ return false;
+
+ Register DstReg = MI.getOperand(0).getReg();
+ Register SrcReg = MI.getOperand(1).getReg();
+ for (const auto &RegClass : RVVRegClasses) {
+ if (RegClass->contains(DstReg, SrcReg)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void RISCVInsertVSETVLI::enableVTYPEBeforeMove(MachineBasicBlock &MBB) {
+ bool NeedVSETVL = true;
+
+ if (!BlockInfo[MBB.getNumber()].Pred.isUnknown() &&
+ BlockInfo[MBB.getNumber()].Pred.isValid())
+ NeedVSETVL = false;
+
+ for (auto &MI : MBB) {
+ if (isVectorConfigInstr(MI) || RISCVII::hasSEWOp(MI.getDesc().TSFlags))
+ NeedVSETVL = false;
+
+ if (MI.isCall() || MI.isInlineAsm())
+ NeedVSETVL = true;
+
+ if (NeedVSETVL && isRVVCopy(MI)) {
+ auto VSETVL0MI =
+ BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(RISCV::PseudoVSETVLIX0))
+ .addReg(RISCV::X0, RegState::Define | RegState::Dead)
----------------
topperc wrote:
That should work.
https://github.com/llvm/llvm-project/pull/117866
More information about the llvm-commits
mailing list