mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
Factor the stack alignment calculations out into a target independent pass.
No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90336 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f1e01dcc94
commit
e27d205d5d
@ -327,7 +327,20 @@ public:
|
||||
/// setMaxAlignment - Set the preferred alignment.
|
||||
///
|
||||
void setMaxAlignment(unsigned Align) { MaxAlignment = Align; }
|
||||
|
||||
|
||||
/// calculateMaxStackAlignment() - If there is a local object which requires
|
||||
/// greater alignment than the current max alignment, adjust accordingly.
|
||||
void calculateMaxStackAlignment() {
|
||||
for (int i = getObjectIndexBegin(),
|
||||
e = getObjectIndexEnd(); i != e; ++i) {
|
||||
if (isDeadObjectIndex(i))
|
||||
continue;
|
||||
|
||||
unsigned Align = getObjectAlignment(i);
|
||||
MaxAlignment = std::max(MaxAlignment, Align);
|
||||
}
|
||||
}
|
||||
|
||||
/// hasCalls - Return true if the current function has no function calls.
|
||||
/// This is only valid during or after prolog/epilog code emission.
|
||||
///
|
||||
|
@ -191,6 +191,10 @@ namespace llvm {
|
||||
/// the GCC-style builtin setjmp/longjmp (sjlj) to handling EH control flow.
|
||||
FunctionPass *createSjLjEHPass(const TargetLowering *tli);
|
||||
|
||||
/// createMaxStackAlignmentCalculatorPass() - Determine the maximum required
|
||||
/// alignment for a function.
|
||||
FunctionPass* createMaxStackAlignmentCalculatorPass();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
70
lib/CodeGen/MaxStackAlignment.cpp
Normal file
70
lib/CodeGen/MaxStackAlignment.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
//===-- MaxStackAlignment.cpp - Compute the required stack alignment -- ---===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This pass looks for vector register usage and aligned local objects to
|
||||
// calculate the maximum required alignment for a function. This is used by
|
||||
// targets which support it to determine if dynamic stack realignment is
|
||||
// necessary.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
struct MaximalStackAlignmentCalculator : public MachineFunctionPass {
|
||||
static char ID;
|
||||
MaximalStackAlignmentCalculator() : MachineFunctionPass(&ID) {}
|
||||
|
||||
virtual bool runOnMachineFunction(MachineFunction &MF) {
|
||||
MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
|
||||
// Calculate max stack alignment of all already allocated stack objects.
|
||||
FFI->calculateMaxStackAlignment();
|
||||
unsigned MaxAlign = FFI->getMaxAlignment();
|
||||
|
||||
// Be over-conservative: scan over all vreg defs and find whether vector
|
||||
// registers are used. If yes, there is probability that vector registers
|
||||
// will be spilled and thus the stack needs to be aligned properly.
|
||||
// FIXME: It would be better to only do this if a spill actually
|
||||
// happens rather than conseratively aligning the stack regardless.
|
||||
for (unsigned RegNum = TargetRegisterInfo::FirstVirtualRegister;
|
||||
RegNum < RI.getLastVirtReg(); ++RegNum)
|
||||
MaxAlign = std::max(MaxAlign, RI.getRegClass(RegNum)->getAlignment());
|
||||
|
||||
if (FFI->getMaxAlignment() == MaxAlign)
|
||||
return false;
|
||||
|
||||
FFI->setMaxAlignment(MaxAlign);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "Stack Alignment Requirements Auto-Detector";
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
||||
char MaximalStackAlignmentCalculator::ID = 0;
|
||||
}
|
||||
|
||||
FunctionPass*
|
||||
llvm::createMaxStackAlignmentCalculatorPass() {
|
||||
return new MaximalStackAlignmentCalculator();
|
||||
}
|
||||
|
@ -109,7 +109,6 @@ FunctionPass *createNEONPreAllocPass();
|
||||
FunctionPass *createNEONMoveFixPass();
|
||||
FunctionPass *createThumb2ITBlockPass();
|
||||
FunctionPass *createThumb2SizeReductionPass();
|
||||
FunctionPass *createARMMaxStackAlignmentCalculatorPass();
|
||||
|
||||
extern Target TheARMTarget, TheThumbTarget;
|
||||
|
||||
|
@ -471,21 +471,6 @@ ARMBaseRegisterInfo::UpdateRegAllocHint(unsigned Reg, unsigned NewReg,
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned calculateMaxStackAlignment(const MachineFrameInfo *FFI) {
|
||||
unsigned MaxAlign = 0;
|
||||
|
||||
for (int i = FFI->getObjectIndexBegin(),
|
||||
e = FFI->getObjectIndexEnd(); i != e; ++i) {
|
||||
if (FFI->isDeadObjectIndex(i))
|
||||
continue;
|
||||
|
||||
unsigned Align = FFI->getObjectAlignment(i);
|
||||
MaxAlign = std::max(MaxAlign, Align);
|
||||
}
|
||||
|
||||
return MaxAlign;
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
@ -585,14 +570,12 @@ ARMBaseRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
SmallVector<unsigned, 4> UnspilledCS2GPRs;
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
// Calculate and set max stack object alignment early, so we can decide
|
||||
// whether we will need stack realignment (and thus FP).
|
||||
if (RealignStack) {
|
||||
unsigned MaxAlign = std::max(MFI->getMaxAlignment(),
|
||||
calculateMaxStackAlignment(MFI));
|
||||
MFI->setMaxAlignment(MaxAlign);
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->calculateMaxStackAlignment();
|
||||
}
|
||||
|
||||
// Don't spill FP if the frame can be eliminated. This is determined
|
||||
@ -1479,48 +1462,4 @@ emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const {
|
||||
emitSPUpdate(isARM, MBB, MBBI, dl, TII, VARegSaveSize);
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct MaximalStackAlignmentCalculator : public MachineFunctionPass {
|
||||
static char ID;
|
||||
MaximalStackAlignmentCalculator() : MachineFunctionPass(&ID) {}
|
||||
|
||||
virtual bool runOnMachineFunction(MachineFunction &MF) {
|
||||
MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
|
||||
// Calculate max stack alignment of all already allocated stack objects.
|
||||
unsigned MaxAlign = calculateMaxStackAlignment(FFI);
|
||||
|
||||
// Be over-conservative: scan over all vreg defs and find, whether vector
|
||||
// registers are used. If yes - there is probability, that vector register
|
||||
// will be spilled and thus stack needs to be aligned properly.
|
||||
for (unsigned RegNum = TargetRegisterInfo::FirstVirtualRegister;
|
||||
RegNum < RI.getLastVirtReg(); ++RegNum)
|
||||
MaxAlign = std::max(MaxAlign, RI.getRegClass(RegNum)->getAlignment());
|
||||
|
||||
if (FFI->getMaxAlignment() == MaxAlign)
|
||||
return false;
|
||||
|
||||
FFI->setMaxAlignment(MaxAlign);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "ARM Stack Required Alignment Auto-Detector";
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
||||
char MaximalStackAlignmentCalculator::ID = 0;
|
||||
}
|
||||
|
||||
FunctionPass*
|
||||
llvm::createARMMaxStackAlignmentCalculatorPass() {
|
||||
return new MaximalStackAlignmentCalculator();
|
||||
}
|
||||
|
||||
#include "ARMGenRegisterInfo.inc"
|
||||
|
@ -95,7 +95,7 @@ bool ARMBaseTargetMachine::addPreRegAlloc(PassManagerBase &PM,
|
||||
|
||||
// Calculate and set max stack object alignment early, so we can decide
|
||||
// whether we will need stack realignment (and thus FP).
|
||||
PM.add(createARMMaxStackAlignmentCalculatorPass());
|
||||
PM.add(createMaxStackAlignmentCalculatorPass());
|
||||
|
||||
// FIXME: temporarily disabling load / store optimization pass for Thumb1.
|
||||
if (OptLevel != CodeGenOpt::None && !Subtarget.isThumb1Only())
|
||||
|
@ -62,11 +62,6 @@ MCCodeEmitter *createX86MCCodeEmitter(const Target &, TargetMachine &TM);
|
||||
///
|
||||
FunctionPass *createEmitX86CodeToMemory();
|
||||
|
||||
/// createX86MaxStackAlignmentCalculatorPass - This function returns a pass
|
||||
/// which calculates maximal stack alignment required for function
|
||||
///
|
||||
FunctionPass *createX86MaxStackAlignmentCalculatorPass();
|
||||
|
||||
extern Target TheX86_32Target, TheX86_64Target;
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -423,21 +423,6 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
// Stack Frame Processing methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static unsigned calculateMaxStackAlignment(const MachineFrameInfo *FFI) {
|
||||
unsigned MaxAlign = 0;
|
||||
|
||||
for (int i = FFI->getObjectIndexBegin(),
|
||||
e = FFI->getObjectIndexEnd(); i != e; ++i) {
|
||||
if (FFI->isDeadObjectIndex(i))
|
||||
continue;
|
||||
|
||||
unsigned Align = FFI->getObjectAlignment(i);
|
||||
MaxAlign = std::max(MaxAlign, Align);
|
||||
}
|
||||
|
||||
return MaxAlign;
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. This is true if the function has variable sized allocas
|
||||
/// or if frame pointer elimination is disabled.
|
||||
@ -638,10 +623,7 @@ X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
|
||||
// Calculate and set max stack object alignment early, so we can decide
|
||||
// whether we will need stack realignment (and thus FP).
|
||||
unsigned MaxAlign = std::max(MFI->getMaxAlignment(),
|
||||
calculateMaxStackAlignment(MFI));
|
||||
|
||||
MFI->setMaxAlignment(MaxAlign);
|
||||
MFI->calculateMaxStackAlignment();
|
||||
|
||||
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
|
||||
int32_t TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
|
||||
@ -1482,45 +1464,3 @@ unsigned getX86SubSuperRegister(unsigned Reg, EVT VT, bool High) {
|
||||
}
|
||||
|
||||
#include "X86GenRegisterInfo.inc"
|
||||
|
||||
namespace {
|
||||
struct MSAC : public MachineFunctionPass {
|
||||
static char ID;
|
||||
MSAC() : MachineFunctionPass(&ID) {}
|
||||
|
||||
virtual bool runOnMachineFunction(MachineFunction &MF) {
|
||||
MachineFrameInfo *FFI = MF.getFrameInfo();
|
||||
MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
|
||||
// Calculate max stack alignment of all already allocated stack objects.
|
||||
unsigned MaxAlign = calculateMaxStackAlignment(FFI);
|
||||
|
||||
// Be over-conservative: scan over all vreg defs and find, whether vector
|
||||
// registers are used. If yes - there is probability, that vector register
|
||||
// will be spilled and thus stack needs to be aligned properly.
|
||||
for (unsigned RegNum = TargetRegisterInfo::FirstVirtualRegister;
|
||||
RegNum < RI.getLastVirtReg(); ++RegNum)
|
||||
MaxAlign = std::max(MaxAlign, RI.getRegClass(RegNum)->getAlignment());
|
||||
|
||||
if (FFI->getMaxAlignment() == MaxAlign)
|
||||
return false;
|
||||
|
||||
FFI->setMaxAlignment(MaxAlign);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual const char *getPassName() const {
|
||||
return "X86 Maximal Stack Alignment Calculator";
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
||||
char MSAC::ID = 0;
|
||||
}
|
||||
|
||||
FunctionPass*
|
||||
llvm::createX86MaxStackAlignmentCalculatorPass() { return new MSAC(); }
|
||||
|
@ -163,7 +163,7 @@ bool X86TargetMachine::addPreRegAlloc(PassManagerBase &PM,
|
||||
CodeGenOpt::Level OptLevel) {
|
||||
// Calculate and set max stack object alignment early, so we can decide
|
||||
// whether we will need stack realignment (and thus FP).
|
||||
PM.add(createX86MaxStackAlignmentCalculatorPass());
|
||||
PM.add(createMaxStackAlignmentCalculatorPass());
|
||||
return false; // -print-machineinstr shouldn't print after this.
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user