xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonFrameLowering.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //=- HexagonFrameLowering.h - Define frame lowering for Hexagon --*- C++ -*--=//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONFRAMELOWERING_H
11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_HEXAGON_HEXAGONFRAMELOWERING_H
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker #include "Hexagon.h"
14*9880d681SAndroid Build Coastguard Worker #include "HexagonBlockRanges.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetFrameLowering.h"
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker namespace llvm {
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker class HexagonInstrInfo;
20*9880d681SAndroid Build Coastguard Worker class HexagonRegisterInfo;
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker class HexagonFrameLowering : public TargetFrameLowering {
23*9880d681SAndroid Build Coastguard Worker public:
HexagonFrameLowering()24*9880d681SAndroid Build Coastguard Worker   explicit HexagonFrameLowering()
25*9880d681SAndroid Build Coastguard Worker       : TargetFrameLowering(StackGrowsDown, 8, 0, 1, true) {}
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker   // All of the prolog/epilog functionality, including saving and restoring
28*9880d681SAndroid Build Coastguard Worker   // callee-saved registers is handled in emitPrologue. This is to have the
29*9880d681SAndroid Build Coastguard Worker   // logic for shrink-wrapping in one place.
30*9880d681SAndroid Build Coastguard Worker   void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const
31*9880d681SAndroid Build Coastguard Worker       override;
emitEpilogue(MachineFunction & MF,MachineBasicBlock & MBB)32*9880d681SAndroid Build Coastguard Worker   void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const
33*9880d681SAndroid Build Coastguard Worker       override {}
spillCalleeSavedRegisters(MachineBasicBlock & MBB,MachineBasicBlock::iterator MI,const std::vector<CalleeSavedInfo> & CSI,const TargetRegisterInfo * TRI)34*9880d681SAndroid Build Coastguard Worker   bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
35*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI,
36*9880d681SAndroid Build Coastguard Worker       const TargetRegisterInfo *TRI) const override {
37*9880d681SAndroid Build Coastguard Worker     return true;
38*9880d681SAndroid Build Coastguard Worker   }
restoreCalleeSavedRegisters(MachineBasicBlock & MBB,MachineBasicBlock::iterator MI,const std::vector<CalleeSavedInfo> & CSI,const TargetRegisterInfo * TRI)39*9880d681SAndroid Build Coastguard Worker   bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
40*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI,
41*9880d681SAndroid Build Coastguard Worker       const TargetRegisterInfo *TRI) const override {
42*9880d681SAndroid Build Coastguard Worker     return true;
43*9880d681SAndroid Build Coastguard Worker   }
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock::iterator
46*9880d681SAndroid Build Coastguard Worker   eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
47*9880d681SAndroid Build Coastguard Worker                                 MachineBasicBlock::iterator I) const override;
48*9880d681SAndroid Build Coastguard Worker   void processFunctionBeforeFrameFinalized(MachineFunction &MF,
49*9880d681SAndroid Build Coastguard Worker       RegScavenger *RS = nullptr) const override;
50*9880d681SAndroid Build Coastguard Worker   void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
51*9880d681SAndroid Build Coastguard Worker       RegScavenger *RS) const override;
52*9880d681SAndroid Build Coastguard Worker 
targetHandlesStackFrameRounding()53*9880d681SAndroid Build Coastguard Worker   bool targetHandlesStackFrameRounding() const override {
54*9880d681SAndroid Build Coastguard Worker     return true;
55*9880d681SAndroid Build Coastguard Worker   }
56*9880d681SAndroid Build Coastguard Worker   int getFrameIndexReference(const MachineFunction &MF, int FI,
57*9880d681SAndroid Build Coastguard Worker       unsigned &FrameReg) const override;
58*9880d681SAndroid Build Coastguard Worker   bool hasFP(const MachineFunction &MF) const override;
59*9880d681SAndroid Build Coastguard Worker 
getCalleeSavedSpillSlots(unsigned & NumEntries)60*9880d681SAndroid Build Coastguard Worker   const SpillSlot *getCalleeSavedSpillSlots(unsigned &NumEntries)
61*9880d681SAndroid Build Coastguard Worker       const override {
62*9880d681SAndroid Build Coastguard Worker     static const SpillSlot Offsets[] = {
63*9880d681SAndroid Build Coastguard Worker       { Hexagon::R17, -4 }, { Hexagon::R16, -8 }, { Hexagon::D8, -8 },
64*9880d681SAndroid Build Coastguard Worker       { Hexagon::R19, -12 }, { Hexagon::R18, -16 }, { Hexagon::D9, -16 },
65*9880d681SAndroid Build Coastguard Worker       { Hexagon::R21, -20 }, { Hexagon::R20, -24 }, { Hexagon::D10, -24 },
66*9880d681SAndroid Build Coastguard Worker       { Hexagon::R23, -28 }, { Hexagon::R22, -32 }, { Hexagon::D11, -32 },
67*9880d681SAndroid Build Coastguard Worker       { Hexagon::R25, -36 }, { Hexagon::R24, -40 }, { Hexagon::D12, -40 },
68*9880d681SAndroid Build Coastguard Worker       { Hexagon::R27, -44 }, { Hexagon::R26, -48 }, { Hexagon::D13, -48 }
69*9880d681SAndroid Build Coastguard Worker     };
70*9880d681SAndroid Build Coastguard Worker     NumEntries = array_lengthof(Offsets);
71*9880d681SAndroid Build Coastguard Worker     return Offsets;
72*9880d681SAndroid Build Coastguard Worker   }
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker   bool assignCalleeSavedSpillSlots(MachineFunction &MF,
75*9880d681SAndroid Build Coastguard Worker       const TargetRegisterInfo *TRI, std::vector<CalleeSavedInfo> &CSI)
76*9880d681SAndroid Build Coastguard Worker       const override;
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker   bool needsAligna(const MachineFunction &MF) const;
79*9880d681SAndroid Build Coastguard Worker   const MachineInstr *getAlignaInstr(const MachineFunction &MF) const;
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   void insertCFIInstructions(MachineFunction &MF) const;
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker private:
84*9880d681SAndroid Build Coastguard Worker   typedef std::vector<CalleeSavedInfo> CSIVect;
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   void expandAlloca(MachineInstr *AI, const HexagonInstrInfo &TII,
87*9880d681SAndroid Build Coastguard Worker       unsigned SP, unsigned CF) const;
88*9880d681SAndroid Build Coastguard Worker   void insertPrologueInBlock(MachineBasicBlock &MBB, bool PrologueStubs) const;
89*9880d681SAndroid Build Coastguard Worker   void insertEpilogueInBlock(MachineBasicBlock &MBB) const;
90*9880d681SAndroid Build Coastguard Worker   bool insertCSRSpillsInBlock(MachineBasicBlock &MBB, const CSIVect &CSI,
91*9880d681SAndroid Build Coastguard Worker       const HexagonRegisterInfo &HRI, bool &PrologueStubs) const;
92*9880d681SAndroid Build Coastguard Worker   bool insertCSRRestoresInBlock(MachineBasicBlock &MBB, const CSIVect &CSI,
93*9880d681SAndroid Build Coastguard Worker       const HexagonRegisterInfo &HRI) const;
94*9880d681SAndroid Build Coastguard Worker   bool updateExitPaths(MachineBasicBlock &MBB, MachineBasicBlock *RestoreB,
95*9880d681SAndroid Build Coastguard Worker       BitVector &DoneT, BitVector &DoneF, BitVector &Path) const;
96*9880d681SAndroid Build Coastguard Worker   void insertCFIInstructionsAt(MachineBasicBlock &MBB,
97*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock::iterator At) const;
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   void adjustForCalleeSavedRegsSpillCall(MachineFunction &MF) const;
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker   bool expandCopy(MachineBasicBlock &B, MachineBasicBlock::iterator It,
102*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
103*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
104*9880d681SAndroid Build Coastguard Worker   bool expandStoreInt(MachineBasicBlock &B, MachineBasicBlock::iterator It,
105*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
106*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
107*9880d681SAndroid Build Coastguard Worker   bool expandLoadInt(MachineBasicBlock &B, MachineBasicBlock::iterator It,
108*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
109*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
110*9880d681SAndroid Build Coastguard Worker   bool expandStoreVecPred(MachineBasicBlock &B, MachineBasicBlock::iterator It,
111*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
112*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
113*9880d681SAndroid Build Coastguard Worker   bool expandLoadVecPred(MachineBasicBlock &B, MachineBasicBlock::iterator It,
114*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
115*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
116*9880d681SAndroid Build Coastguard Worker   bool expandStoreVec2(MachineBasicBlock &B, MachineBasicBlock::iterator It,
117*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
118*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
119*9880d681SAndroid Build Coastguard Worker   bool expandLoadVec2(MachineBasicBlock &B, MachineBasicBlock::iterator It,
120*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
121*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
122*9880d681SAndroid Build Coastguard Worker   bool expandStoreVec(MachineBasicBlock &B, MachineBasicBlock::iterator It,
123*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
124*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
125*9880d681SAndroid Build Coastguard Worker   bool expandLoadVec(MachineBasicBlock &B, MachineBasicBlock::iterator It,
126*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo &MRI, const HexagonInstrInfo &HII,
127*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
128*9880d681SAndroid Build Coastguard Worker   bool expandSpillMacros(MachineFunction &MF,
129*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &NewRegs) const;
130*9880d681SAndroid Build Coastguard Worker 
131*9880d681SAndroid Build Coastguard Worker   unsigned findPhysReg(MachineFunction &MF, HexagonBlockRanges::IndexRange &FIR,
132*9880d681SAndroid Build Coastguard Worker       HexagonBlockRanges::InstrIndexMap &IndexMap,
133*9880d681SAndroid Build Coastguard Worker       HexagonBlockRanges::RegToRangeMap &DeadMap,
134*9880d681SAndroid Build Coastguard Worker       const TargetRegisterClass *RC) const;
135*9880d681SAndroid Build Coastguard Worker   void optimizeSpillSlots(MachineFunction &MF,
136*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<unsigned> &VRegs) const;
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   void findShrunkPrologEpilog(MachineFunction &MF, MachineBasicBlock *&PrologB,
139*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock *&EpilogB) const;
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker   void addCalleeSaveRegistersAsImpOperand(MachineInstr *MI, const CSIVect &CSI,
142*9880d681SAndroid Build Coastguard Worker       bool IsDef, bool IsKill) const;
143*9880d681SAndroid Build Coastguard Worker   bool shouldInlineCSR(llvm::MachineFunction &MF, const CSIVect &CSI) const;
144*9880d681SAndroid Build Coastguard Worker   bool useSpillFunction(MachineFunction &MF, const CSIVect &CSI) const;
145*9880d681SAndroid Build Coastguard Worker   bool useRestoreFunction(MachineFunction &MF, const CSIVect &CSI) const;
146*9880d681SAndroid Build Coastguard Worker };
147*9880d681SAndroid Build Coastguard Worker 
148*9880d681SAndroid Build Coastguard Worker } // End llvm namespace
149*9880d681SAndroid Build Coastguard Worker 
150*9880d681SAndroid Build Coastguard Worker #endif
151