| //===-- 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(); |
| } |
| |