mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-23 15:29:51 +00:00
- Remove an arbitrary spill weight tweak that should not have been there.
- Find more reloads from SS. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2bdf490d71
commit
c4f718a3a7
@ -554,9 +554,6 @@ void RALinScan::updateSpillWeights(std::vector<float> &Weights,
|
||||
SmallSet<unsigned, 4> Processed;
|
||||
SmallSet<unsigned, 4> SuperAdded;
|
||||
SmallVector<unsigned, 4> Supers;
|
||||
// Unfavor downgraded registers for spilling.
|
||||
if (DowngradedRegs.count(reg))
|
||||
weight *= 2.0f;
|
||||
Weights[reg] += weight;
|
||||
Processed.insert(reg);
|
||||
for (const unsigned* as = tri_->getAliasSet(reg); *as; ++as) {
|
||||
@ -1015,8 +1012,32 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur)
|
||||
// Merge added with unhandled. Note that we have already sorted
|
||||
// intervals returned by addIntervalsForSpills by their starting
|
||||
// point.
|
||||
for (unsigned i = 0, e = added.size(); i != e; ++i)
|
||||
unhandled_.push(added[i]);
|
||||
// This also update the NextReloadMap. That is, it adds mapping from a
|
||||
// register defined by a reload from SS to the next reload from SS in the
|
||||
// same basic block.
|
||||
MachineBasicBlock *LastReloadMBB = 0;
|
||||
LiveInterval *LastReload = 0;
|
||||
int LastReloadSS = VirtRegMap::NO_STACK_SLOT;
|
||||
for (unsigned i = 0, e = added.size(); i != e; ++i) {
|
||||
LiveInterval *ReloadLi = added[i];
|
||||
if (ReloadLi->weight == HUGE_VALF &&
|
||||
li_->getApproximateInstructionCount(*ReloadLi) == 0) {
|
||||
unsigned ReloadIdx = ReloadLi->beginNumber();
|
||||
MachineBasicBlock *ReloadMBB = li_->getMBBFromIndex(ReloadIdx);
|
||||
int ReloadSS = vrm_->getStackSlot(ReloadLi->reg);
|
||||
if (LastReloadMBB == ReloadMBB && LastReloadSS == ReloadSS) {
|
||||
// Last reload of same SS is in the same MBB. We want to try to
|
||||
// allocate both reloads the same register and make sure the reg
|
||||
// isn't clobbered in between if at all possible.
|
||||
assert(LastReload->beginNumber() < ReloadIdx);
|
||||
NextReloadMap.insert(std::make_pair(LastReload->reg, ReloadLi->reg));
|
||||
}
|
||||
LastReloadMBB = ReloadMBB;
|
||||
LastReload = ReloadLi;
|
||||
LastReloadSS = ReloadSS;
|
||||
}
|
||||
unhandled_.push(ReloadLi);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user