Move enabling the local stack allocation pass into the target where it belongs.

For now it's still a command line option, but the interface to the generic
code doesn't need to know that.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111942 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Grosbach 2010-08-24 19:05:43 +00:00
parent 05ea54e886
commit a273442891
6 changed files with 26 additions and 23 deletions

View File

@ -593,6 +593,13 @@ public:
return false;
}
/// requiresVirtualBaseRegisters - Returns true if the target wants the
/// LocalStackAllocation pass to be run and virtual base registers
/// used for more efficient stack access.
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const {
return false;
}
/// hasFP - Return true if the specified function should have a dedicated
/// frame pointer register. For most targets this is true only if the function
/// has variable sized allocas or if frame pointer elimination is disabled.

View File

@ -74,16 +74,6 @@ static cl::opt<bool> EnableMCLogging("enable-mc-api-logging", cl::Hidden,
static cl::opt<bool> VerifyMachineCode("verify-machineinstrs", cl::Hidden,
cl::desc("Verify generated machine code"),
cl::init(getenv("LLVM_VERIFY_MACHINEINSTRS")!=NULL));
// Enabled or disable local stack object block allocation. This is an
// experimental pass that allocates locals relative to one another before
// register allocation and then assigns them to actual stack slots as a block
// later in PEI. This will eventually allow targets with limited index offset
// range to allocate additional base registers (not just FP and SP) to
// more efficiently reference locals, as well as handle situations where
// locals cannot be referenced via SP or FP at all (dynamic stack realignment
// together with variable sized objects, for example).
cl::opt<bool> EnableLocalStackAlloc("enable-local-stack-alloc", cl::init(false),
cl::Hidden, cl::desc("Enable pre-regalloc stack frame index allocation"));
static cl::opt<cl::boolOrDefault>
AsmVerbose("asm-verbose", cl::desc("Add comments to directives."),
@ -354,11 +344,9 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
if (OptLevel != CodeGenOpt::None)
PM.add(createOptimizePHIsPass());
// Assign local variables to stack slots relative to one another and simplify
// frame index references where possible. Final stack slot locations will be
// assigned in PEI.
if (EnableLocalStackAlloc)
PM.add(createLocalStackSlotAllocationPass());
// If the target requests it, assign local variables to stack slots relative
// to one another and simplify frame index references where possible.
PM.add(createLocalStackSlotAllocationPass());
if (OptLevel != CodeGenOpt::None) {
// With optimization, dead code should already be eliminated. However

View File

@ -74,10 +74,12 @@ FunctionPass *llvm::createLocalStackSlotAllocationPass() {
bool LocalStackSlotPass::runOnMachineFunction(MachineFunction &MF) {
MachineFrameInfo *MFI = MF.getFrameInfo();
const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
unsigned LocalObjectCount = MFI->getObjectIndexEnd();
// Early exit if there are no locals to consider
if (!LocalObjectCount)
// If the target doesn't want/need this pass, or if there are no locals
// to consider, early exit.
if (!TRI->requiresVirtualBaseRegisters(MF) || LocalObjectCount == 0)
return true;
// Make sure we have enough space to store the local offsets.

View File

@ -41,10 +41,6 @@
using namespace llvm;
// FIXME: For testing purposes only. Remove once the pre-allocation pass
// is done.
extern cl::opt<bool> EnableLocalStackAlloc;
char PEI::ID = 0;
INITIALIZE_PASS(PEI, "prologepilog",
@ -560,7 +556,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
// check for whether the frame is large enough to want to use virtual
// frame index registers. Functions which don't want/need this optimization
// will continue to use the existing code path.
if (EnableLocalStackAlloc && MFI->getUseLocalStackAllocationBlock()) {
if (MFI->getUseLocalStackAllocationBlock()) {
unsigned Align = MFI->getLocalFrameMaxAlign();
// Adjust to alignment boundary.

View File

@ -43,9 +43,12 @@ namespace llvm {
cl::opt<bool>
ReuseFrameIndexVals("arm-reuse-frame-index-vals", cl::Hidden, cl::init(true),
cl::desc("Reuse repeated frame index values"));
cl::opt<bool>
static cl::opt<bool>
ForceAllBaseRegAlloc("arm-force-base-reg-alloc", cl::Hidden, cl::init(true),
cl::desc("Force use of virtual base registers for stack load/store"));
static cl::opt<bool>
EnableLocalStackAlloc("enable-local-stack-alloc", cl::init(false), cl::Hidden,
cl::desc("Enable pre-regalloc stack frame index allocation"));
}
using namespace llvm;
@ -1285,6 +1288,11 @@ requiresFrameIndexScavenging(const MachineFunction &MF) const {
return true;
}
bool ARMBaseRegisterInfo::
requiresVirtualBaseRegisters(const MachineFunction &MF) const {
return EnableLocalStackAlloc;
}
// hasReservedCallFrame - Under normal circumstances, when a frame pointer is
// not required, we reserve argument space for call sites in the function
// immediately on entry to the current function. This eliminates the need for

View File

@ -154,6 +154,8 @@ public:
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const;
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const;
virtual bool hasReservedCallFrame(const MachineFunction &MF) const;
virtual bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;