
AMDGPU is unusual in that the both stack is indexed in the same direction as stack growth (up). We therefore always need the emergency stack slots placed as low as possible to ensure they are in range of load/store instruction immediate offsets. The existing logic is mostly OK, but failed if we required stack realignment. I don't understand what the existing control isFPCloseToIncomingSP is supposed to mean, but can only be used to stop placing the scavenge slots earlier. Make this explicit so that targets can opt-in rather than opt-out only.
62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
//===-- MipsFrameLowering.h - Define frame lowering for Mips ----*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
//
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_MIPS_MIPSFRAMELOWERING_H
|
|
#define LLVM_LIB_TARGET_MIPS_MIPSFRAMELOWERING_H
|
|
|
|
#include "Mips.h"
|
|
#include "llvm/CodeGen/TargetFrameLowering.h"
|
|
|
|
namespace llvm {
|
|
class MipsSubtarget;
|
|
|
|
class MipsFrameLowering : public TargetFrameLowering {
|
|
protected:
|
|
const MipsSubtarget &STI;
|
|
|
|
public:
|
|
explicit MipsFrameLowering(const MipsSubtarget &sti, Align Alignment)
|
|
: TargetFrameLowering(StackGrowsDown, Alignment, 0, Alignment), STI(sti) {
|
|
}
|
|
|
|
static const MipsFrameLowering *create(const MipsSubtarget &ST);
|
|
|
|
bool hasFP(const MachineFunction &MF) const override;
|
|
|
|
bool hasBP(const MachineFunction &MF) const;
|
|
|
|
bool allocateScavengingFrameIndexesNearIncomingSP(
|
|
const MachineFunction &MF) const override {
|
|
return false;
|
|
}
|
|
|
|
bool enableShrinkWrapping(const MachineFunction &MF) const override {
|
|
return true;
|
|
}
|
|
|
|
MachineBasicBlock::iterator
|
|
eliminateCallFramePseudoInstr(MachineFunction &MF,
|
|
MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator I) const override;
|
|
|
|
protected:
|
|
uint64_t estimateStackSize(const MachineFunction &MF) const;
|
|
};
|
|
|
|
/// Create MipsFrameLowering objects.
|
|
const MipsFrameLowering *createMips16FrameLowering(const MipsSubtarget &ST);
|
|
const MipsFrameLowering *createMipsSEFrameLowering(const MipsSubtarget &ST);
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|