[llvm] Update Called Globals info when updating Call Site info (PR #122762)
Daniel Paoliello via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 13 10:32:52 PST 2025
https://github.com/dpaoliello created https://github.com/llvm/llvm-project/pull/122762
Fixes the "use after poison" issue introduced by #121516 (see <https://github.com/llvm/llvm-project/pull/121516#issuecomment-2585912395>).
The root cause of this issue is that #121516 introduced "Called Global" information for call instructions modeling how "Call Site" info is stored in the machine function, HOWEVER it didn't copy the copy/move/erase operations for call site information.
The fix is to rename and update the existing copy/move/erase functions so they also take care of Called Global info.
>From 167a5ff3a0b545fe9e9a5bbee2e46051d7ad4a22 Mon Sep 17 00:00:00 2001
From: Daniel Paoliello <danpao at microsoft.com>
Date: Mon, 13 Jan 2025 10:27:34 -0800
Subject: [PATCH] Update Called Globals info when updating Call Site info
---
llvm/include/llvm/CodeGen/MachineFunction.h | 39 ++++----
llvm/include/llvm/CodeGen/MachineInstr.h | 13 +--
llvm/include/llvm/CodeGen/SelectionDAG.h | 6 +-
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 4 +-
llvm/lib/CodeGen/BranchFolding.cpp | 6 +-
llvm/lib/CodeGen/IfConversion.cpp | 18 ++--
llvm/lib/CodeGen/InlineSpiller.cpp | 6 +-
llvm/lib/CodeGen/LiveRangeEdit.cpp | 6 +-
llvm/lib/CodeGen/MIRPrinter.cpp | 19 ++--
llvm/lib/CodeGen/MachineFunction.cpp | 90 +++++++++++--------
llvm/lib/CodeGen/MachineInstr.cpp | 8 +-
llvm/lib/CodeGen/MachineLICM.cpp | 6 +-
llvm/lib/CodeGen/MachineOutliner.cpp | 4 +-
llvm/lib/CodeGen/PeepholeOptimizer.cpp | 6 +-
.../SelectionDAG/ScheduleDAGSDNodes.cpp | 14 +--
llvm/lib/CodeGen/TailDuplicator.cpp | 6 +-
llvm/lib/CodeGen/TargetInstrInfo.cpp | 6 +-
llvm/lib/CodeGen/UnreachableBlockElim.cpp | 6 +-
llvm/lib/CodeGen/XRayInstrumentation.cpp | 4 +-
.../AArch64CleanupLocalDynamicTLSPass.cpp | 6 +-
.../AArch64/AArch64ExpandPseudoInsts.cpp | 8 +-
.../Target/AArch64/AArch64SLSHardening.cpp | 2 +-
llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | 21 +++--
llvm/lib/Target/ARM/ARMSLSHardening.cpp | 2 +-
llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp | 7 +-
llvm/lib/Target/X86/X86ExpandPseudo.cpp | 10 +--
llvm/lib/Target/X86/X86ISelLowering.cpp | 4 +-
.../X86/X86SpeculativeLoadHardening.cpp | 6 +-
28 files changed, 176 insertions(+), 157 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h
index 282aee2a69c4d9..d517b5e6647291 100644
--- a/llvm/include/llvm/CodeGen/MachineFunction.h
+++ b/llvm/include/llvm/CodeGen/MachineFunction.h
@@ -354,11 +354,6 @@ class LLVM_ABI MachineFunction {
/// a table of valid targets for Windows EHCont Guard.
std::vector<MCSymbol *> CatchretTargets;
- /// Mapping of call instruction to the global value and target flags that it
- /// calls, if applicable.
- DenseMap<const MachineInstr *, std::pair<const GlobalValue *, unsigned>>
- CalledGlobalsMap;
-
/// \name Exception Handling
/// \{
@@ -494,6 +489,11 @@ class LLVM_ABI MachineFunction {
SmallVector<ArgRegPair, 1> ArgRegPairs;
};
+ struct CalledGlobalInfo {
+ const GlobalValue *Callee;
+ unsigned TargetFlags;
+ };
+
private:
Delegate *TheDelegate = nullptr;
GISelChangeObserver *Observer = nullptr;
@@ -506,6 +506,11 @@ class LLVM_ABI MachineFunction {
/// instruction if debug entry value support is enabled.
CallSiteInfoMap::iterator getCallSiteInfo(const MachineInstr *MI);
+ using CalledGlobalsMap = DenseMap<const MachineInstr *, CalledGlobalInfo>;
+ /// Mapping of call instruction to the global value and target flags that it
+ /// calls, if applicable.
+ CalledGlobalsMap CalledGlobalsInfo;
+
// Callbacks for insertion and removal.
void handleInsertion(MachineInstr &MI);
void handleRemoval(MachineInstr &MI);
@@ -1189,22 +1194,20 @@ class LLVM_ABI MachineFunction {
/// Tries to get the global and target flags for a call site, if the
/// instruction is a call to a global.
- std::pair<const GlobalValue *, unsigned>
- tryGetCalledGlobal(const MachineInstr *MI) const {
- return CalledGlobalsMap.lookup(MI);
+ CalledGlobalInfo tryGetCalledGlobal(const MachineInstr *MI) const {
+ return CalledGlobalsInfo.lookup(MI);
}
/// Notes the global and target flags for a call site.
- void addCalledGlobal(const MachineInstr *MI,
- std::pair<const GlobalValue *, unsigned> Details) {
+ void addCalledGlobal(const MachineInstr *MI, CalledGlobalInfo Details) {
assert(MI && "MI must not be null");
- assert(Details.first && "Global must not be null");
- CalledGlobalsMap.insert({MI, Details});
+ assert(Details.Callee && "Global must not be null");
+ CalledGlobalsInfo.insert({MI, Details});
}
/// Iterates over the full set of call sites and their associated globals.
auto getCalledGlobals() const {
- return llvm::make_range(CalledGlobalsMap.begin(), CalledGlobalsMap.end());
+ return llvm::make_range(CalledGlobalsInfo.begin(), CalledGlobalsInfo.end());
}
/// \name Exception Handling
@@ -1383,7 +1386,7 @@ class LLVM_ABI MachineFunction {
/// Start tracking the arguments passed to the call \p CallI.
void addCallSiteInfo(const MachineInstr *CallI, CallSiteInfo &&CallInfo) {
- assert(CallI->isCandidateForCallSiteEntry());
+ assert(CallI->isCandidateForAdditionalCallInfo());
bool Inserted =
CallSitesInfo.try_emplace(CallI, std::move(CallInfo)).second;
(void)Inserted;
@@ -1399,18 +1402,16 @@ class LLVM_ABI MachineFunction {
/// Erase the call site info for \p MI. It is used to remove a call
/// instruction from the instruction stream.
- void eraseCallSiteInfo(const MachineInstr *MI);
+ void eraseAdditionalCallInfo(const MachineInstr *MI);
/// Copy the call site info from \p Old to \ New. Its usage is when we are
/// making a copy of the instruction that will be inserted at different point
/// of the instruction stream.
- void copyCallSiteInfo(const MachineInstr *Old,
- const MachineInstr *New);
+ void copyAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New);
/// Move the call site info from \p Old to \New call site info. This function
/// is used when we are replacing one call instruction with another one to
/// the same callee.
- void moveCallSiteInfo(const MachineInstr *Old,
- const MachineInstr *New);
+ void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New);
unsigned getNewDebugInstrNum() {
return ++DebugInstrNumberingCount;
diff --git a/llvm/include/llvm/CodeGen/MachineInstr.h b/llvm/include/llvm/CodeGen/MachineInstr.h
index 1932bb9bd3dab7..efac83d9e1c92c 100644
--- a/llvm/include/llvm/CodeGen/MachineInstr.h
+++ b/llvm/include/llvm/CodeGen/MachineInstr.h
@@ -957,13 +957,14 @@ class MachineInstr
return hasProperty(MCID::Call, Type);
}
- /// Return true if this is a call instruction that may have an associated
- /// call site entry in the debug info.
- bool isCandidateForCallSiteEntry(QueryType Type = IgnoreBundle) const;
+ /// Return true if this is a call instruction that may have an additional
+ /// information associated with it.
+ bool isCandidateForAdditionalCallInfo(QueryType Type = IgnoreBundle) const;
+
/// Return true if copying, moving, or erasing this instruction requires
- /// updating Call Site Info (see \ref copyCallSiteInfo, \ref moveCallSiteInfo,
- /// \ref eraseCallSiteInfo).
- bool shouldUpdateCallSiteInfo() const;
+ /// updating additional call info (see \ref copyCallInfo, \ref moveCallInfo,
+ /// \ref eraseCallInfo).
+ bool shouldUpdateAdditionalCallInfo() const;
/// Returns true if the specified instruction stops control flow
/// from executing the instruction immediately following it. Examples include
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index b31ad11c3ee0ee..ba0538f7084eec 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -287,13 +287,14 @@ class SelectionDAG {
SDDbgInfo *DbgInfo;
using CallSiteInfo = MachineFunction::CallSiteInfo;
+ using CalledGlobalInfo = MachineFunction::CalledGlobalInfo;
struct NodeExtraInfo {
CallSiteInfo CSInfo;
MDNode *HeapAllocSite = nullptr;
MDNode *PCSections = nullptr;
MDNode *MMRA = nullptr;
- std::pair<const GlobalValue *, unsigned> CalledGlobal{};
+ CalledGlobalInfo CalledGlobal{};
bool NoMerge = false;
};
/// Out-of-line extra information for SDNodes.
@@ -2380,8 +2381,7 @@ class SelectionDAG {
SDEI[Node].CalledGlobal = {GV, OpFlags};
}
/// Return CalledGlobal associated with Node, or a nullopt if none exists.
- std::optional<std::pair<const GlobalValue *, unsigned>>
- getCalledGlobal(const SDNode *Node) {
+ std::optional<CalledGlobalInfo> getCalledGlobal(const SDNode *Node) {
auto I = SDEI.find(Node);
return I != SDEI.end()
? std::make_optional(std::move(I->second).CalledGlobal)
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 11de4b61797bda..60d911d0383edc 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -918,7 +918,7 @@ void DwarfDebug::constructCallSiteEntryDIEs(const DISubprogram &SP,
// Skip instructions which aren't calls. Both calls and tail-calling jump
// instructions (e.g TAILJMPd64) are classified correctly here.
- if (!MI.isCandidateForCallSiteEntry())
+ if (!MI.isCandidateForAdditionalCallInfo())
continue;
// Skip instructions marked as frame setup, as they are not interesting to
@@ -2019,7 +2019,7 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
// When describing calls, we need a label for the call instruction.
if (!NoDebug && SP->areAllCallsDescribed() &&
- MI->isCandidateForCallSiteEntry(MachineInstr::AnyInBundle) &&
+ MI->isCandidateForAdditionalCallInfo(MachineInstr::AnyInBundle) &&
(!MI->hasDelaySlot() || delaySlotSupported(*MI))) {
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
bool IsTail = TII->isTailCall(*MI);
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
index 1dd7cccd90119d..bc1a65064a8c52 100644
--- a/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/llvm/lib/CodeGen/BranchFolding.cpp
@@ -165,10 +165,10 @@ void BranchFolder::RemoveDeadBlock(MachineBasicBlock *MBB) {
// Avoid matching if this pointer gets reused.
TriedMerging.erase(MBB);
- // Update call site info.
+ // Update call info.
for (const MachineInstr &MI : *MBB)
- if (MI.shouldUpdateCallSiteInfo())
- MF->eraseCallSiteInfo(&MI);
+ if (MI.shouldUpdateAdditionalCallInfo())
+ MF->eraseAdditionalCallInfo(&MI);
// Remove the block.
MF->erase(MBB);
diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp
index 7b6d1465651d5f..fa817097029aad 100644
--- a/llvm/lib/CodeGen/IfConversion.cpp
+++ b/llvm/lib/CodeGen/IfConversion.cpp
@@ -1834,9 +1834,9 @@ bool IfConverter::IfConvertDiamondCommon(
}
while (NumDups1 != 0) {
// Since this instruction is going to be deleted, update call
- // site info state if the instruction is call instruction.
- if (DI2->shouldUpdateCallSiteInfo())
- MBB2.getParent()->eraseCallSiteInfo(&*DI2);
+ // info state if the instruction is call instruction.
+ if (DI2->shouldUpdateAdditionalCallInfo())
+ MBB2.getParent()->eraseAdditionalCallInfo(&*DI2);
++DI2;
if (DI2 == MBB2.end())
@@ -1883,9 +1883,9 @@ bool IfConverter::IfConvertDiamondCommon(
--DI1;
// Since this instruction is going to be deleted, update call
- // site info state if the instruction is call instruction.
- if (DI1->shouldUpdateCallSiteInfo())
- MBB1.getParent()->eraseCallSiteInfo(&*DI1);
+ // info state if the instruction is call instruction.
+ if (DI1->shouldUpdateAdditionalCallInfo())
+ MBB1.getParent()->eraseAdditionalCallInfo(&*DI1);
// skip dbg_value instructions
if (!DI1->isDebugInstr())
@@ -2169,9 +2169,9 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
break;
MachineInstr *MI = MF.CloneMachineInstr(&I);
- // Make a copy of the call site info.
- if (I.isCandidateForCallSiteEntry())
- MF.copyCallSiteInfo(&I, MI);
+ // Make a copy of the call info.
+ if (I.isCandidateForAdditionalCallInfo())
+ MF.copyAdditionalCallInfo(&I, MI);
ToBBI.BB->insert(ToBBI.BB->end(), MI);
ToBBI.NonPredSize++;
diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp
index f6681540e22862..d98254650a001c 100644
--- a/llvm/lib/CodeGen/InlineSpiller.cpp
+++ b/llvm/lib/CodeGen/InlineSpiller.cpp
@@ -997,9 +997,9 @@ foldMemoryOperand(ArrayRef<std::pair<MachineInstr *, unsigned>> Ops,
HSpiller.rmFromMergeableSpills(*MI, FI))
--NumSpills;
LIS.ReplaceMachineInstrInMaps(*MI, *FoldMI);
- // Update the call site info.
- if (MI->isCandidateForCallSiteEntry())
- MI->getMF()->moveCallSiteInfo(MI, FoldMI);
+ // Update the call info.
+ if (MI->isCandidateForAdditionalCallInfo())
+ MI->getMF()->moveAdditionalCallInfo(MI, FoldMI);
// If we've folded a store into an instruction labelled with debug-info,
// record a substitution from the old operand to the memory operand. Handle
diff --git a/llvm/lib/CodeGen/LiveRangeEdit.cpp b/llvm/lib/CodeGen/LiveRangeEdit.cpp
index 7b630e88b2a604..0b637bf8a9c56a 100644
--- a/llvm/lib/CodeGen/LiveRangeEdit.cpp
+++ b/llvm/lib/CodeGen/LiveRangeEdit.cpp
@@ -253,9 +253,9 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
return false;
LLVM_DEBUG(dbgs() << " folded: " << *FoldMI);
LIS.ReplaceMachineInstrInMaps(*UseMI, *FoldMI);
- // Update the call site info.
- if (UseMI->shouldUpdateCallSiteInfo())
- UseMI->getMF()->moveCallSiteInfo(UseMI, FoldMI);
+ // Update the call info.
+ if (UseMI->shouldUpdateAdditionalCallInfo())
+ UseMI->getMF()->moveAdditionalCallInfo(UseMI, FoldMI);
UseMI->eraseFromParent();
DefMI->addRegisterDead(LI->reg(), nullptr);
Dead.push_back(DefMI);
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp
index b6da495590fe11..0b41c90442a5d2 100644
--- a/llvm/lib/CodeGen/MIRPrinter.cpp
+++ b/llvm/lib/CodeGen/MIRPrinter.cpp
@@ -605,17 +605,14 @@ void MIRPrinter::convertCalledGlobals(yaml::MachineFunction &YMF,
const MachineFunction &MF,
MachineModuleSlotTracker &MST) {
for (const auto &[CallInst, CG] : MF.getCalledGlobals()) {
- // If the call instruction was dropped, then we don't need to print it.
- auto BB = CallInst->getParent();
- if (BB) {
- yaml::MachineInstrLoc CallSite;
- CallSite.BlockNum = CallInst->getParent()->getNumber();
- CallSite.Offset = std::distance(CallInst->getParent()->instr_begin(),
- CallInst->getIterator());
-
- yaml::CalledGlobal YamlCG{CallSite, CG.first->getName().str(), CG.second};
- YMF.CalledGlobals.push_back(YamlCG);
- }
+ yaml::MachineInstrLoc CallSite;
+ CallSite.BlockNum = CallInst->getParent()->getNumber();
+ CallSite.Offset = std::distance(CallInst->getParent()->instr_begin(),
+ CallInst->getIterator());
+
+ yaml::CalledGlobal YamlCG{CallSite, CG.Callee->getName().str(),
+ CG.TargetFlags};
+ YMF.CalledGlobals.push_back(YamlCG);
}
// Sort by position of call instructions.
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index e6b9538fe9a02c..b8dbe834a4d511 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -459,11 +459,11 @@ MachineInstr &MachineFunction::cloneMachineInstrBundle(
break;
++I;
}
- // Copy over call site info to the cloned instruction if needed. If Orig is in
- // a bundle, copyCallSiteInfo takes care of finding the call instruction in
- // the bundle.
- if (Orig.shouldUpdateCallSiteInfo())
- copyCallSiteInfo(&Orig, FirstClone);
+ // Copy over call info to the cloned instruction if needed. If Orig is in
+ // a bundle, copyAdditionalCallInfo takes care of finding the call instruction
+ // in the bundle.
+ if (Orig.shouldUpdateAdditionalCallInfo())
+ copyAdditionalCallInfo(&Orig, FirstClone);
return *FirstClone;
}
@@ -476,8 +476,13 @@ void MachineFunction::deleteMachineInstr(MachineInstr *MI) {
// be triggered during the implementation of support for the
// call site info of a new architecture. If the assertion is triggered,
// back trace will tell where to insert a call to updateCallSiteInfo().
- assert((!MI->isCandidateForCallSiteEntry() || !CallSitesInfo.contains(MI)) &&
+ assert((!MI->isCandidateForAdditionalCallInfo() ||
+ !CallSitesInfo.contains(MI)) &&
"Call site info was not updated!");
+ // Verify that the "called globals" info is in a valid state.
+ assert((!MI->isCandidateForAdditionalCallInfo() ||
+ !CalledGlobalsInfo.contains(MI)) &&
+ "Called globals info was not updated!");
// Strip it for parts. The operand array and the MI object itself are
// independently recyclable.
if (MI->Operands)
@@ -911,7 +916,7 @@ try_next:;
MachineFunction::CallSiteInfoMap::iterator
MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
- assert(MI->isCandidateForCallSiteEntry() &&
+ assert(MI->isCandidateForAdditionalCallInfo() &&
"Call site info refers only to call (MI) candidates");
if (!Target.Options.EmitCallSiteInfo)
@@ -926,59 +931,74 @@ static const MachineInstr *getCallInstr(const MachineInstr *MI) {
for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
getBundleEnd(MI->getIterator())))
- if (BMI.isCandidateForCallSiteEntry())
+ if (BMI.isCandidateForAdditionalCallInfo())
return &BMI;
llvm_unreachable("Unexpected bundle without a call site candidate");
}
-void MachineFunction::eraseCallSiteInfo(const MachineInstr *MI) {
- assert(MI->shouldUpdateCallSiteInfo() &&
- "Call site info refers only to call (MI) candidates or "
+void MachineFunction::eraseAdditionalCallInfo(const MachineInstr *MI) {
+ assert(MI->shouldUpdateAdditionalCallInfo() &&
+ "Call info refers only to call (MI) candidates or "
"candidates inside bundles");
const MachineInstr *CallMI = getCallInstr(MI);
+
CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
- if (CSIt == CallSitesInfo.end())
- return;
- CallSitesInfo.erase(CSIt);
+ if (CSIt != CallSitesInfo.end())
+ CallSitesInfo.erase(CSIt);
+
+ CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(CallMI);
+ if (CGIt != CalledGlobalsInfo.end())
+ CalledGlobalsInfo.erase(CGIt);
}
-void MachineFunction::copyCallSiteInfo(const MachineInstr *Old,
- const MachineInstr *New) {
- assert(Old->shouldUpdateCallSiteInfo() &&
- "Call site info refers only to call (MI) candidates or "
+void MachineFunction::copyAdditionalCallInfo(const MachineInstr *Old,
+ const MachineInstr *New) {
+ assert(Old->shouldUpdateAdditionalCallInfo() &&
+ "Call info refers only to call (MI) candidates or "
"candidates inside bundles");
- if (!New->isCandidateForCallSiteEntry())
- return eraseCallSiteInfo(Old);
+ if (!New->isCandidateForAdditionalCallInfo())
+ return eraseAdditionalCallInfo(Old);
const MachineInstr *OldCallMI = getCallInstr(Old);
CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
- if (CSIt == CallSitesInfo.end())
- return;
+ if (CSIt != CallSitesInfo.end()) {
+ CallSiteInfo CSInfo = CSIt->second;
+ CallSitesInfo[New] = CSInfo;
+ }
- CallSiteInfo CSInfo = CSIt->second;
- CallSitesInfo[New] = CSInfo;
+ CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
+ if (CGIt != CalledGlobalsInfo.end()) {
+ CalledGlobalInfo CGInfo = CGIt->second;
+ CalledGlobalsInfo[New] = CGInfo;
+ }
}
-void MachineFunction::moveCallSiteInfo(const MachineInstr *Old,
- const MachineInstr *New) {
- assert(Old->shouldUpdateCallSiteInfo() &&
- "Call site info refers only to call (MI) candidates or "
+void MachineFunction::moveAdditionalCallInfo(const MachineInstr *Old,
+ const MachineInstr *New) {
+ assert(Old->shouldUpdateAdditionalCallInfo() &&
+ "Call info refers only to call (MI) candidates or "
"candidates inside bundles");
- if (!New->isCandidateForCallSiteEntry())
- return eraseCallSiteInfo(Old);
+ if (!New->isCandidateForAdditionalCallInfo())
+ return eraseAdditionalCallInfo(Old);
const MachineInstr *OldCallMI = getCallInstr(Old);
CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
- if (CSIt == CallSitesInfo.end())
- return;
+ if (CSIt != CallSitesInfo.end()) {
+ CallSiteInfo CSInfo = std::move(CSIt->second);
+ CallSitesInfo.erase(CSIt);
+ CallSitesInfo[New] = CSInfo;
+ }
- CallSiteInfo CSInfo = std::move(CSIt->second);
- CallSitesInfo.erase(CSIt);
- CallSitesInfo[New] = CSInfo;
+ CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
+ if (CGIt != CalledGlobalsInfo.end()) {
+ CalledGlobalInfo CGInfo = std::move(CGIt->second);
+ CalledGlobalsInfo.erase(CGIt);
+ CalledGlobalsInfo[New] = CGInfo;
+ }
}
void MachineFunction::setDebugInstrNumberingCount(unsigned Num) {
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp
index 958efa79d7e9d5..ef36dfc4721975 100644
--- a/llvm/lib/CodeGen/MachineInstr.cpp
+++ b/llvm/lib/CodeGen/MachineInstr.cpp
@@ -773,7 +773,7 @@ void MachineInstr::eraseFromBundle() {
getParent()->erase_instr(this);
}
-bool MachineInstr::isCandidateForCallSiteEntry(QueryType Type) const {
+bool MachineInstr::isCandidateForAdditionalCallInfo(QueryType Type) const {
if (!isCall(Type))
return false;
switch (getOpcode()) {
@@ -786,10 +786,10 @@ bool MachineInstr::isCandidateForCallSiteEntry(QueryType Type) const {
return true;
}
-bool MachineInstr::shouldUpdateCallSiteInfo() const {
+bool MachineInstr::shouldUpdateAdditionalCallInfo() const {
if (isBundle())
- return isCandidateForCallSiteEntry(MachineInstr::AnyInBundle);
- return isCandidateForCallSiteEntry();
+ return isCandidateForAdditionalCallInfo(MachineInstr::AnyInBundle);
+ return isCandidateForAdditionalCallInfo();
}
unsigned MachineInstr::getNumExplicitOperands() const {
diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp
index d1d5509dc482a2..1f6de0d6b24164 100644
--- a/llvm/lib/CodeGen/MachineLICM.cpp
+++ b/llvm/lib/CodeGen/MachineLICM.cpp
@@ -1459,9 +1459,9 @@ MachineInstr *MachineLICMImpl::ExtractHoistableLoad(MachineInstr *MI,
// Otherwise we successfully unfolded a load that we can hoist.
- // Update the call site info.
- if (MI->shouldUpdateCallSiteInfo())
- MF.eraseCallSiteInfo(MI);
+ // Update the call info.
+ if (MI->shouldUpdateAdditionalCallInfo())
+ MF.eraseAdditionalCallInfo(MI);
MI->eraseFromParent();
return NewMIs[0];
diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp
index 4c5489434c69bb..e3fe9494acef8a 100644
--- a/llvm/lib/CodeGen/MachineOutliner.cpp
+++ b/llvm/lib/CodeGen/MachineOutliner.cpp
@@ -1149,8 +1149,8 @@ bool MachineOutliner::outline(
InstrUseRegs.insert(MOP.getReg());
}
}
- if (MI->isCandidateForCallSiteEntry())
- MI->getMF()->eraseCallSiteInfo(MI);
+ if (MI->isCandidateForAdditionalCallInfo())
+ MI->getMF()->eraseAdditionalCallInfo(MI);
}
for (const Register &I : DefRegs)
diff --git a/llvm/lib/CodeGen/PeepholeOptimizer.cpp b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
index ad5796aa7f8c2a..5d76d3688dfefa 100644
--- a/llvm/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
@@ -1868,9 +1868,9 @@ bool PeepholeOptimizer::run(MachineFunction &MF) {
LocalMIs.erase(MI);
LocalMIs.erase(DefMI);
LocalMIs.insert(FoldMI);
- // Update the call site info.
- if (MI->shouldUpdateCallSiteInfo())
- MI->getMF()->moveCallSiteInfo(MI, FoldMI);
+ // Update the call info.
+ if (MI->shouldUpdateAdditionalCallInfo())
+ MI->getMF()->moveAdditionalCallInfo(MI, FoldMI);
MI->eraseFromParent();
DefMI->eraseFromParent();
MRI->markUsesInDebugValueAsUndef(FoldedReg);
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
index bafe26ff7d6b76..ac6c44ec635451 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
@@ -888,9 +888,13 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) {
MI = &*std::next(Before);
}
- if (MI->isCandidateForCallSiteEntry() &&
- DAG->getTarget().Options.EmitCallSiteInfo) {
- MF.addCallSiteInfo(MI, DAG->getCallSiteInfo(Node));
+ if (MI->isCandidateForAdditionalCallInfo()) {
+ if (DAG->getTarget().Options.EmitCallSiteInfo)
+ MF.addCallSiteInfo(MI, DAG->getCallSiteInfo(Node));
+
+ if (auto CalledGlobal = DAG->getCalledGlobal(Node))
+ if (CalledGlobal->Callee)
+ MF.addCalledGlobal(MI, *CalledGlobal);
}
if (DAG->getNoMergeSiteInfo(Node)) {
@@ -908,10 +912,6 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) {
It->setMMRAMetadata(MF, MMRA);
}
- if (auto CalledGlobal = DAG->getCalledGlobal(Node))
- if (CalledGlobal->first)
- MF.addCalledGlobal(MI, *CalledGlobal);
-
return MI;
};
diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp
index d0013923838b35..f5346c8805733c 100644
--- a/llvm/lib/CodeGen/TailDuplicator.cpp
+++ b/llvm/lib/CodeGen/TailDuplicator.cpp
@@ -1068,10 +1068,10 @@ void TailDuplicator::removeDeadBlock(
LLVM_DEBUG(dbgs() << "\nRemoving MBB: " << *MBB);
MachineFunction *MF = MBB->getParent();
- // Update the call site info.
+ // Update the call info.
for (const MachineInstr &MI : *MBB)
- if (MI.shouldUpdateCallSiteInfo())
- MF->eraseCallSiteInfo(&MI);
+ if (MI.shouldUpdateAdditionalCallInfo())
+ MF->eraseAdditionalCallInfo(&MI);
if (RemovalCallback)
(*RemovalCallback)(MBB);
diff --git a/llvm/lib/CodeGen/TargetInstrInfo.cpp b/llvm/lib/CodeGen/TargetInstrInfo.cpp
index 770b851f3607a0..7a905b65f26e52 100644
--- a/llvm/lib/CodeGen/TargetInstrInfo.cpp
+++ b/llvm/lib/CodeGen/TargetInstrInfo.cpp
@@ -150,12 +150,12 @@ TargetInstrInfo::ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
// Save off the debug loc before erasing the instruction.
DebugLoc DL = Tail->getDebugLoc();
- // Update call site info and remove all the dead instructions
+ // Update call info and remove all the dead instructions
// from the end of MBB.
while (Tail != MBB->end()) {
auto MI = Tail++;
- if (MI->shouldUpdateCallSiteInfo())
- MBB->getParent()->eraseCallSiteInfo(&*MI);
+ if (MI->shouldUpdateAdditionalCallInfo())
+ MBB->getParent()->eraseAdditionalCallInfo(&*MI);
MBB->erase(MI);
}
diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
index 6e3b69b4b96116..aa4ccec3338a9c 100644
--- a/llvm/lib/CodeGen/UnreachableBlockElim.cpp
+++ b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
@@ -141,10 +141,10 @@ bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
// Actually remove the blocks now.
for (MachineBasicBlock *BB : DeadBlocks) {
- // Remove any call site information for calls in the block.
+ // Remove any call information for calls in the block.
for (auto &I : BB->instrs())
- if (I.shouldUpdateCallSiteInfo())
- BB->getParent()->eraseCallSiteInfo(&I);
+ if (I.shouldUpdateAdditionalCallInfo())
+ BB->getParent()->eraseAdditionalCallInfo(&I);
BB->eraseFromParent();
}
diff --git a/llvm/lib/CodeGen/XRayInstrumentation.cpp b/llvm/lib/CodeGen/XRayInstrumentation.cpp
index 9035e10716c3a2..0873d9956356e2 100644
--- a/llvm/lib/CodeGen/XRayInstrumentation.cpp
+++ b/llvm/lib/CodeGen/XRayInstrumentation.cpp
@@ -112,8 +112,8 @@ void XRayInstrumentation::replaceRetWithPatchableRet(
for (auto &MO : T.operands())
MIB.add(MO);
Terminators.push_back(&T);
- if (T.shouldUpdateCallSiteInfo())
- MF.eraseCallSiteInfo(&T);
+ if (T.shouldUpdateAdditionalCallInfo())
+ MF.eraseAdditionalCallInfo(&T);
}
}
}
diff --git a/llvm/lib/Target/AArch64/AArch64CleanupLocalDynamicTLSPass.cpp b/llvm/lib/Target/AArch64/AArch64CleanupLocalDynamicTLSPass.cpp
index 10661b64146125..a85c7b2c725362 100644
--- a/llvm/lib/Target/AArch64/AArch64CleanupLocalDynamicTLSPass.cpp
+++ b/llvm/lib/Target/AArch64/AArch64CleanupLocalDynamicTLSPass.cpp
@@ -105,9 +105,9 @@ struct LDTLSCleanup : public MachineFunctionPass {
TII->get(TargetOpcode::COPY), AArch64::X0)
.addReg(TLSBaseAddrReg);
- // Update the call site info.
- if (I.shouldUpdateCallSiteInfo())
- I.getMF()->eraseCallSiteInfo(&I);
+ // Update the call info.
+ if (I.shouldUpdateAdditionalCallInfo())
+ I.getMF()->eraseAdditionalCallInfo(&I);
// Erase the TLS_base_addr instruction.
I.eraseFromParent();
diff --git a/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp b/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
index bd542f62dccb49..b44c48afe705ba 100644
--- a/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
@@ -879,8 +879,8 @@ bool AArch64ExpandPseudo::expandCALL_RVMARKER(
.add(RVTarget)
.getInstr();
- if (MI.shouldUpdateCallSiteInfo())
- MBB.getParent()->moveCallSiteInfo(&MI, OriginalCall);
+ if (MI.shouldUpdateAdditionalCallInfo())
+ MBB.getParent()->moveAdditionalCallInfo(&MI, OriginalCall);
MI.eraseFromParent();
finalizeBundle(MBB, OriginalCall->getIterator(),
@@ -908,8 +908,8 @@ bool AArch64ExpandPseudo::expandCALL_BTI(MachineBasicBlock &MBB,
.addImm(36)
.getInstr();
- if (MI.shouldUpdateCallSiteInfo())
- MBB.getParent()->moveCallSiteInfo(&MI, Call);
+ if (MI.shouldUpdateAdditionalCallInfo())
+ MBB.getParent()->moveAdditionalCallInfo(&MI, Call);
MI.eraseFromParent();
finalizeBundle(MBB, Call->getIterator(), std::next(BTI->getIterator()));
diff --git a/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp b/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp
index a8bd899a09b857..91410a5af3dc3f 100644
--- a/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp
+++ b/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp
@@ -475,7 +475,7 @@ void SLSHardeningInserter::convertBLRToBL(
BL->removeOperand(SecondOpIdxToRemove);
// Now copy over the implicit operands from the original BLR
BL->copyImplicitOps(MF, BLR);
- MF.moveCallSiteInfo(&BLR, BL);
+ MF.moveAdditionalCallInfo(&BLR, BL);
// Also add the register operands of the original BLR* instruction
// as being used in the called thunk.
for (unsigned OpIdx = 0; OpIdx < NumRegOperands; ++OpIdx) {
diff --git a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
index 3fda15a4290178..2e5dc09c00ce62 100644
--- a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
+++ b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
@@ -2300,10 +2300,9 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
for (unsigned i = 2, e = MBBI->getNumOperands(); i != e; ++i)
NewMI->addOperand(MBBI->getOperand(i));
-
- // Update call site info and delete the pseudo instruction TCRETURN.
- if (MI.isCandidateForCallSiteEntry())
- MI.getMF()->moveCallSiteInfo(&MI, &*NewMI);
+ // Update call info and delete the pseudo instruction TCRETURN.
+ if (MI.isCandidateForAdditionalCallInfo())
+ MI.getMF()->moveAdditionalCallInfo(&MI, &*NewMI);
// Copy nomerge flag over to new instruction.
if (MI.getFlag(MachineInstr::NoMerge))
NewMI->setFlag(MachineInstr::NoMerge);
@@ -2414,8 +2413,8 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
for (const MachineOperand &MO : llvm::drop_begin(MI.operands()))
NewCall->addOperand(MO);
- if (MI.isCandidateForCallSiteEntry())
- MI.getMF()->moveCallSiteInfo(&MI, NewCall.getInstr());
+ if (MI.isCandidateForAdditionalCallInfo())
+ MI.getMF()->moveAdditionalCallInfo(&MI, NewCall.getInstr());
CMSERestoreFPRegs(MBB, MBBI, DL, OriginalClearRegs); // restore FP registers
@@ -2652,9 +2651,9 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MIB.cloneMemRefs(MI);
MIB.copyImplicitOps(MI);
- // Update the call site info.
- if (MI.isCandidateForCallSiteEntry())
- MF->moveCallSiteInfo(&MI, &*MIB);
+ // Update the call info.
+ if (MI.isCandidateForAdditionalCallInfo())
+ MF->moveAdditionalCallInfo(&MI, &*MIB);
MI.eraseFromParent();
return true;
}
@@ -3254,8 +3253,8 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MIB.cloneMemRefs(MI);
for (unsigned i = 0; i < MI.getNumOperands(); ++i)
MIB.add(MI.getOperand(i));
- if (MI.isCandidateForCallSiteEntry())
- MF.moveCallSiteInfo(&MI, MIB.getInstr());
+ if (MI.isCandidateForAdditionalCallInfo())
+ MF.moveAdditionalCallInfo(&MI, MIB.getInstr());
MIBundleBuilder Bundler(MBB, MI);
Bundler.append(MIB);
Bundler.append(BuildMI(MF, MI.getDebugLoc(), TII->get(ARM::t2BTI)));
diff --git a/llvm/lib/Target/ARM/ARMSLSHardening.cpp b/llvm/lib/Target/ARM/ARMSLSHardening.cpp
index d77db17090feb5..23acc3cfba68e0 100644
--- a/llvm/lib/Target/ARM/ARMSLSHardening.cpp
+++ b/llvm/lib/Target/ARM/ARMSLSHardening.cpp
@@ -348,7 +348,7 @@ MachineBasicBlock &ARMSLSHardening::ConvertIndirectCallToIndirectJump(
BL->removeOperand(SecondOpIdxToRemove);
// Now copy over the implicit operands from the original IndirectCall
BL->copyImplicitOps(MF, IndirectCall);
- MF.moveCallSiteInfo(&IndirectCall, BL);
+ MF.moveAdditionalCallInfo(&IndirectCall, BL);
// Also add the register called in the IndirectCall as being used in the
// called thunk.
BL->addOperand(MachineOperand::CreateReg(Reg, false /*isDef*/, true /*isImp*/,
diff --git a/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp b/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
index 99d7e5c57a9bc5..3a9421fae0f607 100644
--- a/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
+++ b/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
@@ -563,9 +563,10 @@ Iter MipsDelaySlotFiller::replaceWithCompactBranch(MachineBasicBlock &MBB,
Branch = TII->genInstrWithNewOpc(NewOpcode, Branch);
auto *ToErase = cast<MachineInstr>(&*std::next(Branch));
- // Update call site info for the Branch.
- if (ToErase->shouldUpdateCallSiteInfo())
- ToErase->getMF()->moveCallSiteInfo(ToErase, cast<MachineInstr>(&*Branch));
+ // Update call info for the Branch.
+ if (ToErase->shouldUpdateAdditionalCallInfo())
+ ToErase->getMF()->moveAdditionalCallInfo(ToErase,
+ cast<MachineInstr>(&*Branch));
ToErase->eraseFromParent();
return Branch;
}
diff --git a/llvm/lib/Target/X86/X86ExpandPseudo.cpp b/llvm/lib/Target/X86/X86ExpandPseudo.cpp
index dc4fe07826191b..fc8a0eaed140d0 100644
--- a/llvm/lib/Target/X86/X86ExpandPseudo.cpp
+++ b/llvm/lib/Target/X86/X86ExpandPseudo.cpp
@@ -230,8 +230,8 @@ void X86ExpandPseudo::expandCALL_RVMARKER(MachineBasicBlock &MBB,
.addReg(TargetReg, RegState::Define)
.addReg(X86::RAX)
.getInstr();
- if (MI.shouldUpdateCallSiteInfo())
- MBB.getParent()->moveCallSiteInfo(&MI, Marker);
+ if (MI.shouldUpdateAdditionalCallInfo())
+ MBB.getParent()->moveAdditionalCallInfo(&MI, Marker);
// Emit call to ObjC runtime.
const uint32_t *RegMask =
@@ -360,9 +360,9 @@ bool X86ExpandPseudo::expandMI(MachineBasicBlock &MBB,
NewMI.copyImplicitOps(*MBBI->getParent()->getParent(), *MBBI);
NewMI.setCFIType(*MBB.getParent(), MI.getCFIType());
- // Update the call site info.
- if (MBBI->isCandidateForCallSiteEntry())
- MBB.getParent()->moveCallSiteInfo(&*MBBI, &NewMI);
+ // Update the call info.
+ if (MBBI->isCandidateForAdditionalCallInfo())
+ MBB.getParent()->moveAdditionalCallInfo(&*MBBI, &NewMI);
// Delete the pseudo instruction TCRETURN.
MBB.erase(MBBI);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index add51fac4b9e62..434d88db04163b 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -60845,8 +60845,8 @@ X86TargetLowering::EmitKCFICheck(MachineBasicBlock &MBB,
MBBI = MBB.insert(OrigCall, NewMI);
assert(MBBI->isCall() &&
"Unexpected instruction after memory operand unfolding");
- if (OrigCall->shouldUpdateCallSiteInfo())
- MF.moveCallSiteInfo(&*OrigCall, &*MBBI);
+ if (OrigCall->shouldUpdateAdditionalCallInfo())
+ MF.moveAdditionalCallInfo(&*OrigCall, &*MBBI);
MBBI->setCFIType(MF, OrigCall->getCFIType());
OrigCall->eraseFromParent();
break;
diff --git a/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp b/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp
index ce5a1bce5b107f..0ad17cc877b9f1 100644
--- a/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp
+++ b/llvm/lib/Target/X86/X86SpeculativeLoadHardening.cpp
@@ -918,9 +918,9 @@ void X86SpeculativeLoadHardeningPass::unfoldCallAndJumpLoads(
for (auto *NewMI : NewMIs)
MBB.insert(MI.getIterator(), NewMI);
- // Update the call site info.
- if (MI.isCandidateForCallSiteEntry())
- MF.eraseCallSiteInfo(&MI);
+ // Update the call info.
+ if (MI.isCandidateForAdditionalCallInfo())
+ MF.eraseAdditionalCallInfo(&MI);
MI.eraseFromParent();
LLVM_DEBUG({
More information about the llvm-commits
mailing list