forked from OSchip/llvm-project
Don't return a std::vector in the Spiller interface, but take a reference to a
vector instead. This avoids needless copying and allocation. Add documentation. llvm-svn: 106788
This commit is contained in:
parent
4398fd7b83
commit
2b87d44c5d
|
@ -1206,8 +1206,7 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
|
|||
DEBUG(dbgs() << "\t\t\tspilling(c): " << *cur << '\n');
|
||||
SmallVector<LiveInterval*, 8> spillIs;
|
||||
std::vector<LiveInterval*> added;
|
||||
|
||||
added = spiller_->spill(cur, spillIs);
|
||||
spiller_->spill(cur, added, spillIs);
|
||||
|
||||
std::sort(added.begin(), added.end(), LISorter());
|
||||
addStackInterval(cur, ls_, li_, mri_, *vrm_);
|
||||
|
@ -1285,10 +1284,8 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
|
|||
if (sli->beginIndex() < earliestStart)
|
||||
earliestStart = sli->beginIndex();
|
||||
|
||||
std::vector<LiveInterval*> newIs;
|
||||
newIs = spiller_->spill(sli, spillIs, &earliestStart);
|
||||
spiller_->spill(sli, added, spillIs, &earliestStart);
|
||||
addStackInterval(sli, ls_, li_, mri_, *vrm_);
|
||||
std::copy(newIs.begin(), newIs.end(), std::back_inserter(added));
|
||||
spilled.insert(sli->reg);
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,8 @@ protected:
|
|||
/// Add spill ranges for every use/def of the live interval, inserting loads
|
||||
/// immediately before each use, and stores after each def. No folding or
|
||||
/// remat is attempted.
|
||||
std::vector<LiveInterval*> trivialSpillEverywhere(LiveInterval *li) {
|
||||
void trivialSpillEverywhere(LiveInterval *li,
|
||||
std::vector<LiveInterval*> &newIntervals) {
|
||||
DEBUG(dbgs() << "Spilling everywhere " << *li << "\n");
|
||||
|
||||
assert(li->weight != HUGE_VALF &&
|
||||
|
@ -78,8 +79,6 @@ protected:
|
|||
|
||||
DEBUG(dbgs() << "Trivial spill everywhere of reg" << li->reg << "\n");
|
||||
|
||||
std::vector<LiveInterval*> added;
|
||||
|
||||
const TargetRegisterClass *trc = mri->getRegClass(li->reg);
|
||||
unsigned ss = vrm->assignVirt2StackSlot(li->reg);
|
||||
|
||||
|
@ -157,10 +156,8 @@ protected:
|
|||
newLI->addRange(LiveRange(beginIndex, storeIndex, storeVNI));
|
||||
}
|
||||
|
||||
added.push_back(newLI);
|
||||
newIntervals.push_back(newLI);
|
||||
}
|
||||
|
||||
return added;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -176,11 +173,12 @@ public:
|
|||
TrivialSpiller(MachineFunction *mf, LiveIntervals *lis, VirtRegMap *vrm)
|
||||
: SpillerBase(mf, lis, vrm) {}
|
||||
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex*) {
|
||||
void spill(LiveInterval *li,
|
||||
std::vector<LiveInterval*> &newIntervals,
|
||||
SmallVectorImpl<LiveInterval*> &,
|
||||
SlotIndex*) {
|
||||
// Ignore spillIs - we don't use it.
|
||||
return trivialSpillEverywhere(li);
|
||||
trivialSpillEverywhere(li, newIntervals);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -200,10 +198,13 @@ public:
|
|||
: lis(lis), loopInfo(loopInfo), vrm(vrm) {}
|
||||
|
||||
/// Falls back on LiveIntervals::addIntervalsForSpills.
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex*) {
|
||||
return lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm);
|
||||
void spill(LiveInterval *li,
|
||||
std::vector<LiveInterval*> &newIntervals,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex*) {
|
||||
std::vector<LiveInterval*> added =
|
||||
lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm);
|
||||
newIntervals.insert(newIntervals.end(), added.begin(), added.end());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -226,15 +227,14 @@ public:
|
|||
tri = mf->getTarget().getRegisterInfo();
|
||||
}
|
||||
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex *earliestStart) {
|
||||
|
||||
if (worthTryingToSplit(li)) {
|
||||
return tryVNISplit(li, earliestStart);
|
||||
}
|
||||
// else
|
||||
return StandardSpiller::spill(li, spillIs, earliestStart);
|
||||
void spill(LiveInterval *li,
|
||||
std::vector<LiveInterval*> &newIntervals,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex *earliestStart) {
|
||||
if (worthTryingToSplit(li))
|
||||
tryVNISplit(li, earliestStart);
|
||||
else
|
||||
StandardSpiller::spill(li, newIntervals, spillIs, earliestStart);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -33,11 +33,19 @@ namespace llvm {
|
|||
public:
|
||||
virtual ~Spiller() = 0;
|
||||
|
||||
/// Spill the given live range. The method used will depend on the Spiller
|
||||
/// implementation selected.
|
||||
virtual std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex *earliestIndex = 0) = 0;
|
||||
/// spill - Spill the given live interval. The method used will depend on
|
||||
/// the Spiller implementation selected.
|
||||
///
|
||||
/// @param li The live interval to be spilled.
|
||||
/// @param spillIs An essential hook into the register allocator guts
|
||||
/// that perhaps serves a purpose(?!)
|
||||
/// @param newIntervals The newly created intervals will be appended here.
|
||||
/// @param earliestIndex The earliest point for splitting. (OK, it's another
|
||||
/// pointer to the allocator guts).
|
||||
virtual void spill(LiveInterval *li,
|
||||
std::vector<LiveInterval*> &newIntervals,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs,
|
||||
SlotIndex *earliestIndex = 0) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue