[llvm] AMDGPU: Try to unspill VGPRs after rewriting MFMAs to AGPR form (PR #154323)
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 12 07:24:48 PDT 2025
================
@@ -391,6 +414,133 @@ bool AMDGPURewriteAGPRCopyMFMAImpl::tryFoldCopiesFromAGPR(
return MadeChange;
}
+void AMDGPURewriteAGPRCopyMFMAImpl::replaceSpillWithCopyToVReg(
+ MachineInstr &SpillMI, int SpillFI, Register VReg) const {
+ const DebugLoc &DL = SpillMI.getDebugLoc();
+ MachineBasicBlock &MBB = *SpillMI.getParent();
+ MachineInstr *NewCopy;
+ if (SpillMI.mayStore()) {
+ NewCopy = BuildMI(MBB, SpillMI, DL, TII.get(TargetOpcode::COPY), VReg)
+ .add(SpillMI.getOperand(0));
+ } else {
+ NewCopy = BuildMI(MBB, SpillMI, DL, TII.get(TargetOpcode::COPY))
+ .add(SpillMI.getOperand(0))
+ .addReg(VReg);
+ }
+
+ LIS.ReplaceMachineInstrInMaps(SpillMI, *NewCopy);
+ SpillMI.eraseFromParent();
+}
+
+void AMDGPURewriteAGPRCopyMFMAImpl::collectSpillIndexUses(
+ ArrayRef<LiveInterval *> StackIntervals, SpillReferenceMap &Map) const {
+
+ SmallSet<int, 4> NeededFrameIndexes;
+ for (const LiveInterval *LI : StackIntervals)
+ NeededFrameIndexes.insert(LI->reg().stackSlotIndex());
+
+ for (MachineBasicBlock &MBB : MF) {
+ for (MachineInstr &MI : MBB) {
+ for (MachineOperand &MO : MI.operands()) {
+ if (!MO.isFI() || !NeededFrameIndexes.count(MO.getIndex()))
+ continue;
+
+ if (TII.isVGPRSpill(MI)) {
+ SmallVector<MachineInstr *, 4> &References = Map[MO.getIndex()];
+ References.push_back(&MI);
+ break;
+ }
+
+ // Verify this was really a spill instruction, if it's not just ignore
+ // all uses.
+
+ // TODO: This should probably be verifier enforced.
+ NeededFrameIndexes.erase(MO.getIndex());
+ Map.erase(MO.getIndex());
+ }
+ }
+ }
+}
+
+void AMDGPURewriteAGPRCopyMFMAImpl::eliminateSpillsOfReassignedVGPRs() const {
+ unsigned NumSlots = LSS.getNumIntervals();
+ if (NumSlots == 0)
+ return;
+
+ MachineFrameInfo &MFI = MF.getFrameInfo();
+
+ SmallVector<LiveInterval *, 32> StackIntervals;
+ StackIntervals.reserve(NumSlots);
+
+ for (auto I = LSS.begin(), E = LSS.end(); I != E; ++I) {
----------------
qcolombet wrote:
Can we use a range loop here?
https://github.com/llvm/llvm-project/pull/154323
More information about the llvm-commits
mailing list