forked from OSchip/llvm-project
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
//===-- 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();
|
|
}
|
|
|