[llvm] r364536 - [Backend] Keep call site info valid through the backend
Finkel, Hal J. via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 27 09:02:09 PDT 2019
It looks like we've just introduces a new invariant that must be
maintained by MI passes. Please send a note to llvm-dev to warn target
maintainers (including out-of-tree-target developers) and add something
about this in the release notes.
Thanks again,
Hal
On 6/27/19 8:10 AM, Djordje Todorovic via llvm-commits wrote:
> Author: djtodoro
> Date: Thu Jun 27 06:10:29 2019
> New Revision: 364536
>
> URL: http://llvm.org/viewvc/llvm-project?rev=364536&view=rev
> Log:
> [Backend] Keep call site info valid through the backend
>
> Handle call instruction replacements and deletions in order to preserve
> valid state of the call site info of the MachineFunction.
>
> NOTE: If the call site info is enabled for a new target, the assertion from
> the MachineFunction::DeleteMachineInstr() should help to locate places
> where the updateCallSiteInfo() should be called in order to preserve valid
> state of the call site info.
>
> ([10/13] Introduce the debug entry values.)
>
> Co-authored-by: Ananth Sowda <asowda at cisco.com>
> Co-authored-by: Nikola Prica <nikola.prica at rt-rk.com>
> Co-authored-by: Ivan Baev <ibaev at cisco.com>
>
> Differential Revision: https://reviews.llvm.org/D61062
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/MachineFunction.h
> llvm/trunk/lib/CodeGen/InlineSpiller.cpp
> llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp
> llvm/trunk/lib/CodeGen/MachineFunction.cpp
> llvm/trunk/lib/CodeGen/MachineOutliner.cpp
> llvm/trunk/lib/CodeGen/PeepholeOptimizer.cpp
> llvm/trunk/lib/CodeGen/TargetInstrInfo.cpp
> llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp
> llvm/trunk/lib/Target/X86/X86ExpandPseudo.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFunction.h?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineFunction.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineFunction.h Thu Jun 27 06:10:29 2019
> @@ -976,6 +976,12 @@ public:
> return CallSitesInfo;
> }
>
> + /// Update call sites info by deleting entry for \p Old call instruction.
> + /// If \p New is present then transfer \p Old call info to it. This function
> + /// should be called before removing call instruction or before replacing
> + /// call instruction with new one.
> + void updateCallSiteInfo(const MachineInstr *Old,
> + const MachineInstr *New = nullptr);
> };
>
> //===--------------------------------------------------------------------===//
>
> Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/InlineSpiller.cpp (original)
> +++ llvm/trunk/lib/CodeGen/InlineSpiller.cpp Thu Jun 27 06:10:29 2019
> @@ -868,6 +868,8 @@ foldMemoryOperand(ArrayRef<std::pair<Mac
> HSpiller.rmFromMergeableSpills(*MI, FI))
> --NumSpills;
> LIS.ReplaceMachineInstrInMaps(*MI, *FoldMI);
> + if (MI->isCall())
> + MI->getMF()->updateCallSiteInfo(MI, FoldMI);
> MI->eraseFromParent();
>
> // Insert any new instructions other than FoldMI into the LIS maps.
>
> Modified: llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp Thu Jun 27 06:10:29 2019
> @@ -232,6 +232,8 @@ bool LiveRangeEdit::foldAsLoad(LiveInter
> LLVM_DEBUG(dbgs() << " folded: " << *FoldMI);
> LIS.ReplaceMachineInstrInMaps(*UseMI, *FoldMI);
> UseMI->eraseFromParent();
> + if (UseMI->isCall())
> + UseMI->getMF()->updateCallSiteInfo(UseMI, FoldMI);
> DefMI->addRegisterDead(LI->reg, nullptr);
> Dead.push_back(DefMI);
> ++NumDCEFoldedLoads;
>
> Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Thu Jun 27 06:10:29 2019
> @@ -363,6 +363,13 @@ MachineInstr &MachineFunction::CloneMach
> /// ~MachineInstr() destructor must be empty.
> void
> MachineFunction::DeleteMachineInstr(MachineInstr *MI) {
> + // Verify that a call site info is at valid state. This assertion should
> + // 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->isCall(MachineInstr::IgnoreBundle) ||
> + CallSitesInfo.find(MI) == CallSitesInfo.end()) &&
> + "Call site info was not updated!");
> // Strip it for parts. The operand array and the MI object itself are
> // independently recyclable.
> if (MI->Operands)
> @@ -826,6 +833,22 @@ void MachineFunction::addCodeViewHeapAll
> CodeViewHeapAllocSites.push_back(std::make_tuple(BeginLabel, EndLabel, DI));
> }
>
> +void MachineFunction::updateCallSiteInfo(const MachineInstr *Old,
> + const MachineInstr *New) {
> + if (!Target.Options.EnableDebugEntryValues || Old == New)
> + return;
> +
> + assert(Old->isCall() && (!New || New->isCall()) &&
> + "Call site info referes only to call instructions!");
> + CallSiteInfoMap::iterator CSIt = CallSitesInfo.find(Old);
> + if (CSIt == CallSitesInfo.end())
> + return;
> + CallSiteInfo CSInfo = std::move(CSIt->second);
> + CallSitesInfo.erase(CSIt);
> + if (New)
> + CallSitesInfo[New] = CSInfo;
> +}
> +
> /// \}
>
> //===----------------------------------------------------------------------===//
>
> Modified: llvm/trunk/lib/CodeGen/MachineOutliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineOutliner.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineOutliner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineOutliner.cpp Thu Jun 27 06:10:29 2019
> @@ -1245,8 +1245,9 @@ bool MachineOutliner::outline(Module &M,
> if (MBB.getParent()->getProperties().hasProperty(
> MachineFunctionProperties::Property::TracksLiveness)) {
> // Helper lambda for adding implicit def operands to the call
> - // instruction.
> - auto CopyDefs = [&CallInst](MachineInstr &MI) {
> + // instruction. It also updates call site information for moved
> + // code.
> + auto CopyDefsAndUpdateCalls = [&CallInst](MachineInstr &MI) {
> for (MachineOperand &MOP : MI.operands()) {
> // Skip over anything that isn't a register.
> if (!MOP.isReg())
> @@ -1258,13 +1259,16 @@ bool MachineOutliner::outline(Module &M,
> MOP.getReg(), true, /* isDef = true */
> true /* isImp = true */));
> }
> + if (MI.isCall())
> + MI.getMF()->updateCallSiteInfo(&MI);
> };
> // Copy over the defs in the outlined range.
> // First inst in outlined range <-- Anything that's defined in this
> // ... .. range has to be added as an
> // implicit Last inst in outlined range <-- def to the call
> - // instruction.
> - std::for_each(CallInst, std::next(EndIt), CopyDefs);
> + // instruction. Also remove call site information for outlined block
> + // of code.
> + std::for_each(CallInst, std::next(EndIt), CopyDefsAndUpdateCalls);
> }
>
> // Erase from the point after where the call was inserted up to, and
>
> Modified: llvm/trunk/lib/CodeGen/PeepholeOptimizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PeepholeOptimizer.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/PeepholeOptimizer.cpp (original)
> +++ llvm/trunk/lib/CodeGen/PeepholeOptimizer.cpp Thu Jun 27 06:10:29 2019
> @@ -1777,6 +1777,8 @@ bool PeepholeOptimizer::runOnMachineFunc
> LocalMIs.erase(MI);
> LocalMIs.erase(DefMI);
> LocalMIs.insert(FoldMI);
> + if (MI->isCall())
> + MI->getMF()->updateCallSiteInfo(MI, FoldMI);
> MI->eraseFromParent();
> DefMI->eraseFromParent();
> MRI->markUsesInDebugValueAsUndef(FoldedReg);
>
> Modified: llvm/trunk/lib/CodeGen/TargetInstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetInstrInfo.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetInstrInfo.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetInstrInfo.cpp Thu Jun 27 06:10:29 2019
> @@ -137,8 +137,14 @@ TargetInstrInfo::ReplaceTailWithBranchTo
> // Save off the debug loc before erasing the instruction.
> DebugLoc DL = Tail->getDebugLoc();
>
> - // Remove all the dead instructions from the end of MBB.
> - MBB->erase(Tail, MBB->end());
> + // Update call site info and remove all the dead instructions
> + // from the end of MBB.
> + while (Tail != MBB->end()) {
> + auto MI = Tail++;
> + if (MI->isCall())
> + MBB->getParent()->updateCallSiteInfo(&*MI);
> + MBB->erase(MI);
> + }
>
> // If MBB isn't immediately before MBB, insert a branch to it.
> if (++MachineFunction::iterator(MBB) != MachineFunction::iterator(NewDest))
>
> Modified: llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp (original)
> +++ llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp Thu Jun 27 06:10:29 2019
> @@ -110,6 +110,8 @@ void XRayInstrumentation::replaceRetWith
> for (auto &MO : T.operands())
> MIB.add(MO);
> Terminators.push_back(&T);
> + if (T.isCall())
> + MF.updateCallSiteInfo(&T);
> }
> }
> }
>
> Modified: llvm/trunk/lib/Target/X86/X86ExpandPseudo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ExpandPseudo.cpp?rev=364536&r1=364535&r2=364536&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ExpandPseudo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ExpandPseudo.cpp Thu Jun 27 06:10:29 2019
> @@ -270,6 +270,7 @@ bool X86ExpandPseudo::ExpandMI(MachineBa
>
> MachineInstr &NewMI = *std::prev(MBBI);
> NewMI.copyImplicitOps(*MBBI->getParent()->getParent(), *MBBI);
> + MBB.getParent()->updateCallSiteInfo(&*MBBI, &NewMI);
>
> // Delete the pseudo instruction TCRETURN.
> MBB.erase(MBBI);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list