diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 21:32:41 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 21:32:41 +0000 |
commit | 9a54352879e5aaac2e2c37490e5cb7844550db8b (patch) | |
tree | 3b5352ffcd396b20cf84afc8c1b619790e501e52 | |
parent | 1b400e840f58489c7950f815780cf08917cecaa8 (diff) | |
download | external_llvm-9a54352879e5aaac2e2c37490e5cb7844550db8b.zip external_llvm-9a54352879e5aaac2e2c37490e5cb7844550db8b.tar.gz external_llvm-9a54352879e5aaac2e2c37490e5cb7844550db8b.tar.bz2 |
Also account for the spill code that would be inserted in live-through blocks with interference.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129030 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/RegAllocGreedy.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index 66ef62b..7564c1d 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -170,7 +170,7 @@ private: void LRE_DidCloneVirtReg(unsigned, unsigned); bool addSplitConstraints(unsigned, float&); - float calcGlobalSplitCost(const BitVector&); + float calcGlobalSplitCost(unsigned, const BitVector&); void splitAroundRegion(LiveInterval&, unsigned, const BitVector&, SmallVectorImpl<LiveInterval*>&); void calcGapWeights(unsigned, SmallVectorImpl<float>&); @@ -520,7 +520,8 @@ bool RAGreedy::addSplitConstraints(unsigned PhysReg, float &Cost) { /// pattern in LiveBundles. This cost should be added to the local cost of the /// interference pattern in SplitConstraints. /// -float RAGreedy::calcGlobalSplitCost(const BitVector &LiveBundles) { +float RAGreedy::calcGlobalSplitCost(unsigned PhysReg, + const BitVector &LiveBundles) { float GlobalCost = 0; ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks(); for (unsigned i = 0; i != UseBlocks.size(); ++i) { @@ -538,14 +539,24 @@ float RAGreedy::calcGlobalSplitCost(const BitVector &LiveBundles) { GlobalCost += Ins * SpillPlacer->getBlockFrequency(BC.Number); } + InterferenceCache::Cursor Intf(IntfCache, PhysReg); ArrayRef<unsigned> ThroughBlocks = SA->getThroughBlocks(); SplitConstraints.resize(UseBlocks.size() + ThroughBlocks.size()); for (unsigned i = 0; i != ThroughBlocks.size(); ++i) { unsigned Number = ThroughBlocks[i]; bool RegIn = LiveBundles[Bundles->getBundle(Number, 0)]; bool RegOut = LiveBundles[Bundles->getBundle(Number, 1)]; - if (RegIn != RegOut) - GlobalCost += SpillPlacer->getBlockFrequency(Number); + if (!RegIn && !RegOut) + continue; + if (RegIn && RegOut) { + // We need double spill code if this block has interference. + Intf.moveToBlock(Number); + if (Intf.hasInterference()) + GlobalCost += 2*SpillPlacer->getBlockFrequency(Number); + continue; + } + // live-in / stack-out or stack-in live-out. + GlobalCost += SpillPlacer->getBlockFrequency(Number); } return GlobalCost; } @@ -811,7 +822,7 @@ unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order, continue; } - Cost += calcGlobalSplitCost(LiveBundles); + Cost += calcGlobalSplitCost(PhysReg, LiveBundles); DEBUG({ dbgs() << ", total = " << Cost << " with bundles"; for (int i = LiveBundles.find_first(); i>=0; i = LiveBundles.find_next(i)) |