[InstCombine] Signed saturation tests. NFC
[llvm-complete.git] / lib / Target / ARM / ARMFrameLowering.h
blob6d8aee597945954e2c37a7d6a1bb901bf348d0e4
1 //===- ARMTargetFrameLowering.h - Define frame lowering for ARM -*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
10 #define LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
12 #include "llvm/CodeGen/MachineBasicBlock.h"
13 #include "llvm/CodeGen/TargetFrameLowering.h"
14 #include <vector>
16 namespace llvm {
18 class ARMSubtarget;
19 class CalleeSavedInfo;
20 class MachineFunction;
22 class ARMFrameLowering : public TargetFrameLowering {
23 protected:
24 const ARMSubtarget &STI;
26 public:
27 explicit ARMFrameLowering(const ARMSubtarget &sti);
29 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
30 /// the function.
31 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
32 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
34 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
35 MachineBasicBlock::iterator MI,
36 const std::vector<CalleeSavedInfo> &CSI,
37 const TargetRegisterInfo *TRI) const override;
39 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
40 MachineBasicBlock::iterator MI,
41 std::vector<CalleeSavedInfo> &CSI,
42 const TargetRegisterInfo *TRI) const override;
44 bool keepFramePointer(const MachineFunction &MF) const override;
46 bool enableCalleeSaveSkip(const MachineFunction &MF) const override;
48 bool hasFP(const MachineFunction &MF) const override;
49 bool hasReservedCallFrame(const MachineFunction &MF) const override;
50 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
51 int getFrameIndexReference(const MachineFunction &MF, int FI,
52 unsigned &FrameReg) const override;
53 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
54 unsigned &FrameReg, int SPAdj) const;
56 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
57 RegScavenger *RS) const override;
59 void adjustForSegmentedStacks(MachineFunction &MF,
60 MachineBasicBlock &MBB) const override;
62 /// Returns true if the target will correctly handle shrink wrapping.
63 bool enableShrinkWrapping(const MachineFunction &MF) const override {
64 return true;
66 bool isProfitableForNoCSROpt(const Function &F) const override {
67 // The no-CSR optimisation is bad for code size on ARM, because we can save
68 // many registers with a single PUSH/POP pair.
69 return false;
72 private:
73 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
74 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
75 unsigned StrOpc, bool NoGap,
76 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
77 unsigned MIFlags = 0) const;
78 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
79 std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
80 unsigned LdrOpc, bool isVarArg, bool NoGap,
81 bool(*Func)(unsigned, bool),
82 unsigned NumAlignedDPRCS2Regs) const;
84 MachineBasicBlock::iterator
85 eliminateCallFramePseudoInstr(MachineFunction &MF,
86 MachineBasicBlock &MBB,
87 MachineBasicBlock::iterator MI) const override;
90 } // end namespace llvm
92 #endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H