xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1349cc55cSDimitry Andric //===-- AMDGPUISelDAGToDAG.h - A dag to dag inst selector for AMDGPU ----===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //==-----------------------------------------------------------------------===//
8349cc55cSDimitry Andric //
9349cc55cSDimitry Andric /// \file
10349cc55cSDimitry Andric /// Defines an instruction selector for the AMDGPU target.
11349cc55cSDimitry Andric //
12349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
13349cc55cSDimitry Andric 
14349cc55cSDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUISELDAGTODAG_H
15349cc55cSDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUISELDAGTODAG_H
16349cc55cSDimitry Andric 
17349cc55cSDimitry Andric #include "GCNSubtarget.h"
18349cc55cSDimitry Andric #include "SIMachineFunctionInfo.h"
1906c3fb27SDimitry Andric #include "SIModeRegisterDefaults.h"
20349cc55cSDimitry Andric #include "llvm/CodeGen/SelectionDAGISel.h"
21349cc55cSDimitry Andric #include "llvm/Target/TargetMachine.h"
22349cc55cSDimitry Andric 
23349cc55cSDimitry Andric using namespace llvm;
24349cc55cSDimitry Andric 
25349cc55cSDimitry Andric namespace {
26349cc55cSDimitry Andric 
27349cc55cSDimitry Andric static inline bool getConstantValue(SDValue N, uint32_t &Out) {
28349cc55cSDimitry Andric   // This is only used for packed vectors, where using 0 for undef should
29349cc55cSDimitry Andric   // always be good.
30349cc55cSDimitry Andric   if (N.isUndef()) {
31349cc55cSDimitry Andric     Out = 0;
32349cc55cSDimitry Andric     return true;
33349cc55cSDimitry Andric   }
34349cc55cSDimitry Andric 
35349cc55cSDimitry Andric   if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(N)) {
36349cc55cSDimitry Andric     Out = C->getAPIntValue().getSExtValue();
37349cc55cSDimitry Andric     return true;
38349cc55cSDimitry Andric   }
39349cc55cSDimitry Andric 
40349cc55cSDimitry Andric   if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N)) {
41349cc55cSDimitry Andric     Out = C->getValueAPF().bitcastToAPInt().getSExtValue();
42349cc55cSDimitry Andric     return true;
43349cc55cSDimitry Andric   }
44349cc55cSDimitry Andric 
45349cc55cSDimitry Andric   return false;
46349cc55cSDimitry Andric }
47349cc55cSDimitry Andric 
48349cc55cSDimitry Andric // TODO: Handle undef as zero
491db9f3b2SDimitry Andric static inline SDNode *packConstantV2I16(const SDNode *N, SelectionDAG &DAG) {
50349cc55cSDimitry Andric   assert(N->getOpcode() == ISD::BUILD_VECTOR && N->getNumOperands() == 2);
51349cc55cSDimitry Andric   uint32_t LHSVal, RHSVal;
52349cc55cSDimitry Andric   if (getConstantValue(N->getOperand(0), LHSVal) &&
53349cc55cSDimitry Andric       getConstantValue(N->getOperand(1), RHSVal)) {
54349cc55cSDimitry Andric     SDLoc SL(N);
551db9f3b2SDimitry Andric     uint32_t K = (LHSVal & 0xffff) | (RHSVal << 16);
56349cc55cSDimitry Andric     return DAG.getMachineNode(AMDGPU::S_MOV_B32, SL, N->getValueType(0),
57349cc55cSDimitry Andric                               DAG.getTargetConstant(K, SL, MVT::i32));
58349cc55cSDimitry Andric   }
59349cc55cSDimitry Andric 
60349cc55cSDimitry Andric   return nullptr;
61349cc55cSDimitry Andric }
62349cc55cSDimitry Andric 
63349cc55cSDimitry Andric } // namespace
64349cc55cSDimitry Andric 
65349cc55cSDimitry Andric /// AMDGPU specific code to select AMDGPU machine instructions for
66349cc55cSDimitry Andric /// SelectionDAG operations.
67349cc55cSDimitry Andric class AMDGPUDAGToDAGISel : public SelectionDAGISel {
68349cc55cSDimitry Andric   // Subtarget - Keep a pointer to the AMDGPU Subtarget around so that we can
69349cc55cSDimitry Andric   // make the right decision when generating code for different targets.
70349cc55cSDimitry Andric   const GCNSubtarget *Subtarget;
71349cc55cSDimitry Andric 
72349cc55cSDimitry Andric   // Default FP mode for the current function.
7306c3fb27SDimitry Andric   SIModeRegisterDefaults Mode;
74349cc55cSDimitry Andric 
75349cc55cSDimitry Andric   bool EnableLateStructurizeCFG;
76349cc55cSDimitry Andric 
77349cc55cSDimitry Andric   // Instructions that will be lowered with a final instruction that zeros the
78349cc55cSDimitry Andric   // high result bits.
79349cc55cSDimitry Andric   bool fp16SrcZerosHighBits(unsigned Opc) const;
80349cc55cSDimitry Andric 
81349cc55cSDimitry Andric public:
82bdd1243dSDimitry Andric   AMDGPUDAGToDAGISel() = delete;
83bdd1243dSDimitry Andric 
845f757f3fSDimitry Andric   explicit AMDGPUDAGToDAGISel(TargetMachine &TM, CodeGenOptLevel OptLevel);
85349cc55cSDimitry Andric 
86349cc55cSDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override;
87*0fca6ea1SDimitry Andric   bool matchLoadD16FromBuildVector(SDNode *N) const;
88349cc55cSDimitry Andric   void PreprocessISelDAG() override;
89349cc55cSDimitry Andric   void Select(SDNode *N) override;
90349cc55cSDimitry Andric   void PostprocessISelDAG() override;
91349cc55cSDimitry Andric 
92349cc55cSDimitry Andric protected:
93349cc55cSDimitry Andric   void SelectBuildVector(SDNode *N, unsigned RegClassID);
94349cc55cSDimitry Andric 
95349cc55cSDimitry Andric private:
96349cc55cSDimitry Andric   std::pair<SDValue, SDValue> foldFrameIndex(SDValue N) const;
97*0fca6ea1SDimitry Andric 
981db9f3b2SDimitry Andric   bool isInlineImmediate(const SDNode *N) const;
99349cc55cSDimitry Andric 
100*0fca6ea1SDimitry Andric   bool isInlineImmediate(const APInt &Imm) const {
101*0fca6ea1SDimitry Andric     return Subtarget->getInstrInfo()->isInlineConstant(Imm);
102349cc55cSDimitry Andric   }
103349cc55cSDimitry Andric 
104349cc55cSDimitry Andric   bool isInlineImmediate(const APFloat &Imm) const {
105349cc55cSDimitry Andric     return Subtarget->getInstrInfo()->isInlineConstant(Imm);
106349cc55cSDimitry Andric   }
107349cc55cSDimitry Andric 
108349cc55cSDimitry Andric   bool isVGPRImm(const SDNode *N) const;
109349cc55cSDimitry Andric   bool isUniformLoad(const SDNode *N) const;
110349cc55cSDimitry Andric   bool isUniformBr(const SDNode *N) const;
111349cc55cSDimitry Andric 
1124824e7fdSDimitry Andric   // Returns true if ISD::AND SDNode `N`'s masking of the shift amount operand's
1134824e7fdSDimitry Andric   // `ShAmtBits` bits is unneeded.
1144824e7fdSDimitry Andric   bool isUnneededShiftMask(const SDNode *N, unsigned ShAmtBits) const;
1154824e7fdSDimitry Andric 
116349cc55cSDimitry Andric   bool isBaseWithConstantOffset64(SDValue Addr, SDValue &LHS,
117349cc55cSDimitry Andric                                   SDValue &RHS) const;
118349cc55cSDimitry Andric 
119349cc55cSDimitry Andric   MachineSDNode *buildSMovImm64(SDLoc &DL, uint64_t Val, EVT VT) const;
120349cc55cSDimitry Andric 
121349cc55cSDimitry Andric   SDNode *glueCopyToOp(SDNode *N, SDValue NewChain, SDValue Glue) const;
122349cc55cSDimitry Andric   SDNode *glueCopyToM0(SDNode *N, SDValue Val) const;
123349cc55cSDimitry Andric   SDNode *glueCopyToM0LDSInit(SDNode *N) const;
124349cc55cSDimitry Andric 
125349cc55cSDimitry Andric   const TargetRegisterClass *getOperandRegClass(SDNode *N, unsigned OpNo) const;
126349cc55cSDimitry Andric   virtual bool SelectADDRVTX_READ(SDValue Addr, SDValue &Base, SDValue &Offset);
127349cc55cSDimitry Andric   virtual bool SelectADDRIndirect(SDValue Addr, SDValue &Base, SDValue &Offset);
128349cc55cSDimitry Andric   bool isDSOffsetLegal(SDValue Base, unsigned Offset) const;
129349cc55cSDimitry Andric   bool isDSOffset2Legal(SDValue Base, unsigned Offset0, unsigned Offset1,
130349cc55cSDimitry Andric                         unsigned Size) const;
1315f757f3fSDimitry Andric 
1325f757f3fSDimitry Andric   bool isFlatScratchBaseLegal(SDValue Addr) const;
1335f757f3fSDimitry Andric   bool isFlatScratchBaseLegalSV(SDValue Addr) const;
1345f757f3fSDimitry Andric   bool isFlatScratchBaseLegalSVImm(SDValue Addr) const;
135*0fca6ea1SDimitry Andric   bool isSOffsetLegalWithImmOffset(SDValue *SOffset, bool Imm32Only,
136*0fca6ea1SDimitry Andric                                    bool IsBuffer, int64_t ImmOffset = 0) const;
13706c3fb27SDimitry Andric 
138349cc55cSDimitry Andric   bool SelectDS1Addr1Offset(SDValue Ptr, SDValue &Base, SDValue &Offset) const;
139349cc55cSDimitry Andric   bool SelectDS64Bit4ByteAligned(SDValue Ptr, SDValue &Base, SDValue &Offset0,
140349cc55cSDimitry Andric                                  SDValue &Offset1) const;
141349cc55cSDimitry Andric   bool SelectDS128Bit8ByteAligned(SDValue Ptr, SDValue &Base, SDValue &Offset0,
142349cc55cSDimitry Andric                                   SDValue &Offset1) const;
143349cc55cSDimitry Andric   bool SelectDSReadWrite2(SDValue Ptr, SDValue &Base, SDValue &Offset0,
144349cc55cSDimitry Andric                           SDValue &Offset1, unsigned Size) const;
145349cc55cSDimitry Andric   bool SelectMUBUF(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
146349cc55cSDimitry Andric                    SDValue &SOffset, SDValue &Offset, SDValue &Offen,
147349cc55cSDimitry Andric                    SDValue &Idxen, SDValue &Addr64) const;
148349cc55cSDimitry Andric   bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, SDValue &VAddr,
149349cc55cSDimitry Andric                          SDValue &SOffset, SDValue &Offset) const;
150349cc55cSDimitry Andric   bool SelectMUBUFScratchOffen(SDNode *Parent, SDValue Addr, SDValue &RSrc,
151349cc55cSDimitry Andric                                SDValue &VAddr, SDValue &SOffset,
152349cc55cSDimitry Andric                                SDValue &ImmOffset) const;
153349cc55cSDimitry Andric   bool SelectMUBUFScratchOffset(SDNode *Parent, SDValue Addr, SDValue &SRsrc,
154349cc55cSDimitry Andric                                 SDValue &Soffset, SDValue &Offset) const;
155349cc55cSDimitry Andric 
156349cc55cSDimitry Andric   bool SelectMUBUFOffset(SDValue Addr, SDValue &SRsrc, SDValue &Soffset,
157349cc55cSDimitry Andric                          SDValue &Offset) const;
1585f757f3fSDimitry Andric   bool SelectBUFSOffset(SDValue Addr, SDValue &SOffset) const;
159349cc55cSDimitry Andric 
160349cc55cSDimitry Andric   bool SelectFlatOffsetImpl(SDNode *N, SDValue Addr, SDValue &VAddr,
161349cc55cSDimitry Andric                             SDValue &Offset, uint64_t FlatVariant) const;
162349cc55cSDimitry Andric   bool SelectFlatOffset(SDNode *N, SDValue Addr, SDValue &VAddr,
163349cc55cSDimitry Andric                         SDValue &Offset) const;
164349cc55cSDimitry Andric   bool SelectGlobalOffset(SDNode *N, SDValue Addr, SDValue &VAddr,
165349cc55cSDimitry Andric                           SDValue &Offset) const;
166349cc55cSDimitry Andric   bool SelectScratchOffset(SDNode *N, SDValue Addr, SDValue &VAddr,
167349cc55cSDimitry Andric                            SDValue &Offset) const;
168349cc55cSDimitry Andric   bool SelectGlobalSAddr(SDNode *N, SDValue Addr, SDValue &SAddr,
169349cc55cSDimitry Andric                          SDValue &VOffset, SDValue &Offset) const;
170349cc55cSDimitry Andric   bool SelectScratchSAddr(SDNode *N, SDValue Addr, SDValue &SAddr,
171349cc55cSDimitry Andric                           SDValue &Offset) const;
17281ad6265SDimitry Andric   bool checkFlatScratchSVSSwizzleBug(SDValue VAddr, SDValue SAddr,
17381ad6265SDimitry Andric                                      uint64_t ImmOffset) const;
17481ad6265SDimitry Andric   bool SelectScratchSVAddr(SDNode *N, SDValue Addr, SDValue &VAddr,
17581ad6265SDimitry Andric                            SDValue &SAddr, SDValue &Offset) const;
176349cc55cSDimitry Andric 
177bdd1243dSDimitry Andric   bool SelectSMRDOffset(SDValue ByteOffsetNode, SDValue *SOffset,
178bdd1243dSDimitry Andric                         SDValue *Offset, bool Imm32Only = false,
179*0fca6ea1SDimitry Andric                         bool IsBuffer = false, bool HasSOffset = false,
180*0fca6ea1SDimitry Andric                         int64_t ImmOffset = 0) const;
181349cc55cSDimitry Andric   SDValue Expand32BitAddress(SDValue Addr) const;
182fcaf7f86SDimitry Andric   bool SelectSMRDBaseOffset(SDValue Addr, SDValue &SBase, SDValue *SOffset,
183bdd1243dSDimitry Andric                             SDValue *Offset, bool Imm32Only = false,
184*0fca6ea1SDimitry Andric                             bool IsBuffer = false, bool HasSOffset = false,
185*0fca6ea1SDimitry Andric                             int64_t ImmOffset = 0) const;
186fcaf7f86SDimitry Andric   bool SelectSMRD(SDValue Addr, SDValue &SBase, SDValue *SOffset,
187fcaf7f86SDimitry Andric                   SDValue *Offset, bool Imm32Only = false) const;
188349cc55cSDimitry Andric   bool SelectSMRDImm(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
189349cc55cSDimitry Andric   bool SelectSMRDImm32(SDValue Addr, SDValue &SBase, SDValue &Offset) const;
190fcaf7f86SDimitry Andric   bool SelectSMRDSgpr(SDValue Addr, SDValue &SBase, SDValue &SOffset) const;
191fcaf7f86SDimitry Andric   bool SelectSMRDSgprImm(SDValue Addr, SDValue &SBase, SDValue &SOffset,
192fcaf7f86SDimitry Andric                          SDValue &Offset) const;
193bdd1243dSDimitry Andric   bool SelectSMRDBufferImm(SDValue N, SDValue &Offset) const;
194bdd1243dSDimitry Andric   bool SelectSMRDBufferImm32(SDValue N, SDValue &Offset) const;
195bdd1243dSDimitry Andric   bool SelectSMRDBufferSgprImm(SDValue N, SDValue &SOffset,
196bdd1243dSDimitry Andric                                SDValue &Offset) const;
197*0fca6ea1SDimitry Andric   bool SelectSMRDPrefetchImm(SDValue Addr, SDValue &SBase,
198*0fca6ea1SDimitry Andric                              SDValue &Offset) const;
199349cc55cSDimitry Andric   bool SelectMOVRELOffset(SDValue Index, SDValue &Base, SDValue &Offset) const;
200349cc55cSDimitry Andric 
201349cc55cSDimitry Andric   bool SelectVOP3ModsImpl(SDValue In, SDValue &Src, unsigned &SrcMods,
20206c3fb27SDimitry Andric                           bool IsCanonicalizing = true,
203349cc55cSDimitry Andric                           bool AllowAbs = true) const;
204349cc55cSDimitry Andric   bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
20506c3fb27SDimitry Andric   bool SelectVOP3ModsNonCanonicalizing(SDValue In, SDValue &Src,
20606c3fb27SDimitry Andric                                        SDValue &SrcMods) const;
207349cc55cSDimitry Andric   bool SelectVOP3BMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
208349cc55cSDimitry Andric   bool SelectVOP3NoMods(SDValue In, SDValue &Src) const;
209349cc55cSDimitry Andric   bool SelectVOP3Mods0(SDValue In, SDValue &Src, SDValue &SrcMods,
210349cc55cSDimitry Andric                        SDValue &Clamp, SDValue &Omod) const;
211349cc55cSDimitry Andric   bool SelectVOP3BMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
212349cc55cSDimitry Andric                         SDValue &Clamp, SDValue &Omod) const;
213349cc55cSDimitry Andric   bool SelectVOP3NoMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
214349cc55cSDimitry Andric                          SDValue &Clamp, SDValue &Omod) const;
215349cc55cSDimitry Andric 
21681ad6265SDimitry Andric   bool SelectVINTERPModsImpl(SDValue In, SDValue &Src, SDValue &SrcMods,
21781ad6265SDimitry Andric                              bool OpSel) const;
21881ad6265SDimitry Andric   bool SelectVINTERPMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
21981ad6265SDimitry Andric   bool SelectVINTERPModsHi(SDValue In, SDValue &Src, SDValue &SrcMods) const;
22081ad6265SDimitry Andric 
221349cc55cSDimitry Andric   bool SelectVOP3OMods(SDValue In, SDValue &Src, SDValue &Clamp,
222349cc55cSDimitry Andric                        SDValue &Omod) const;
223349cc55cSDimitry Andric 
22481ad6265SDimitry Andric   bool SelectVOP3PMods(SDValue In, SDValue &Src, SDValue &SrcMods,
22581ad6265SDimitry Andric                        bool IsDOT = false) const;
22681ad6265SDimitry Andric   bool SelectVOP3PModsDOT(SDValue In, SDValue &Src, SDValue &SrcMods) const;
22781ad6265SDimitry Andric 
2287a6dacacSDimitry Andric   bool SelectVOP3PModsNeg(SDValue In, SDValue &Src) const;
22981ad6265SDimitry Andric   bool SelectWMMAOpSelVOP3PMods(SDValue In, SDValue &Src) const;
230349cc55cSDimitry Andric 
231b3edf446SDimitry Andric   bool SelectWMMAModsF32NegAbs(SDValue In, SDValue &Src,
232b3edf446SDimitry Andric                                SDValue &SrcMods) const;
233b3edf446SDimitry Andric   bool SelectWMMAModsF16Neg(SDValue In, SDValue &Src, SDValue &SrcMods) const;
234b3edf446SDimitry Andric   bool SelectWMMAModsF16NegAbs(SDValue In, SDValue &Src,
235b3edf446SDimitry Andric                                SDValue &SrcMods) const;
236b3edf446SDimitry Andric   bool SelectWMMAVISrc(SDValue In, SDValue &Src) const;
237b3edf446SDimitry Andric 
238b3edf446SDimitry Andric   bool SelectSWMMACIndex8(SDValue In, SDValue &Src, SDValue &IndexKey) const;
239b3edf446SDimitry Andric   bool SelectSWMMACIndex16(SDValue In, SDValue &Src, SDValue &IndexKey) const;
240b3edf446SDimitry Andric 
241349cc55cSDimitry Andric   bool SelectVOP3OpSel(SDValue In, SDValue &Src, SDValue &SrcMods) const;
242349cc55cSDimitry Andric 
243349cc55cSDimitry Andric   bool SelectVOP3OpSelMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
244349cc55cSDimitry Andric   bool SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src,
245349cc55cSDimitry Andric                                  unsigned &Mods) const;
24606c3fb27SDimitry Andric   bool SelectVOP3PMadMixModsExt(SDValue In, SDValue &Src,
24706c3fb27SDimitry Andric                                 SDValue &SrcMods) const;
248349cc55cSDimitry Andric   bool SelectVOP3PMadMixMods(SDValue In, SDValue &Src, SDValue &SrcMods) const;
249349cc55cSDimitry Andric 
250349cc55cSDimitry Andric   SDValue getHi16Elt(SDValue In) const;
251349cc55cSDimitry Andric 
252349cc55cSDimitry Andric   SDValue getMaterializedScalarImm32(int64_t Val, const SDLoc &DL) const;
253349cc55cSDimitry Andric 
254349cc55cSDimitry Andric   void SelectADD_SUB_I64(SDNode *N);
255349cc55cSDimitry Andric   void SelectAddcSubb(SDNode *N);
256349cc55cSDimitry Andric   void SelectUADDO_USUBO(SDNode *N);
257349cc55cSDimitry Andric   void SelectDIV_SCALE(SDNode *N);
258349cc55cSDimitry Andric   void SelectMAD_64_32(SDNode *N);
2594824e7fdSDimitry Andric   void SelectMUL_LOHI(SDNode *N);
260349cc55cSDimitry Andric   void SelectFMA_W_CHAIN(SDNode *N);
261349cc55cSDimitry Andric   void SelectFMUL_W_CHAIN(SDNode *N);
262349cc55cSDimitry Andric   SDNode *getBFE32(bool IsSigned, const SDLoc &DL, SDValue Val, uint32_t Offset,
263349cc55cSDimitry Andric                    uint32_t Width);
264349cc55cSDimitry Andric   void SelectS_BFEFromShifts(SDNode *N);
265349cc55cSDimitry Andric   void SelectS_BFE(SDNode *N);
266349cc55cSDimitry Andric   bool isCBranchSCC(const SDNode *N) const;
267349cc55cSDimitry Andric   void SelectBRCOND(SDNode *N);
268349cc55cSDimitry Andric   void SelectFMAD_FMA(SDNode *N);
2695f757f3fSDimitry Andric   void SelectFP_EXTEND(SDNode *N);
270349cc55cSDimitry Andric   void SelectDSAppendConsume(SDNode *N, unsigned IntrID);
271bdd1243dSDimitry Andric   void SelectDSBvhStackIntrinsic(SDNode *N);
272349cc55cSDimitry Andric   void SelectDS_GWS(SDNode *N, unsigned IntrID);
273349cc55cSDimitry Andric   void SelectInterpP1F16(SDNode *N);
274349cc55cSDimitry Andric   void SelectINTRINSIC_W_CHAIN(SDNode *N);
275349cc55cSDimitry Andric   void SelectINTRINSIC_WO_CHAIN(SDNode *N);
276349cc55cSDimitry Andric   void SelectINTRINSIC_VOID(SDNode *N);
2775f757f3fSDimitry Andric   void SelectWAVE_ADDRESS(SDNode *N);
2785f757f3fSDimitry Andric   void SelectSTACKRESTORE(SDNode *N);
279349cc55cSDimitry Andric 
280349cc55cSDimitry Andric protected:
281349cc55cSDimitry Andric   // Include the pieces autogenerated from the target description.
282349cc55cSDimitry Andric #include "AMDGPUGenDAGISel.inc"
283349cc55cSDimitry Andric };
284349cc55cSDimitry Andric 
285*0fca6ea1SDimitry Andric class AMDGPUISelDAGToDAGPass : public SelectionDAGISelPass {
286*0fca6ea1SDimitry Andric public:
287*0fca6ea1SDimitry Andric   AMDGPUISelDAGToDAGPass(TargetMachine &TM);
288*0fca6ea1SDimitry Andric 
289*0fca6ea1SDimitry Andric   PreservedAnalyses run(MachineFunction &MF,
290*0fca6ea1SDimitry Andric                         MachineFunctionAnalysisManager &MFAM);
291*0fca6ea1SDimitry Andric };
292*0fca6ea1SDimitry Andric 
293*0fca6ea1SDimitry Andric class AMDGPUDAGToDAGISelLegacy : public SelectionDAGISelLegacy {
294*0fca6ea1SDimitry Andric public:
295*0fca6ea1SDimitry Andric   static char ID;
296*0fca6ea1SDimitry Andric 
297*0fca6ea1SDimitry Andric   AMDGPUDAGToDAGISelLegacy(TargetMachine &TM, CodeGenOptLevel OptLevel);
298*0fca6ea1SDimitry Andric 
299*0fca6ea1SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override;
300*0fca6ea1SDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override;
301*0fca6ea1SDimitry Andric   StringRef getPassName() const override;
302*0fca6ea1SDimitry Andric };
303*0fca6ea1SDimitry Andric 
304349cc55cSDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUISELDAGTODAG_H
305