From 40a42a2ccaaa19a109667ed7abf224cc8733cd9c Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 4 Mar 2011 00:58:40 +0000 Subject: Precompute block frequencies, pow() isn't free. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126975 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegAllocGreedy.cpp | 7 +++---- lib/CodeGen/SpillPlacement.cpp | 16 +++++----------- lib/CodeGen/SpillPlacement.h | 9 +++++++-- 3 files changed, 15 insertions(+), 17 deletions(-) (limited to 'lib/CodeGen') diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index cbecc4b2d3..eada8f9910 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -602,7 +602,7 @@ float RAGreedy::calcInterferenceInfo(LiveInterval &VirtReg, unsigned PhysReg) { // The local cost of spill code in this block is the block frequency times // the number of spill instructions inserted. if (Inserts) - LocalCost += Inserts * SpillPlacer->getBlockFrequency(BI.MBB); + LocalCost += Inserts * SpillPlacer->getBlockFrequency(BC.Number); } DEBUG(dbgs() << "Local cost of " << PrintReg(PhysReg, TRI) << " = " << LocalCost << '\n'); @@ -625,8 +625,7 @@ float RAGreedy::calcGlobalSplitCost(const BitVector &LiveBundles) { Inserts += LiveBundles[Bundles->getBundle(BC.Number, 1)] != (BC.Exit == SpillPlacement::PrefReg); if (Inserts) - GlobalCost += - Inserts * SpillPlacer->getBlockFrequency(SA->LiveBlocks[i].MBB); + GlobalCost += Inserts * SpillPlacer->getBlockFrequency(BC.Number); } DEBUG(dbgs() << "Global cost = " << GlobalCost << '\n'); return GlobalCost; @@ -1089,7 +1088,7 @@ unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order, unsigned BestAfter = 0; float BestDiff = 0; - const float blockFreq = SpillPlacer->getBlockFrequency(BI.MBB); + const float blockFreq = SpillPlacer->getBlockFrequency(BI.MBB->getNumber()); SmallVector GapWeight; Order.rewind(); diff --git a/lib/CodeGen/SpillPlacement.cpp b/lib/CodeGen/SpillPlacement.cpp index 9c0bf1629a..57951ed806 100644 --- a/lib/CodeGen/SpillPlacement.cpp +++ b/lib/CodeGen/SpillPlacement.cpp @@ -175,9 +175,12 @@ bool SpillPlacement::runOnMachineFunction(MachineFunction &mf) { nodes = new Node[bundles->getNumBundles()]; // Compute total ingoing and outgoing block frequencies for all bundles. + BlockFrequency.resize(mf.getNumBlockIDs()); for (MachineFunction::iterator I = mf.begin(), E = mf.end(); I != E; ++I) { - float Freq = getBlockFrequency(I); + float Freq = LiveIntervals::getSpillWeight(true, false, + loops->getLoopDepth(I)); unsigned Num = I->getNumber(); + BlockFrequency[Num] = Freq; nodes[bundles->getBundle(Num, 1)].Frequency[0] += Freq; nodes[bundles->getBundle(Num, 0)].Frequency[1] += Freq; } @@ -206,8 +209,7 @@ void SpillPlacement:: prepareNodes(const SmallVectorImpl &LiveBlocks) { for (SmallVectorImpl::const_iterator I = LiveBlocks.begin(), E = LiveBlocks.end(); I != E; ++I) { - MachineBasicBlock *MBB = MF->getBlockNumbered(I->Number); - float Freq = getBlockFrequency(MBB); + float Freq = getBlockFrequency(I->Number); // Is this a transparent block? Link ingoing and outgoing bundles. if (I->Entry == DontCare && I->Exit == DontCare) { @@ -320,11 +322,3 @@ SpillPlacement::placeSpills(const SmallVectorImpl &LiveBlocks, } return Perfect; } - -/// getBlockFrequency - Return our best estimate of the block frequency which is -/// the expected number of block executions per function invocation. -float SpillPlacement::getBlockFrequency(const MachineBasicBlock *MBB) { - // Use the unnormalized spill weight for real block frequencies. - return LiveIntervals::getSpillWeight(true, false, loops->getLoopDepth(MBB)); -} - diff --git a/lib/CodeGen/SpillPlacement.h b/lib/CodeGen/SpillPlacement.h index ef2d516cdc..b0135cbc36 100644 --- a/lib/CodeGen/SpillPlacement.h +++ b/lib/CodeGen/SpillPlacement.h @@ -27,6 +27,7 @@ #ifndef LLVM_CODEGEN_SPILLPLACEMENT_H #define LLVM_CODEGEN_SPILLPLACEMENT_H +#include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/MachineFunctionPass.h" namespace llvm { @@ -35,7 +36,6 @@ class BitVector; class EdgeBundles; class MachineBasicBlock; class MachineLoopInfo; -template class SmallVectorImpl; class SpillPlacement : public MachineFunctionPass { struct Node; @@ -48,6 +48,9 @@ class SpillPlacement : public MachineFunctionPass { // caller. BitVector *ActiveNodes; + // Block frequencies are computed once. Indexed by block number. + SmallVector BlockFrequency; + public: static char ID; // Pass identification, replacement for typeid. @@ -91,7 +94,9 @@ public: /// getBlockFrequency - Return the estimated block execution frequency per /// function invocation. - float getBlockFrequency(const MachineBasicBlock*); + float getBlockFrequency(unsigned Number) const { + return BlockFrequency[Number]; + } private: virtual bool runOnMachineFunction(MachineFunction&); -- cgit v1.2.3