mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
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
This commit is contained in:
parent
8c08d8c77c
commit
9ce499ab36
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user