-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[aarch64][win] Update Called Globals info when updating Call Site info #122762
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-selectiondag @llvm/pr-subscribers-backend-aarch64 Author: Daniel Paoliello (dpaoliello) ChangesFixes the "use after poison" issue introduced by #121516 (see <#121516 (comment)>). 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. Patch is 35.60 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/122762.diff 28 Files Affected:
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:...
[truncated]
|
@llvm/pr-subscribers-backend-arm Author: Daniel Paoliello (dpaoliello) ChangesFixes the "use after poison" issue introduced by #121516 (see <#121516 (comment)>). 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. Patch is 35.60 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/122762.diff 28 Files Affected:
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:...
[truncated]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
On a related note, should we skip constructing the CalledGlobalsMap if we know nothing will actually consume the information?
I'm a little hesitant to do this, since I can imagine that condition becoming more complex as more things consume the information, but I'll consider it with adding it with the function attribute (since that'll be easier to check than the LLVM arg). |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/16/builds/11920 Here is the relevant piece of the build log for the reference
|
… import call optimization, and remove LLVM flag (#122831) Switches import call optimization from being enabled by an LLVM flag to instead using a module attribute, and creates a new Clang flag that will set that attribute. This addresses the concern raised in the original PR: <#121516 (comment)> This change also only creates the Called Global info if the module attribute is present, addressing this concern: <#122762 (review)>
…tribute for import call optimization, and remove LLVM flag (#122831) Switches import call optimization from being enabled by an LLVM flag to instead using a module attribute, and creates a new Clang flag that will set that attribute. This addresses the concern raised in the original PR: <llvm/llvm-project#121516 (comment)> This change also only creates the Called Global info if the module attribute is present, addressing this concern: <llvm/llvm-project#122762 (review)>
Fixes the "use after poison" issue introduced by #121516 (see #121516 (comment)).
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.