Move enabling the local stack allocation pass into the target where it belongs.
authorJim Grosbach <grosbach@apple.com>
Tue, 24 Aug 2010 19:05:43 +0000 (19:05 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 24 Aug 2010 19:05:43 +0000 (19:05 +0000)
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

include/llvm/Target/TargetRegisterInfo.h
lib/CodeGen/LLVMTargetMachine.cpp
lib/CodeGen/LocalStackSlotAllocation.cpp
lib/CodeGen/PrologEpilogInserter.cpp
lib/Target/ARM/ARMBaseRegisterInfo.cpp
lib/Target/ARM/ARMBaseRegisterInfo.h

index 43b6bad9b39adf8340ad5609fd5952a06777ca4e..492499899f896b6f8ef1d3e030455521ce67beeb 100644 (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.
index b856d9093ebc26f136f9ce8c43d3f319ec5cf431..80dbb988df607a58769a3a3cacdc885962e3fc88 100644 (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
index 811cb07628d27baa8bf220cfcc954cabb1d2774e..3f79593b4edf209806943a7f0c27309e1d51b45e 100644 (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.
index e360f2c4610848e293873237f14e779b71cb8aa2..4c3e796f5e3ad31131adc1f0d3295790a7ef8e87 100644 (file)
 
 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.
index cf6507b5d48a97063c1151becde78fd65daac2c3..edfacc72e0c5ee12513f15ae955b9e8e8549a424 100644 (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
index afd43eaeb362f95f4122198b32b26626e0baa1b1..7044b74e7dc6881e2bf285127dbf7d0975536313 100644 (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;