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