[llvm-commits] [llvm] r139698 - in /llvm/trunk/lib/CodeGen: SplitKit.cpp SplitKit.h
Chandler Carruth
chandlerc at google.com
Wed Sep 14 09:50:57 PDT 2011
On Wed, Sep 14, 2011 at 9:45 AM, Jakob Stoklund Olesen <stoklund at 2pi.dk>wrote:
> Author: stoklund
> Date: Wed Sep 14 11:45:39 2011
> New Revision: 139698
>
> URL: http://llvm.org/viewvc/llvm-project?rev=139698&view=rev
> Log:
> Hoist back-copies to the least busy dominator.
>
> When a back-copy is hoisted to the nearest common dominator, keep
> looking up the dominator tree for a less loopy dominator, and place the
> back-copy there instead.
>
> Don't do this when a single existing back-copy dominates all the others.
> Assume the client knows what he is doing, and keep the dominating
> back-copy.
>
> This prevents us from hoisting back-copies into loops in most cases. If
> a value is defined in a loop with multiple exits, we may still hoist
> back-copies into that loop. That is the speed/size tradeoff.
>
This sounds quite cool; testcase?
>
> Modified:
> llvm/trunk/lib/CodeGen/SplitKit.cpp
> llvm/trunk/lib/CodeGen/SplitKit.h
>
> Modified: llvm/trunk/lib/CodeGen/SplitKit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.cpp?rev=139698&r1=139697&r2=139698&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SplitKit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SplitKit.cpp Wed Sep 14 11:45:39 2011
> @@ -20,6 +20,7 @@
> #include "llvm/CodeGen/LiveIntervalAnalysis.h"
> #include "llvm/CodeGen/MachineDominators.h"
> #include "llvm/CodeGen/MachineInstrBuilder.h"
> +#include "llvm/CodeGen/MachineLoopInfo.h"
> #include "llvm/CodeGen/MachineRegisterInfo.h"
> #include "llvm/Support/Debug.h"
> #include "llvm/Support/raw_ostream.h"
> @@ -635,6 +636,60 @@
> }
> }
>
> +MachineBasicBlock*
> +SplitEditor::findShallowDominator(MachineBasicBlock *MBB,
> + MachineBasicBlock *DefMBB) {
> + if (MBB == DefMBB)
> + return MBB;
> + assert(MDT.dominates(DefMBB, MBB) && "MBB must be dominated by the
> def.");
> +
> + const MachineLoopInfo &Loops = SA.Loops;
> + const MachineLoop *DefLoop = Loops.getLoopFor(DefMBB);
> + MachineDomTreeNode *DefDomNode = MDT[DefMBB];
> +
> + // Best candidate so far.
> + MachineBasicBlock *BestMBB = MBB;
> + unsigned BestDepth = UINT_MAX;
> +
> + for (;;) {
> + const MachineLoop *Loop = Loops.getLoopFor(MBB);
> +
> + // MBB isn't in a loop, it doesn't get any better. All dominators
> have a
> + // higher frequency by definition.
> + if (!Loop) {
> + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates
> BB#"
> + << MBB->getNumber() << " at depth 0\n");
> + return MBB;
> + }
> +
> + // We'll never be able to exit the DefLoop.
> + if (Loop == DefLoop) {
> + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates
> BB#"
> + << MBB->getNumber() << " in the same loop\n");
> + return MBB;
> + }
> +
> + // Least busy dominator seen so far.
> + unsigned Depth = Loop->getLoopDepth();
> + if (Depth < BestDepth) {
> + BestMBB = MBB;
> + BestDepth = Depth;
> + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates
> BB#"
> + << MBB->getNumber() << " at depth " << Depth << '\n');
> + }
> +
> + // Leave loop by going to the immediate dominator of the loop header.
> + // This is a bigger stride than simply walking up the dominator tree.
> + MachineDomTreeNode *IDom = MDT[Loop->getHeader()]->getIDom();
> +
> + // Too far up the dominator tree?
> + if (!IDom || !MDT.dominates(DefDomNode, IDom))
> + return BestMBB;
> +
> + MBB = IDom->getBlock();
> + }
> +}
> +
> void SplitEditor::hoistCopiesForSize() {
> // Get the complement interval, always RegIdx 0.
> LiveInterval *LI = Edit->get(0);
> @@ -706,10 +761,14 @@
> DomPair &Dom = NearestDom[i];
> if (!Dom.first || Dom.second.isValid())
> continue;
> - // This value needs a hoisted copy inserted at the end of Dom.second.
> + // This value needs a hoisted copy inserted at the end of Dom.first.
> + VNInfo *ParentVNI = Parent->getValNumInfo(i);
> + MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->def);
> + // Get a less loopy dominator than Dom.first.
> + Dom.first = findShallowDominator(Dom.first, DefMBB);
> SlotIndex Last = LIS.getMBBEndIdx(Dom.first).getPrevSlot();
> Dom.second =
> - defFromParent(0, Parent->getValNumInfo(i), Last, *Dom.first,
> + defFromParent(0, ParentVNI, Last, *Dom.first,
> LIS.getLastSplitPoint(Edit->getParent(),
> Dom.first))->def;
> }
>
>
> Modified: llvm/trunk/lib/CodeGen/SplitKit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.h?rev=139698&r1=139697&r2=139698&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SplitKit.h (original)
> +++ llvm/trunk/lib/CodeGen/SplitKit.h Wed Sep 14 11:45:39 2011
> @@ -315,6 +315,11 @@
> /// in the vector in the complement interval.
> void removeBackCopies(SmallVectorImpl<VNInfo*> &Copies);
>
> + /// getShallowDominator - Returns the least busy dominator of MBB that
> is
> + /// also dominated by DefMBB. Busy is measured by loop depth.
> + MachineBasicBlock *findShallowDominator(MachineBasicBlock *MBB,
> + MachineBasicBlock *DefMBB);
> +
> /// hoistCopiesForSize - Hoist back-copies to the complement interval in
> a
> /// way that minimizes code size. This implements the SM_Size spill mode.
> void hoistCopiesForSize();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20110914/78a90638/attachment.html>
More information about the llvm-commits
mailing list