[llvm] [MachineCP] Correctly handle register masks and sub-registers (PR #122734)
Jinsong Ji via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 5 05:56:33 PST 2025
================
@@ -978,9 +1012,11 @@ void MachineCopyPropagation::ForwardCopyPropagateBlock(MachineBasicBlock &MBB) {
LLVM_DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
MaybeDead->dump());
- // Make sure we invalidate any entries in the copy maps before erasing
- // the instruction.
- Tracker.clobberRegister(Reg, *TRI, *TII, UseCopyInstr);
+ // Invalidate all entries in the copy map which are not preserved by
+ // this register mask.
+ for (unsigned RegUnit : TRI->regunits(Reg))
+ if (!PreservedRegUnits.test(RegUnit))
----------------
jsji wrote:
We do, but unfortunately the MIR contains some register class that are downstream only, so we can't provide it now.
The following diff should fix it; however, I don't have reduced MIR available now.
```
diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
index d44b064dcb4b..70dd7d04a153 100644
--- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp
+++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp
@@ -1009,18 +1009,30 @@ void MachineCopyPropagation::ForwardCopyPropagateBlock(MachineBasicBlock &MBB) {
continue;
}
- LLVM_DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
- MaybeDead->dump());
-
// Invalidate all entries in the copy map which are not preserved by
// this register mask.
- for (unsigned RegUnit : TRI->regunits(Reg))
+ bool MIRefedinCopyInfo = false;
+ for (unsigned RegUnit : TRI->regunits(Reg)) {
if (!PreservedRegUnits.test(RegUnit))
Tracker.clobberRegUnit(RegUnit, *TRI, *TII, UseCopyInstr);
+ else {
+ if (MaybeDead == Tracker.findCopyForUnit(RegUnit, *TRI)) {
+ MIRefedinCopyInfo = true;
+ }
+ }
+ }
// erase() will return the next valid iterator pointing to the next
// element after the erased one.
DI = MaybeDeadCopies.erase(DI);
+
+ // Preserved by RegMask, DO NOT remove copy
+ if (MIRefedinCopyInfo)
+ continue;
+
+ LLVM_DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
+ MaybeDead->dump());
+
MaybeDead->eraseFromParent();
Changed = true;
++NumDeletes;
```
https://github.com/llvm/llvm-project/pull/122734
More information about the llvm-commits
mailing list