[llvm] [CodeGen] Use findPHICopyInsertPoint to put insert point (PR #155421)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 26 07:19:27 PDT 2025
https://github.com/AZero13 created https://github.com/llvm/llvm-project/pull/155421
None
>From 66b52755c863b30e334aec11b29e0745866b0fc6 Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Tue, 26 Aug 2025 10:14:18 -0400
Subject: [PATCH] [CodeGen] Use findPHICopyInsertPoint to put insert point
---
llvm/include/llvm/CodeGen/TailDuplicator.h | 7 +++--
llvm/lib/CodeGen/TailDuplicator.cpp | 33 +++++++++++-----------
2 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/TailDuplicator.h b/llvm/include/llvm/CodeGen/TailDuplicator.h
index 8b1f67c416c22..59bee594706ba 100644
--- a/llvm/include/llvm/CodeGen/TailDuplicator.h
+++ b/llvm/include/llvm/CodeGen/TailDuplicator.h
@@ -121,9 +121,10 @@ class TailDuplicator {
SmallVectorImpl<MachineBasicBlock *> &TDBBs,
SmallVectorImpl<MachineInstr *> &Copies,
SmallVectorImpl<MachineBasicBlock *> *CandidatePtr);
- void appendCopies(MachineBasicBlock *MBB,
- SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
- SmallVectorImpl<MachineInstr *> &Copies);
+ void
+ appendCopies(MachineBasicBlock *MBB, MachineBasicBlock *IncomingBB,
+ SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
+ SmallVectorImpl<MachineInstr *> &Copies);
void removeDeadBlock(
MachineBasicBlock *MBB,
diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp
index 5d720fbbf1c61..42bee02be2e00 100644
--- a/llvm/lib/CodeGen/TailDuplicator.cpp
+++ b/llvm/lib/CodeGen/TailDuplicator.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/TailDuplicator.h"
+#include "PHIEliminationUtils.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
@@ -651,14 +652,6 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,
if (PreRegAlloc && MI.isCall())
return false;
- // TailDuplicator::appendCopies will erroneously place COPYs after
- // INLINEASM_BR instructions after 4b0aa5724fea, which demonstrates the same
- // bug that was fixed in f7a53d82c090.
- // FIXME: Use findPHICopyInsertPoint() to find the correct insertion point
- // for the COPY when replacing PHIs.
- if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
- return false;
-
if (MI.isBundle())
InstrCount += MI.getBundleSize();
else if (!MI.isPHI() && !MI.isMetaInstruction())
@@ -926,7 +919,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
duplicateInstruction(&MI, TailBB, PredBB, LocalVRMap, UsedByPhi);
}
}
- appendCopies(PredBB, CopyInfos, Copies);
+ appendCopies(PredBB, TailBB, CopyInfos, Copies);
NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch
@@ -994,7 +987,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
duplicateInstruction(MI, TailBB, PrevBB, LocalVRMap, UsedByPhi);
MI->eraseFromParent();
}
- appendCopies(PrevBB, CopyInfos, Copies);
+ appendCopies(PrevBB, TailBB, CopyInfos, Copies);
} else {
TII->removeBranch(*PrevBB);
// No PHIs to worry about, just splice the instructions over.
@@ -1058,7 +1051,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
// from PredBB.
processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, false);
}
- appendCopies(PredBB, CopyInfos, Copies);
+ appendCopies(PredBB, TailBB, CopyInfos, Copies);
}
return Changed;
@@ -1066,14 +1059,20 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
/// At the end of the block \p MBB generate COPY instructions between registers
/// described by \p CopyInfos. Append resulting instructions to \p Copies.
-void TailDuplicator::appendCopies(MachineBasicBlock *MBB,
- SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
- SmallVectorImpl<MachineInstr*> &Copies) {
- MachineBasicBlock::iterator Loc = MBB->getFirstTerminator();
+void TailDuplicator::appendCopies(
+ MachineBasicBlock *MBB, MachineBasicBlock *IncomingBB,
+ SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
+ SmallVectorImpl<MachineInstr *> &Copies) {
const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
+
for (auto &CI : CopyInfos) {
- auto C = BuildMI(*MBB, Loc, DebugLoc(), CopyD, CI.first)
- .addReg(CI.second.Reg, 0, CI.second.SubReg);
+ unsigned SrcReg = CI.second.Reg;
+ // Find a safe place to insert a copy for this particular source reg.
+ MachineBasicBlock::iterator Loc =
+ llvm::findPHICopyInsertPoint(MBB, IncomingBB, SrcReg);
+
+ MachineInstr *C = BuildMI(*MBB, Loc, DebugLoc(), CopyD, CI.first)
+ .addReg(SrcReg, 0, CI.second.SubReg);
Copies.push_back(C);
}
}
More information about the llvm-commits
mailing list