diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-08-05 22:43:23 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-08-05 22:43:23 +0000 |
commit | 58995bc551e73e00f907accd6088f2dafb82dc7e (patch) | |
tree | 826948011037f1b842c446ddc1da309a3f049201 /llvm | |
parent | e1a6a0e05cb4bb42c8d71332a253263f957e7dab (diff) | |
download | bcm5719-llvm-58995bc551e73e00f907accd6088f2dafb82dc7e.tar.gz bcm5719-llvm-58995bc551e73e00f907accd6088f2dafb82dc7e.zip |
Also use shouldSplitSingleBlock() in the fallback splitting mode.
Drop the use of SplitAnalysis::getMultiUseBlocks, there is no need to go
through a SmallPtrSet any more.
llvm-svn: 136992
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/RegAllocGreedy.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 90d3810437e..ef083c1ccb8 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -1489,15 +1489,25 @@ unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order, } // Then isolate blocks with multiple uses. - SplitAnalysis::BlockPtrSet Blocks; - if (SA->getMultiUseBlocks(Blocks)) { - LiveRangeEdit LREdit(VirtReg, NewVRegs, this); - SE->reset(LREdit); - SE->splitSingleBlocks(Blocks); - setStage(NewVRegs.begin(), NewVRegs.end(), RS_Spill); - if (VerifyEnabled) - MF->verify(this, "After splitting live range around basic blocks"); + unsigned Reg = SA->getParent().reg; + bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg)); + LiveRangeEdit LREdit(VirtReg, NewVRegs, this); + SE->reset(LREdit); + ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks(); + for (unsigned i = 0; i != UseBlocks.size(); ++i) { + const SplitAnalysis::BlockInfo &BI = UseBlocks[i]; + if (SA->shouldSplitSingleBlock(BI, SingleInstrs)) + SE->splitSingleBlock(BI); } + // No blocks were split. + if (LREdit.empty()) + return 0; + + // We did split for some blocks. + SE->finish(); + setStage(NewVRegs.begin(), NewVRegs.end(), RS_Spill); + if (VerifyEnabled) + MF->verify(this, "After splitting live range around basic blocks"); // Don't assign any physregs. return 0; |