[llvm] [AMDGPU] RewriteMFMAFormStage: single exit copy for same-block uses (PR #209179)
Romanov Vlad via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 21 03:22:33 PDT 2026
================
@@ -2819,22 +2822,34 @@ bool RewriteMFMAFormStage::rewrite(
continue;
}
- // Special case, the use is in the same block as the MFMA. Insert the copy
- // just before the use.
- const TargetRegisterClass *DstRC = DAG.MRI.getRegClass(DstReg);
- const TargetRegisterClass *VGPRRC = SRI->getEquivalentVGPRClass(DstRC);
- Register NewUseReg = DAG.MRI.createVirtualRegister(VGPRRC);
+ // Lazily create the copy register on first same-block use.
+ if (!SameBlockCopyReg.isValid()) {
+ const TargetRegisterClass *DstRC = DAG.MRI.getRegClass(DstReg);
+ const TargetRegisterClass *VGPRRC = SRI->getEquivalentVGPRClass(DstRC);
+ SameBlockCopyReg = DAG.MRI.createVirtualRegister(VGPRRC);
+ }
+
+ // Track the earliest use for copy insertion point.
MachineInstr *UseInst = RU->getParent();
+ if (!EarliestSameBlockUse ||
+ SlotIndex::isEarlierInstr(
+ DAG.LIS->getInstructionIndex(*UseInst),
+ DAG.LIS->getInstructionIndex(*EarliestSameBlockUse)))
+ EarliestSameBlockUse = UseInst;
+
+ RU->setReg(SameBlockCopyReg);
+ }
+
+ // Insert the copy before the earliest same-block use.
+ if (SameBlockCopyReg.isValid()) {
MachineInstrBuilder VGPRCopy =
- BuildMI(*UseInst->getParent(), UseInst->getIterator(),
- UseInst->getDebugLoc(), TII->get(TargetOpcode::COPY))
- .addDef(NewUseReg, {}, 0)
+ BuildMI(*EarliestSameBlockUse->getParent(),
+ EarliestSameBlockUse->getIterator(),
+ EarliestSameBlockUse->getDebugLoc(),
+ TII->get(TargetOpcode::COPY))
+ .addDef(SameBlockCopyReg, {}, 0)
----------------
romanovvlad wrote:
Done.
https://github.com/llvm/llvm-project/pull/209179
More information about the llvm-commits
mailing list