1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Clean up the Spiller.h interface.

The earliestStart argument is entirely specific to linear scan allocation, and
can be easily calculated by RegAllocLinearScan.

Replace std::vector with SmallVector.

llvm-svn: 111055
This commit is contained in:
Jakob Stoklund Olesen 2010-08-13 22:56:53 +00:00
parent ca672ee828
commit 44b77ea344
6 changed files with 31 additions and 44 deletions

View File

@ -45,7 +45,7 @@ class InlineSpiller : public Spiller {
// Variables that are valid during spill(), but used by multiple methods. // Variables that are valid during spill(), but used by multiple methods.
LiveInterval *li_; LiveInterval *li_;
std::vector<LiveInterval*> *newIntervals_; SmallVectorImpl<LiveInterval*> *newIntervals_;
const TargetRegisterClass *rc_; const TargetRegisterClass *rc_;
int stackSlot_; int stackSlot_;
const SmallVectorImpl<LiveInterval*> *spillIs_; const SmallVectorImpl<LiveInterval*> *spillIs_;
@ -75,9 +75,8 @@ public:
splitAnalysis_(mf, lis_, loops_) {} splitAnalysis_(mf, lis_, loops_) {}
void spill(LiveInterval *li, void spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &spillIs, SmallVectorImpl<LiveInterval*> &spillIs);
SlotIndex *earliestIndex);
private: private:
bool split(); bool split();
@ -388,9 +387,8 @@ void InlineSpiller::insertSpill(LiveInterval &NewLI,
} }
void InlineSpiller::spill(LiveInterval *li, void InlineSpiller::spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &spillIs, SmallVectorImpl<LiveInterval*> &spillIs) {
SlotIndex *earliestIndex) {
DEBUG(dbgs() << "Inline spilling " << *li << "\n"); DEBUG(dbgs() << "Inline spilling " << *li << "\n");
assert(li->isSpillable() && "Attempting to spill already spilled value."); assert(li->isSpillable() && "Attempting to spill already spilled value.");
assert(!li->isStackSlot() && "Trying to spill a stack slot."); assert(!li->isStackSlot() && "Trying to spill a stack slot.");

View File

@ -1202,8 +1202,7 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
// linearscan. // linearscan.
if (cur->weight != HUGE_VALF && cur->weight <= minWeight) { if (cur->weight != HUGE_VALF && cur->weight <= minWeight) {
DEBUG(dbgs() << "\t\t\tspilling(c): " << *cur << '\n'); DEBUG(dbgs() << "\t\t\tspilling(c): " << *cur << '\n');
SmallVector<LiveInterval*, 8> spillIs; SmallVector<LiveInterval*, 8> spillIs, added;
std::vector<LiveInterval*> added;
spiller_->spill(cur, added, spillIs); spiller_->spill(cur, added, spillIs);
std::sort(added.begin(), added.end(), LISorter()); std::sort(added.begin(), added.end(), LISorter());
@ -1268,25 +1267,31 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
// in handled we need to roll back // in handled we need to roll back
assert(!spillIs.empty() && "No spill intervals?"); assert(!spillIs.empty() && "No spill intervals?");
SlotIndex earliestStart = spillIs[0]->beginIndex(); SlotIndex earliestStart = spillIs[0]->beginIndex();
// Spill live intervals of virtual regs mapped to the physical register we // Spill live intervals of virtual regs mapped to the physical register we
// want to clear (and its aliases). We only spill those that overlap with the // want to clear (and its aliases). We only spill those that overlap with the
// current interval as the rest do not affect its allocation. we also keep // current interval as the rest do not affect its allocation. we also keep
// track of the earliest start of all spilled live intervals since this will // track of the earliest start of all spilled live intervals since this will
// mark our rollback point. // mark our rollback point.
std::vector<LiveInterval*> added; SmallVector<LiveInterval*, 8> added;
while (!spillIs.empty()) { while (!spillIs.empty()) {
LiveInterval *sli = spillIs.back(); LiveInterval *sli = spillIs.back();
spillIs.pop_back(); spillIs.pop_back();
DEBUG(dbgs() << "\t\t\tspilling(a): " << *sli << '\n'); DEBUG(dbgs() << "\t\t\tspilling(a): " << *sli << '\n');
if (sli->beginIndex() < earliestStart) if (sli->beginIndex() < earliestStart)
earliestStart = sli->beginIndex(); earliestStart = sli->beginIndex();
spiller_->spill(sli, added, spillIs);
spiller_->spill(sli, added, spillIs, &earliestStart);
addStackInterval(sli, ls_, li_, mri_, *vrm_); addStackInterval(sli, ls_, li_, mri_, *vrm_);
spilled.insert(sli->reg); spilled.insert(sli->reg);
} }
// Include any added intervals in earliestStart.
for (unsigned i = 0, e = added.size(); i != e; ++i) {
SlotIndex SI = added[i]->beginIndex();
if (SI < earliestStart)
earliestStart = SI;
}
DEBUG(dbgs() << "\t\trolling back to: " << earliestStart << '\n'); DEBUG(dbgs() << "\t\trolling back to: " << earliestStart << '\n');
// Scan handled in reverse order up to the earliest start of a // Scan handled in reverse order up to the earliest start of a

View File

@ -74,7 +74,7 @@ protected:
/// immediately before each use, and stores after each def. No folding or /// immediately before each use, and stores after each def. No folding or
/// remat is attempted. /// remat is attempted.
void trivialSpillEverywhere(LiveInterval *li, void trivialSpillEverywhere(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals) { SmallVectorImpl<LiveInterval*> &newIntervals) {
DEBUG(dbgs() << "Spilling everywhere " << *li << "\n"); DEBUG(dbgs() << "Spilling everywhere " << *li << "\n");
assert(li->weight != HUGE_VALF && assert(li->weight != HUGE_VALF &&
@ -181,9 +181,8 @@ public:
: SpillerBase(pass, mf, vrm) {} : SpillerBase(pass, mf, vrm) {}
void spill(LiveInterval *li, void spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &, SmallVectorImpl<LiveInterval*> &) {
SlotIndex*) {
// Ignore spillIs - we don't use it. // Ignore spillIs - we don't use it.
trivialSpillEverywhere(li, newIntervals); trivialSpillEverywhere(li, newIntervals);
} }
@ -208,9 +207,8 @@ public:
/// Falls back on LiveIntervals::addIntervalsForSpills. /// Falls back on LiveIntervals::addIntervalsForSpills.
void spill(LiveInterval *li, void spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &spillIs, SmallVectorImpl<LiveInterval*> &spillIs) {
SlotIndex*) {
std::vector<LiveInterval*> added = std::vector<LiveInterval*> added =
lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm); lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm);
newIntervals.insert(newIntervals.end(), added.begin(), added.end()); newIntervals.insert(newIntervals.end(), added.begin(), added.end());
@ -236,13 +234,12 @@ public:
} }
void spill(LiveInterval *li, void spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &spillIs, SmallVectorImpl<LiveInterval*> &spillIs) {
SlotIndex *earliestStart) {
if (worthTryingToSplit(li)) if (worthTryingToSplit(li))
tryVNISplit(li, earliestStart); tryVNISplit(li);
else else
StandardSpiller::spill(li, newIntervals, spillIs, earliestStart); StandardSpiller::spill(li, newIntervals, spillIs);
} }
private: private:
@ -257,8 +254,7 @@ private:
} }
/// Try to break a LiveInterval into its component values. /// Try to break a LiveInterval into its component values.
std::vector<LiveInterval*> tryVNISplit(LiveInterval *li, std::vector<LiveInterval*> tryVNISplit(LiveInterval *li) {
SlotIndex *earliestStart) {
DEBUG(dbgs() << "Trying VNI split of %reg" << *li << "\n"); DEBUG(dbgs() << "Trying VNI split of %reg" << *li << "\n");
@ -282,10 +278,6 @@ private:
DEBUG(dbgs() << *splitInterval << "\n"); DEBUG(dbgs() << *splitInterval << "\n");
added.push_back(splitInterval); added.push_back(splitInterval);
alreadySplit.insert(splitInterval); alreadySplit.insert(splitInterval);
if (earliestStart != 0) {
if (splitInterval->beginIndex() < *earliestStart)
*earliestStart = splitInterval->beginIndex();
}
} else { } else {
DEBUG(dbgs() << "0\n"); DEBUG(dbgs() << "0\n");
} }
@ -298,10 +290,6 @@ private:
if (!li->empty()) { if (!li->empty()) {
added.push_back(li); added.push_back(li);
alreadySplit.insert(li); alreadySplit.insert(li);
if (earliestStart != 0) {
if (li->beginIndex() < *earliestStart)
*earliestStart = li->beginIndex();
}
} }
return added; return added;

View File

@ -11,7 +11,6 @@
#define LLVM_CODEGEN_SPILLER_H #define LLVM_CODEGEN_SPILLER_H
#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallVector.h"
#include <vector>
namespace llvm { namespace llvm {
@ -36,12 +35,9 @@ namespace llvm {
/// @param spillIs A list of intervals that are about to be spilled, /// @param spillIs A list of intervals that are about to be spilled,
/// and so cannot be used for remat etc. /// and so cannot be used for remat etc.
/// @param newIntervals The newly created intervals will be appended here. /// @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, virtual void spill(LiveInterval *li,
std::vector<LiveInterval*> &newIntervals, SmallVectorImpl<LiveInterval*> &newIntervals,
SmallVectorImpl<LiveInterval*> &spillIs, SmallVectorImpl<LiveInterval*> &spillIs) = 0;
SlotIndex *earliestIndex = 0) = 0;
}; };

View File

@ -342,7 +342,7 @@ bool SplitAnalysis::getMultiUseBlocks(BlockPtrSet &Blocks) {
/// Create a new SplitEditor for editing the LiveInterval analyzed by SA. /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
SplitEditor::SplitEditor(SplitAnalysis &sa, LiveIntervals &lis, VirtRegMap &vrm, SplitEditor::SplitEditor(SplitAnalysis &sa, LiveIntervals &lis, VirtRegMap &vrm,
std::vector<LiveInterval*> &intervals) SmallVectorImpl<LiveInterval*> &intervals)
: sa_(sa), lis_(lis), vrm_(vrm), : sa_(sa), lis_(lis), vrm_(vrm),
mri_(vrm.getMachineFunction().getRegInfo()), mri_(vrm.getMachineFunction().getRegInfo()),
tii_(*vrm.getMachineFunction().getTarget().getInstrInfo()), tii_(*vrm.getMachineFunction().getTarget().getInstrInfo()),

View File

@ -183,7 +183,7 @@ class SplitEditor {
bool liveThrough_; bool liveThrough_;
/// All the new intervals created for this split are added to intervals_. /// All the new intervals created for this split are added to intervals_.
std::vector<LiveInterval*> &intervals_; SmallVectorImpl<LiveInterval*> &intervals_;
/// The index into intervals_ of the first interval we added. There may be /// The index into intervals_ of the first interval we added. There may be
/// others from before we got it. /// others from before we got it.
@ -199,7 +199,7 @@ public:
/// Create a new SplitEditor for editing the LiveInterval analyzed by SA. /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
/// Newly created intervals will be appended to newIntervals. /// Newly created intervals will be appended to newIntervals.
SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&, SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&,
std::vector<LiveInterval*> &newIntervals); SmallVectorImpl<LiveInterval*> &newIntervals);
/// getAnalysis - Get the corresponding analysis. /// getAnalysis - Get the corresponding analysis.
SplitAnalysis &getAnalysis() { return sa_; } SplitAnalysis &getAnalysis() { return sa_; }