diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-23 18:23:05 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-23 18:23:05 +0000 |
commit | 856914fe0084278d11edec79c8b707a6276b8857 (patch) | |
tree | 8f292bbb3218ffefab9e6d86f4ef96af78536734 /lib/Target/X86/X86RegisterInfo.cpp | |
parent | 769b481e9f57b9fa2acf6c5fe0a94877520fcec3 (diff) | |
download | llvm-856914fe0084278d11edec79c8b707a6276b8857.tar.gz llvm-856914fe0084278d11edec79c8b707a6276b8857.tar.bz2 llvm-856914fe0084278d11edec79c8b707a6276b8857.tar.xz |
Add X86 Maximal Stack Alignment Calculator Pass before RA
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50166 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index 111b0e0d28..2b14f6eb9b 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -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(); } |