Add X86 Maximal Stack Alignment Calculator Pass before RA
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 23 Apr 2008 18:23:05 +0000 (18:23 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 23 Apr 2008 18:23:05 +0000 (18:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50166 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86.h
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86TargetMachine.cpp
lib/Target/X86/X86TargetMachine.h

index 81177bad08d866c21c3bdef535fed513e89a7fea..2dd067afd332f569d5c820f5ca60466516b8f82d 100644 (file)
@@ -51,6 +51,11 @@ FunctionPass *createX86CodeEmitterPass(X86TargetMachine &TM,
 ///
 FunctionPass *createEmitX86CodeToMemory();
 
+/// createX86MaxStackAlignmentCalculatorPass - This function returns a pass which
+/// calculates maximal stack alignment required for function
+///
+FunctionPass *createX86MaxStackAlignmentCalculatorPass();
+
 } // End llvm namespace
 
 // Defines symbolic names for X86 registers.  This defines a mapping from
index 111b0e0d28fa40c50f2153609ea120357208367a..2b14f6eb9b80735aab78b0c661830345944efd93 100644 (file)
@@ -36,6 +36,7 @@
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/ADT/BitVector.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/Compiler.h"
 using namespace llvm;
 
 X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
@@ -280,16 +281,10 @@ bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
 bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
   MachineFrameInfo *MFI = MF.getFrameInfo();;
 
-  // FIXME: This is really really ugly, but it seems we need to decide, whether
-  // we will need stack realignment or not too early (during RA stage).
-  unsigned MaxAlign = MFI->getMaxAlignment();
-  if (!MaxAlign)
-    MaxAlign = calculateMaxStackAlignment(MFI);
-
   // FIXME: Currently we don't support stack realignment for functions with
   // variable-sized allocas
-  return (RealignStack &&
-          (MaxAlign > StackAlign &&
+  return (MFI->getMaxAlignment() &&
+          (MFI->getMaxAlignment() > StackAlign &&
            !MFI->hasVarSizedObjects()));
 }
 
@@ -1118,3 +1113,31 @@ unsigned getX86SubSuperRegister(unsigned Reg, MVT::ValueType VT, bool High) {
 }
 
 #include "X86GenRegisterInfo.inc"
+
+namespace {
+  struct VISIBILITY_HIDDEN MSAC : public MachineFunctionPass {
+    static char ID;
+    MSAC() : MachineFunctionPass((intptr_t)&ID) {}
+
+    virtual bool runOnMachineFunction(MachineFunction &MF) {
+      MachineFrameInfo *FFI = MF.getFrameInfo();
+
+      // Calculate and set max stack object alignment early, so we can decide
+      // whether we will need stack realignment (and thus FP).
+      unsigned MaxAlign = calculateMaxStackAlignment(FFI);
+
+      FFI->setMaxAlignment(MaxAlign);
+
+      return false;
+    }
+
+    virtual const char *getPassName() const {
+      return "X86 Maximal Stack Alignment Calculator";
+    }
+  };
+
+  char MSAC::ID = 0;
+}
+
+FunctionPass*
+llvm::createX86MaxStackAlignmentCalculatorPass() { return new MSAC(); }
index a30c950e5add97420941e4f9c6944697c4c1f385..f75a77c6b0726298eeeec7afefc096b8215d51bf 100644 (file)
@@ -161,6 +161,11 @@ bool X86TargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) {
   return false;
 }
 
+bool X86TargetMachine::addPreRegAlloc(PassManagerBase &PM, bool Fast) {
+  PM.add(createX86MaxStackAlignmentCalculatorPass());
+  return false;  // -print-machineinstr shouldn't print after this.
+}
+
 bool X86TargetMachine::addPostRegAlloc(PassManagerBase &PM, bool Fast) {
   PM.add(createX86FloatingPointStackifierPass());
   return true;  // -print-machineinstr should print after this.
index 7a807b148c4584a0b78a409d9a282d365068ba02..294478c3a285ecbaee220f164ad321c4e21f37eb 100644 (file)
@@ -61,7 +61,8 @@ public:
   static unsigned getJITMatchQuality();
   
   // Set up the pass pipeline.
-  virtual bool addInstSelector(PassManagerBase &PM, bool Fast);  
+  virtual bool addInstSelector(PassManagerBase &PM, bool Fast);
+  virtual bool addPreRegAlloc(PassManagerBase &PM, bool Fast);
   virtual bool addPostRegAlloc(PassManagerBase &PM, bool Fast);
   virtual bool addAssemblyEmitter(PassManagerBase &PM, bool Fast, 
                                   std::ostream &Out);