44 enum Lowering { TouchAndSub, Sub, Probe };
53 Lowering getLowering(int64_t CurrentOffset, int64_t AllocaAmount);
64 int64_t StackProbeSize;
67 StringRef getPassName()
const override {
return "X86 WinAlloca Expander"; }
76 return new X86WinAllocaExpander();
100 X86WinAllocaExpander::Lowering
101 X86WinAllocaExpander::getLowering(int64_t CurrentOffset,
102 int64_t AllocaAmount) {
104 if (AllocaAmount < 0 || AllocaAmount > StackProbeSize)
108 if (CurrentOffset + AllocaAmount <= StackProbeSize)
136 LoweringMap &Lowerings) {
144 OutOffset[&MBB] = INT32_MAX;
156 Offset =
std::max(Offset, OutOffset[Pred]);
157 if (Offset == -1) Offset = INT32_MAX;
160 if (
MI.getOpcode() == X86::WIN_ALLOCA_32 ||
161 MI.getOpcode() == X86::WIN_ALLOCA_64) {
164 Lowering L = getLowering(Offset, Amount);
180 }
else if (
MI.getOpcode() == X86::ADJCALLSTACKUP32 ||
181 MI.getOpcode() == X86::ADJCALLSTACKUP64) {
182 Offset -=
MI.getOperand(0).getImm();
183 }
else if (
MI.getOpcode() == X86::ADJCALLSTACKDOWN32 ||
184 MI.getOpcode() == X86::ADJCALLSTACKDOWN64) {
185 Offset +=
MI.getOperand(0).getImm();
186 }
else if (
MI.modifiesRegister(StackPtr,
TRI)) {
198 return isInt<8>(Amount) ? X86::SUB64ri8 : X86::SUB64ri32;
199 return isInt<8>(Amount) ? X86::SUB32ri8 : X86::SUB32ri;
213 bool Is64Bit = STI->is64Bit();
214 assert(SlotSize == 4 || SlotSize == 8);
215 unsigned RegA = (SlotSize == 8) ? X86::RAX :
X86::EAX;
219 assert(Amount >= SlotSize);
222 BuildMI(*MBB, I, DL,
TII->get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
232 if (Amount == SlotSize) {
234 BuildMI(*MBB, I, DL,
TII->get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
244 if (!NoStackArgProbe) {
246 BuildMI(*MBB, MI, DL,
TII->get(TargetOpcode::COPY), RegA)
250 STI->getFrameLowering()->emitStackProbe(*MBB->
getParent(), *MBB,
MI, DL,
254 BuildMI(*MBB, I, DL,
TII->get(Is64Bit ? X86::SUB64rr : X86::SUB32rr),
267 if (!
MRI->use_empty(AmountReg))
285 TII = STI->getInstrInfo();
286 TRI = STI->getRegisterInfo();
287 StackPtr =
TRI->getStackRegister();
288 SlotSize =
TRI->getSlotSize();
290 StackProbeSize = 4096;
301 LoweringMap Lowerings;
302 computeLowerings(MF, Lowerings);
303 for (
auto &
P : Lowerings)
304 lower(
P.first,
P.second);
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
This class represents lattice values for constants.
bool hasWinAlloca() const
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
unsigned getReg() const
getReg - Returns the register number.
constexpr bool isInt< 8 >(int64_t x)
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
This class implements a map that also provides access to all stored values in a deterministic order...
unsigned const TargetRegisterInfo * TRI
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const HexagonInstrInfo * TII
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
static int64_t getWinAllocaAmount(MachineInstr *MI, MachineRegisterInfo *MRI)
Return the allocation amount for a WinAlloca instruction, or -1 if unknown.
TargetInstrInfo - Interface to description of machine instruction set.
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
unsigned const MachineRegisterInfo * MRI
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
FunctionPass class - This class is used to implement most global optimizations.
iterator_range< pred_iterator > predecessors()
std::enable_if< std::numeric_limits< T >::is_signed, bool >::type getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
MachineInstr * getUniqueVRegDef(unsigned Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
const Function & getFunction() const
Return the LLVM function that this machine code represents.
const MachineBasicBlock * getParent() const
FunctionPass * createX86WinAllocaExpander()
Return a pass that expands WinAlloca pseudo-instructions.
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
StringRef getValueAsString() const
Return the attribute's value as a string.
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
rpo Deduce function attributes in RPO
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
static unsigned getSubOpcode(bool Is64Bit, int64_t Amount)
StringRef - Represent a constant reference to a string, i.e.
static bool isPushPop(const MachineInstr &MI)
const MachineOperand & getOperand(unsigned i) const