From: Owen Anderson Date: Fri, 23 Jan 2009 03:28:53 +0000 (+0000) Subject: Stage two of fixing pre-alloc-splitting's code size issues: filter out restores that... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9ce499ab3663a3a5dda964c2d905e4ff05af976c;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62834 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index f07f0700945..8e86213f77c 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -1388,7 +1388,7 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet& split) { for (SmallPtrSet::iterator LI = split.begin(), LE = split.end(); LI != LE; ++LI) { - DenseMap VNUseCount; + DenseMap > 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& 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::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::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; + } } }