diff options
| author | Owen Anderson <resistor@mac.com> | 2009-01-23 03:28:53 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2009-01-23 03:28:53 +0000 |
| commit | a2ca64a39ae9d5b4b926c6fa0fec70a01f8ebff1 (patch) | |
| tree | 48f1be99ee02981e74dd59c9d5ac8279b206420e /llvm/lib | |
| parent | ab7bf14fb4c5948eca47df5713a6df5781210107 (diff) | |
| download | bcm5719-llvm-a2ca64a39ae9d5b4b926c6fa0fec70a01f8ebff1.tar.gz bcm5719-llvm-a2ca64a39ae9d5b4b926c6fa0fec70a01f8ebff1.zip | |
Stage two of fixing pre-alloc-splitting's code size issues: filter out restores that are just
going to be re-spilled again.
This also helps performance. Pre-alloc-splitting now seems to be an overall win on SPEC.
llvm-svn: 62834
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/PreAllocSplitting.cpp | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/PreAllocSplitting.cpp b/llvm/lib/CodeGen/PreAllocSplitting.cpp index f07f0700945..8e86213f77c 100644 --- a/llvm/lib/CodeGen/PreAllocSplitting.cpp +++ b/llvm/lib/CodeGen/PreAllocSplitting.cpp @@ -1388,7 +1388,7 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) { for (SmallPtrSet<LiveInterval*, 8>::iterator LI = split.begin(), LE = split.end(); LI != LE; ++LI) { - DenseMap<VNInfo*, unsigned > VNUseCount; + DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> > VNUseCount; for (MachineRegisterInfo::use_iterator UI = MRI->use_begin((*LI)->reg), UE = MRI->use_end(); UI != UE; ++UI) { @@ -1396,27 +1396,55 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) { index = LiveIntervals::getUseIndex(index); const LiveRange* LR = (*LI)->getLiveRangeContaining(index); - VNUseCount[LR->valno]++; + VNUseCount[LR->valno].insert(&*UI); } for (LiveInterval::vni_iterator VI = (*LI)->vni_begin(), VE = (*LI)->vni_end(); VI != VE; ++VI) { VNInfo* CurrVN = *VI; if (CurrVN->hasPHIKill) continue; - if (VNUseCount[CurrVN] > 0) continue; unsigned DefIdx = CurrVN->def; if (DefIdx == ~0U || DefIdx == ~1U) continue; - + MachineInstr* DefMI = LIs->getInstructionFromIndex(DefIdx); int FrameIndex; if (!TII->isLoadFromStackSlot(DefMI, FrameIndex)) continue; - LIs->RemoveMachineInstrFromMaps(DefMI); - (*LI)->removeValNo(CurrVN); - DefMI->eraseFromParent(); - NumDeadSpills++; - changed = true; + if (VNUseCount[CurrVN].size() == 0) { + LIs->RemoveMachineInstrFromMaps(DefMI); + (*LI)->removeValNo(CurrVN); + DefMI->eraseFromParent(); + NumDeadSpills++; + changed = true; + } else { + bool NonRestore = false; + for (SmallPtrSet<MachineInstr*, 4>::iterator UI = + VNUseCount[CurrVN].begin(), UE = VNUseCount[CurrVN].end(); + UI != UI; ++UI) { + int StoreFrameIndex; + unsigned StoreVReg = TII->isStoreToStackSlot(*UI, StoreFrameIndex); + if (StoreVReg != (*LI)->reg || StoreFrameIndex != FrameIndex) { + NonRestore = false; + break; + } + } + + if (NonRestore) continue; + + for (SmallPtrSet<MachineInstr*, 4>::iterator UI = + VNUseCount[CurrVN].begin(), UE = VNUseCount[CurrVN].end(); + UI != UI; ++UI) { + LIs->RemoveMachineInstrFromMaps(*UI); + (*UI)->eraseFromParent(); + } + + LIs->RemoveMachineInstrFromMaps(DefMI); + (*LI)->removeValNo(CurrVN); + DefMI->eraseFromParent(); + NumDeadSpills++; + changed = true; + } } } |

