diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-09 02:59:09 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-09 02:59:09 +0000 |
commit | f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0c (patch) | |
tree | 747bfe34dc34c5b0b58ac11b3160422da5e7782b /lib/CodeGen/SplitKit.cpp | |
parent | 9d29cbad32814f31c91cd2464a3c74df412b0aac (diff) | |
download | external_llvm-f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0c.zip external_llvm-f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0c.tar.gz external_llvm-f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0c.tar.bz2 |
Build the Hopfield network incrementally when splitting global live ranges.
It is common for large live ranges to have few basic blocks with register uses
and many live-through blocks without any uses. This approach grows the Hopfield
network incrementally around the use blocks, completely avoiding checking
interference for some through blocks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129188 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 201e9b1..6195ab0 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -132,12 +132,14 @@ void SplitAnalysis::analyzeUses() { DEBUG(dbgs() << "Analyze counted " << UseSlots.size() << " instrs in " << UseBlocks.size() << " blocks, through " - << ThroughBlocks.size() << " blocks.\n"); + << NumThroughBlocks << " blocks.\n"); } /// calcLiveBlockInfo - Fill the LiveBlocks array with information about blocks /// where CurLI is live. bool SplitAnalysis::calcLiveBlockInfo() { + ThroughBlocks.resize(MF.getNumBlockIDs()); + NumThroughBlocks = 0; if (CurLI->empty()) return true; @@ -193,9 +195,10 @@ bool SplitAnalysis::calcLiveBlockInfo() { BI.LiveThrough = !hasGap && BI.LiveIn && BI.LiveOut; if (Uses) UseBlocks.push_back(BI); - else - ThroughBlocks.push_back(BI.MBB->getNumber()); - + else { + ++NumThroughBlocks; + ThroughBlocks.set(BI.MBB->getNumber()); + } // FIXME: This should never happen. The live range stops or starts without a // corresponding use. An earlier pass did something wrong. if (!BI.LiveThrough && !Uses) |