mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
Added a new Spiller implementation which wraps LiveIntervals::addIntervalsForSpills.
All spiller calls in RegAllocLinearScan now go through the new Spiller interface. The "-new-spill-framework" command line option has been removed. To use the trivial in-place spiller you should now pass "-spiller=trivial -rewriter=trivial". (Note the trivial spiller/rewriter are only meant to serve as examples of the new in-place modification work. Enabling them will yield terrible, though hopefully functional, code). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2b5e6b1c9c
commit
835ca07991
@ -59,11 +59,6 @@ PreSplitIntervals("pre-alloc-split",
|
||||
cl::desc("Pre-register allocation live interval splitting"),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
static cl::opt<bool>
|
||||
NewSpillFramework("new-spill-framework",
|
||||
cl::desc("New spilling framework"),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
static RegisterRegAlloc
|
||||
linearscanRegAlloc("linearscan", "linear scan register allocator",
|
||||
createLinearScanRegisterAllocator);
|
||||
@ -441,9 +436,7 @@ bool RALinScan::runOnMachineFunction(MachineFunction &fn) {
|
||||
vrm_ = &getAnalysis<VirtRegMap>();
|
||||
if (!rewriter_.get()) rewriter_.reset(createVirtRegRewriter());
|
||||
|
||||
if (NewSpillFramework) {
|
||||
spiller_.reset(createSpiller(mf_, li_, ls_, vrm_));
|
||||
}
|
||||
spiller_.reset(createSpiller(mf_, li_, ls_, loopInfo, vrm_));
|
||||
|
||||
initIntervalSets();
|
||||
|
||||
@ -1157,11 +1150,7 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
|
||||
SmallVector<LiveInterval*, 8> spillIs;
|
||||
std::vector<LiveInterval*> added;
|
||||
|
||||
if (!NewSpillFramework) {
|
||||
added = li_->addIntervalsForSpills(*cur, spillIs, loopInfo, *vrm_);
|
||||
} else {
|
||||
added = spiller_->spill(cur);
|
||||
}
|
||||
added = spiller_->spill(cur, spillIs);
|
||||
|
||||
std::sort(added.begin(), added.end(), LISorter());
|
||||
addStackInterval(cur, ls_, li_, mri_, *vrm_);
|
||||
@ -1241,11 +1230,7 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur) {
|
||||
earliestStartInterval : sli;
|
||||
|
||||
std::vector<LiveInterval*> newIs;
|
||||
if (!NewSpillFramework) {
|
||||
newIs = li_->addIntervalsForSpills(*sli, spillIs, loopInfo, *vrm_);
|
||||
} else {
|
||||
newIs = spiller_->spill(sli);
|
||||
}
|
||||
newIs = spiller_->spill(sli, spillIs);
|
||||
addStackInterval(sli, ls_, li_, mri_, *vrm_);
|
||||
std::copy(newIs.begin(), newIs.end(), std::back_inserter(added));
|
||||
spilled.insert(sli->reg);
|
||||
|
@ -18,11 +18,25 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
enum SpillerName { trivial, standard };
|
||||
}
|
||||
|
||||
static cl::opt<SpillerName>
|
||||
spillerOpt("spiller",
|
||||
cl::desc("Spiller to use: (default: standard)"),
|
||||
cl::Prefix,
|
||||
cl::values(clEnumVal(trivial, "trivial spiller"),
|
||||
clEnumVal(standard, "default spiller"),
|
||||
clEnumValEnd),
|
||||
cl::init(standard));
|
||||
|
||||
Spiller::~Spiller() {}
|
||||
|
||||
namespace {
|
||||
@ -156,18 +170,45 @@ class TrivialSpiller : public SpillerBase {
|
||||
public:
|
||||
|
||||
TrivialSpiller(MachineFunction *mf, LiveIntervals *lis, LiveStacks *ls,
|
||||
VirtRegMap *vrm) :
|
||||
SpillerBase(mf, lis, ls, vrm) {}
|
||||
VirtRegMap *vrm)
|
||||
: SpillerBase(mf, lis, ls, vrm) {}
|
||||
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li) {
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs) {
|
||||
// Ignore spillIs - we don't use it.
|
||||
return trivialSpillEverywhere(li);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/// Falls back on LiveIntervals::addIntervalsForSpills.
|
||||
class StandardSpiller : public Spiller {
|
||||
private:
|
||||
LiveIntervals *lis;
|
||||
const MachineLoopInfo *loopInfo;
|
||||
VirtRegMap *vrm;
|
||||
public:
|
||||
StandardSpiller(MachineFunction *mf, LiveIntervals *lis, LiveStacks *ls,
|
||||
const MachineLoopInfo *loopInfo, VirtRegMap *vrm)
|
||||
: lis(lis), loopInfo(loopInfo), vrm(vrm) {}
|
||||
|
||||
/// Falls back on LiveIntervals::addIntervalsForSpills.
|
||||
std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs) {
|
||||
return lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
llvm::Spiller* llvm::createSpiller(MachineFunction *mf, LiveIntervals *lis,
|
||||
LiveStacks *ls, VirtRegMap *vrm) {
|
||||
return new TrivialSpiller(mf, lis, ls, vrm);
|
||||
LiveStacks *ls,
|
||||
const MachineLoopInfo *loopInfo,
|
||||
VirtRegMap *vrm) {
|
||||
switch (spillerOpt) {
|
||||
case trivial: return new TrivialSpiller(mf, lis, ls, vrm); break;
|
||||
case standard: return new StandardSpiller(mf, lis, ls, loopInfo, vrm); break;
|
||||
default: llvm_unreachable("Unreachable!"); break;
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef LLVM_CODEGEN_SPILLER_H
|
||||
#define LLVM_CODEGEN_SPILLER_H
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
@ -19,6 +20,7 @@ namespace llvm {
|
||||
class LiveStacks;
|
||||
class MachineFunction;
|
||||
class MachineInstr;
|
||||
class MachineLoopInfo;
|
||||
class VirtRegMap;
|
||||
class VNInfo;
|
||||
|
||||
@ -32,13 +34,15 @@ namespace llvm {
|
||||
|
||||
/// Spill the given live range. The method used will depend on the Spiller
|
||||
/// implementation selected.
|
||||
virtual std::vector<LiveInterval*> spill(LiveInterval *li) = 0;
|
||||
virtual std::vector<LiveInterval*> spill(LiveInterval *li,
|
||||
SmallVectorImpl<LiveInterval*> &spillIs) = 0;
|
||||
|
||||
};
|
||||
|
||||
/// Create and return a spiller object, as specified on the command line.
|
||||
Spiller* createSpiller(MachineFunction *mf, LiveIntervals *li,
|
||||
LiveStacks *ls, VirtRegMap *vrm);
|
||||
LiveStacks *ls, const MachineLoopInfo *loopInfo,
|
||||
VirtRegMap *vrm);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user