14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUISELDAGTODAG_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUISELDAGTODAG_H
35 Out =
C->getAPIntValue().getSExtValue();
40 Out =
C->getValueAPF().bitcastToAPInt().getSExtValue();
54 uint32_t K = (LHSVal & 0xffff) | (RHSVal << 16);
74 bool fp16SrcZerosHighBits(
unsigned Opc)
const;
91 std::pair<SDValue, SDValue> foldFrameIndex(
SDValue N)
const;
93 bool isInlineImmediate(
const SDNode *
N)
const;
95 bool isInlineImmediate(
const APInt &Imm)
const {
99 bool isInlineImmediate(
const APFloat &Imm)
const {
103 bool isVGPRImm(
const SDNode *
N)
const;
104 bool isUniformLoad(
const SDNode *
N)
const;
105 bool isUniformBr(
const SDNode *
N)
const;
109 bool isUnneededShiftMask(
const SDNode *
N,
unsigned ShAmtBits)
const;
111 bool isBaseWithConstantOffset64(SDValue
Addr, SDValue &
LHS,
114 MachineSDNode *buildSMovImm64(SDLoc &
DL,
uint64_t Val, EVT VT)
const;
116 SDNode *glueCopyToOp(SDNode *
N, SDValue NewChain, SDValue Glue)
const;
117 SDNode *glueCopyToM0(SDNode *
N, SDValue Val)
const;
118 SDNode *glueCopyToM0LDSInit(SDNode *
N)
const;
120 const TargetRegisterClass *getOperandRegClass(SDNode *
N,
unsigned OpNo)
const;
121 virtual bool SelectADDRVTX_READ(SDValue
Addr, SDValue &
Base, SDValue &
Offset);
122 virtual bool SelectADDRIndirect(SDValue
Addr, SDValue &
Base, SDValue &
Offset);
123 bool isDSOffsetLegal(SDValue
Base,
unsigned Offset)
const;
124 bool isDSOffset2Legal(SDValue
Base,
unsigned Offset0,
unsigned Offset1,
125 unsigned Size)
const;
127 bool isFlatScratchBaseLegal(SDValue
Addr)
const;
128 bool isFlatScratchBaseLegalSV(SDValue
Addr)
const;
129 bool isFlatScratchBaseLegalSVImm(SDValue
Addr)
const;
130 bool isSOffsetLegalWithImmOffset(SDValue *SOffset,
bool Imm32Only,
131 bool IsBuffer, int64_t ImmOffset = 0)
const;
133 bool SelectDS1Addr1Offset(SDValue
Ptr, SDValue &
Base, SDValue &
Offset)
const;
134 bool SelectDS64Bit4ByteAligned(SDValue
Ptr, SDValue &
Base, SDValue &Offset0,
135 SDValue &Offset1)
const;
136 bool SelectDS128Bit8ByteAligned(SDValue
Ptr, SDValue &
Base, SDValue &Offset0,
137 SDValue &Offset1)
const;
138 bool SelectDSReadWrite2(SDValue
Ptr, SDValue &
Base, SDValue &Offset0,
139 SDValue &Offset1,
unsigned Size)
const;
140 bool SelectMUBUF(SDValue
Addr, SDValue &SRsrc, SDValue &VAddr,
141 SDValue &SOffset, SDValue &
Offset, SDValue &Offen,
142 SDValue &Idxen, SDValue &Addr64)
const;
143 bool SelectMUBUFAddr64(SDValue
Addr, SDValue &SRsrc, SDValue &VAddr,
144 SDValue &SOffset, SDValue &
Offset)
const;
145 bool SelectMUBUFScratchOffen(SDNode *Parent, SDValue
Addr, SDValue &RSrc,
146 SDValue &VAddr, SDValue &SOffset,
147 SDValue &ImmOffset)
const;
148 bool SelectMUBUFScratchOffset(SDNode *Parent, SDValue
Addr, SDValue &SRsrc,
149 SDValue &Soffset, SDValue &
Offset)
const;
151 bool SelectMUBUFOffset(SDValue
Addr, SDValue &SRsrc, SDValue &Soffset,
153 bool SelectBUFSOffset(SDValue
Addr, SDValue &SOffset)
const;
155 bool SelectFlatOffsetImpl(SDNode *
N, SDValue
Addr, SDValue &VAddr,
157 bool SelectFlatOffset(SDNode *
N, SDValue
Addr, SDValue &VAddr,
159 bool SelectGlobalOffset(SDNode *
N, SDValue
Addr, SDValue &VAddr,
161 bool SelectScratchOffset(SDNode *
N, SDValue
Addr, SDValue &VAddr,
163 bool SelectGlobalSAddr(SDNode *
N, SDValue
Addr, SDValue &SAddr,
164 SDValue &VOffset, SDValue &
Offset)
const;
165 bool SelectScratchSAddr(SDNode *
N, SDValue
Addr, SDValue &SAddr,
167 bool checkFlatScratchSVSSwizzleBug(SDValue VAddr, SDValue SAddr,
169 bool SelectScratchSVAddr(SDNode *
N, SDValue
Addr, SDValue &VAddr,
170 SDValue &SAddr, SDValue &
Offset)
const;
172 bool SelectSMRDOffset(SDValue ByteOffsetNode, SDValue *SOffset,
173 SDValue *
Offset,
bool Imm32Only =
false,
174 bool IsBuffer =
false,
bool HasSOffset =
false,
175 int64_t ImmOffset = 0)
const;
176 SDValue Expand32BitAddress(SDValue
Addr)
const;
177 bool SelectSMRDBaseOffset(SDValue
Addr, SDValue &SBase, SDValue *SOffset,
178 SDValue *
Offset,
bool Imm32Only =
false,
179 bool IsBuffer =
false,
bool HasSOffset =
false,
180 int64_t ImmOffset = 0)
const;
181 bool SelectSMRD(SDValue
Addr, SDValue &SBase, SDValue *SOffset,
182 SDValue *
Offset,
bool Imm32Only =
false)
const;
183 bool SelectSMRDImm(SDValue
Addr, SDValue &SBase, SDValue &
Offset)
const;
184 bool SelectSMRDImm32(SDValue
Addr, SDValue &SBase, SDValue &
Offset)
const;
185 bool SelectSMRDSgpr(SDValue
Addr, SDValue &SBase, SDValue &SOffset)
const;
186 bool SelectSMRDSgprImm(SDValue
Addr, SDValue &SBase, SDValue &SOffset,
188 bool SelectSMRDBufferImm(SDValue
N, SDValue &
Offset)
const;
189 bool SelectSMRDBufferImm32(SDValue
N, SDValue &
Offset)
const;
190 bool SelectSMRDBufferSgprImm(SDValue
N, SDValue &SOffset,
192 bool SelectSMRDPrefetchImm(SDValue
Addr, SDValue &SBase,
194 bool SelectMOVRELOffset(SDValue
Index, SDValue &
Base, SDValue &
Offset)
const;
196 bool SelectVOP3ModsImpl(SDValue In, SDValue &Src,
unsigned &SrcMods,
197 bool IsCanonicalizing =
true,
198 bool AllowAbs =
true)
const;
199 bool SelectVOP3Mods(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
200 bool SelectVOP3ModsNonCanonicalizing(SDValue In, SDValue &Src,
201 SDValue &SrcMods)
const;
202 bool SelectVOP3BMods(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
203 bool SelectVOP3NoMods(SDValue In, SDValue &Src)
const;
204 bool SelectVOP3Mods0(SDValue In, SDValue &Src, SDValue &SrcMods,
205 SDValue &Clamp, SDValue &Omod)
const;
206 bool SelectVOP3BMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
207 SDValue &Clamp, SDValue &Omod)
const;
208 bool SelectVOP3NoMods0(SDValue In, SDValue &Src, SDValue &SrcMods,
209 SDValue &Clamp, SDValue &Omod)
const;
211 bool SelectVINTERPModsImpl(SDValue In, SDValue &Src, SDValue &SrcMods,
213 bool SelectVINTERPMods(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
214 bool SelectVINTERPModsHi(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
216 bool SelectVOP3OMods(SDValue In, SDValue &Src, SDValue &Clamp,
217 SDValue &Omod)
const;
219 bool SelectVOP3PMods(SDValue In, SDValue &Src, SDValue &SrcMods,
220 bool IsDOT =
false)
const;
221 bool SelectVOP3PModsDOT(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
223 bool SelectVOP3PModsNeg(SDValue In, SDValue &Src)
const;
224 bool SelectWMMAOpSelVOP3PMods(SDValue In, SDValue &Src)
const;
226 bool SelectWMMAModsF32NegAbs(SDValue In, SDValue &Src,
227 SDValue &SrcMods)
const;
228 bool SelectWMMAModsF16Neg(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
229 bool SelectWMMAModsF16NegAbs(SDValue In, SDValue &Src,
230 SDValue &SrcMods)
const;
231 bool SelectWMMAVISrc(SDValue In, SDValue &Src)
const;
233 bool SelectSWMMACIndex8(SDValue In, SDValue &Src, SDValue &IndexKey)
const;
234 bool SelectSWMMACIndex16(SDValue In, SDValue &Src, SDValue &IndexKey)
const;
236 bool SelectVOP3OpSel(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
238 bool SelectVOP3OpSelMods(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
239 bool SelectVOP3PMadMixModsImpl(SDValue In, SDValue &Src,
240 unsigned &Mods)
const;
241 bool SelectVOP3PMadMixModsExt(SDValue In, SDValue &Src,
242 SDValue &SrcMods)
const;
243 bool SelectVOP3PMadMixMods(SDValue In, SDValue &Src, SDValue &SrcMods)
const;
245 bool SelectBITOP3(SDValue In, SDValue &Src0, SDValue &Src1, SDValue &Src2,
248 SDValue getHi16Elt(SDValue In)
const;
250 SDValue getMaterializedScalarImm32(int64_t Val,
const SDLoc &
DL)
const;
252 void SelectADD_SUB_I64(SDNode *
N);
253 void SelectAddcSubb(SDNode *
N);
254 void SelectUADDO_USUBO(SDNode *
N);
255 void SelectDIV_SCALE(SDNode *
N);
256 void SelectMAD_64_32(SDNode *
N);
257 void SelectMUL_LOHI(SDNode *
N);
258 void SelectFMA_W_CHAIN(SDNode *
N);
259 void SelectFMUL_W_CHAIN(SDNode *
N);
260 SDNode *getBFE32(
bool IsSigned,
const SDLoc &
DL, SDValue Val,
uint32_t Offset,
262 void SelectS_BFEFromShifts(SDNode *
N);
263 void SelectS_BFE(SDNode *
N);
264 bool isCBranchSCC(
const SDNode *
N)
const;
265 void SelectBRCOND(SDNode *
N);
266 void SelectFMAD_FMA(SDNode *
N);
267 void SelectFP_EXTEND(SDNode *
N);
268 void SelectDSAppendConsume(SDNode *
N,
unsigned IntrID);
269 void SelectDSBvhStackIntrinsic(SDNode *
N);
270 void SelectDS_GWS(SDNode *
N,
unsigned IntrID);
271 void SelectInterpP1F16(SDNode *
N);
272 void SelectINTRINSIC_W_CHAIN(SDNode *
N);
273 void SelectINTRINSIC_WO_CHAIN(SDNode *
N);
274 void SelectINTRINSIC_VOID(SDNode *
N);
275 void SelectWAVE_ADDRESS(SDNode *
N);
276 void SelectSTACKRESTORE(SDNode *
N);
280#include "AMDGPUGenDAGISel.inc"
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
AMD GCN specific subclass of TargetSubtarget.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.
AMDGPU specific code to select AMDGPU machine instructions for SelectionDAG operations.
void SelectBuildVector(SDNode *N, unsigned RegClassID)
bool runOnMachineFunction(MachineFunction &MF) override
void PreprocessISelDAG() override
PreprocessISelDAG - This hook allows targets to hack on the graph before instruction selection starts...
AMDGPUDAGToDAGISel()=delete
void PostprocessISelDAG() override
PostprocessISelDAG() - This hook allows the target to hack on the graph right after selection.
bool matchLoadD16FromBuildVector(SDNode *N) const
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Class for arbitrary precision integers.
A container for analyses that lazily runs them and caches their results.
Represent the analysis usage information of a pass.
const SIInstrInfo * getInstrInfo() const override
A set of analyses that are preserved following a run of a transformation pass.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isInlineConstant(const APInt &Imm) const
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
StringRef - Represent a constant reference to a string, i.e.
Primary interface to the complete machine description for the target machine.
@ C
The default llvm calling convention, compatible with C.
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
This is an optimization pass for GlobalISel generic memory operations.
static bool getConstantValue(SDValue N, uint32_t &Out)
CodeGenOptLevel
Code generation optimization level.
static SDNode * packConstantV2I16(const SDNode *N, SelectionDAG &DAG)