llvm-project/llvm/lib/CodeGen/MaxStackAlignment.cpp

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