LLVM 24.0.0git
SIISelLowering.h
Go to the documentation of this file.
1//===-- SIISelLowering.h - SI DAG Lowering Interface ------------*- 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//===----------------------------------------------------------------------===//
8//
9/// \file
10/// SI DAG Lowering interface definition
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_SIISELLOWERING_H
15#define LLVM_LIB_TARGET_AMDGPU_SIISELLOWERING_H
16
18#include "AMDGPUISelLowering.h"
19#include "SIDefines.h"
22#include <bitset>
23
24namespace llvm {
25
26class GCNSubtarget;
28class SIRegisterInfo;
29
30namespace AMDGPU {
32}
33
35private:
36 const GCNSubtarget *Subtarget;
37
38 /// Result types made Custom for ISD::INTRINSIC_W_CHAIN only so that
39 /// unsupported s_buffer_load result types can be diagnosed. Any other
40 /// intrinsic returning one of these must keep using generic legalization.
41 std::bitset<MVT::VALUETYPE_SIZE> SBufferLoadDiagnosticVTs;
42
43public:
46 EVT VT) const override;
49 EVT VT) const override;
50
52 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
53 unsigned &NumIntermediates, MVT &RegisterVT) const override;
54
56
57 bool isUniformLoad(const LoadSDNode *Load) const;
58
59private:
60 SDValue lowerKernArgParameterPtr(SelectionDAG &DAG, const SDLoc &SL,
61 SDValue Chain, uint64_t Offset) const;
62 SDValue getImplicitArgPtr(SelectionDAG &DAG, const SDLoc &SL) const;
63 SDValue getLDSKernelId(SelectionDAG &DAG, const SDLoc &SL) const;
64 SDValue lowerKernargMemParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
65 const SDLoc &SL, SDValue Chain,
66 uint64_t Offset, Align Alignment,
67 bool Signed,
68 const ISD::InputArg *Arg = nullptr) const;
69 SDValue loadImplicitKernelArgument(SelectionDAG &DAG, MVT VT, const SDLoc &DL,
70 Align Alignment,
71 ImplicitParameter Param) const;
72
73 SDValue convertABITypeToValueType(SelectionDAG &DAG, SDValue Val,
74 CCValAssign &VA, const SDLoc &SL) const;
75
76 SDValue lowerStackParameter(SelectionDAG &DAG, CCValAssign &VA,
77 const SDLoc &SL, SDValue Chain,
78 const ISD::InputArg &Arg) const;
79 SDValue lowerWorkGroupId(
80 SelectionDAG &DAG, const SIMachineFunctionInfo &MFI, EVT VT,
83 AMDGPUFunctionArgInfo::PreloadedValue ClusterWorkGroupIdPV) const;
84 SDValue getPreloadedValue(SelectionDAG &DAG,
85 const SIMachineFunctionInfo &MFI,
86 EVT VT,
88
89 SDValue LowerGlobalAddress(AMDGPUMachineFunctionInfo *MFI, SDValue Op,
90 SelectionDAG &DAG) const override;
91 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
92
93 SDValue lowerImplicitZextParam(SelectionDAG &DAG, SDValue Op,
94 MVT VT, unsigned Offset) const;
95 SDValue lowerImage(SDValue Op, const AMDGPU::ImageDimIntrinsicInfo *Intr,
96 SelectionDAG &DAG, bool WithChain) const;
97 SDValue lowerSBuffer(EVT VT, EVT MemVT, SDLoc DL, SDValue Chain, SDValue Rsrc,
98 SDValue Offset, SDValue CachePolicy, SelectionDAG &DAG,
99 MachineMemOperand *MMO = nullptr) const;
100
101 SDValue lowerRawBufferAtomicIntrin(SDValue Op, SelectionDAG &DAG,
102 unsigned NewOpcode) const;
103 SDValue lowerStructBufferAtomicIntrin(SDValue Op, SelectionDAG &DAG,
104 unsigned NewOpcode) const;
105
106 SDValue lowerWaveID(SelectionDAG &DAG, SDValue Op) const;
107 SDValue lowerConstHwRegRead(SelectionDAG &DAG, SDValue Op,
108 AMDGPU::Hwreg::Id HwReg, unsigned LowBit,
109 unsigned Width) const;
110 SDValue lowerWorkitemID(SelectionDAG &DAG, SDValue Op, unsigned Dim,
111 const ArgDescriptor &ArgDesc) const;
112
113 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
114 SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
115 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
116 SDValue LowerCONVERT_FROM_ARBITRARY_FP(SDValue Op, SelectionDAG &DAG) const;
117 SDValue lowerFromFP8(SDValue Op, bool IsBF8, SelectionDAG &DAG) const;
118 SDValue LowerCONVERT_TO_ARBITRARY_FP(SDValue Op, SelectionDAG &DAG) const;
119 SDValue lowerToFP8(SDValue Op, bool IsBF8, bool IsE5M3,
120 SelectionDAG &DAG) const;
121
122 // The raw.tbuffer and struct.tbuffer intrinsics have two offset args: offset
123 // (the offset that is included in bounds checking and swizzling, to be split
124 // between the instruction's voffset and immoffset fields) and soffset (the
125 // offset that is excluded from bounds checking and swizzling, to go in the
126 // instruction's soffset field). This function takes the first kind of
127 // offset and figures out how to split it between voffset and immoffset.
128 std::pair<SDValue, SDValue> splitBufferOffsets(SDValue Offset,
129 SelectionDAG &DAG) const;
130
131 SDValue widenLoad(LoadSDNode *Ld, DAGCombinerInfo &DCI) const;
132 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
133 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
134 SDValue lowerFastUnsafeFDIV(SDValue Op, SelectionDAG &DAG) const;
135 SDValue lowerFastUnsafeFDIV64(SDValue Op, SelectionDAG &DAG) const;
136 SDValue lowerFDIV_FAST(SDValue Op, SelectionDAG &DAG) const;
137 SDValue LowerFDIV16(SDValue Op, SelectionDAG &DAG) const;
138 SDValue LowerFDIV32(SDValue Op, SelectionDAG &DAG) const;
139 SDValue LowerFDIV64(SDValue Op, SelectionDAG &DAG) const;
140 SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
141 SDValue LowerFFREXP(SDValue Op, SelectionDAG &DAG) const;
142 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
143 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
144 SDValue lowerFSQRTF16(SDValue Op, SelectionDAG &DAG) const;
145 SDValue lowerFSQRTF32(SDValue Op, SelectionDAG &DAG) const;
146 SDValue lowerFSQRTF64(SDValue Op, SelectionDAG &DAG) const;
147 SDValue LowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
148 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
149 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
150 SDValue LowerSPONENTRY(SDValue Op, SelectionDAG &DAG) const;
151 SDValue adjustLoadValueType(unsigned Opcode, MemSDNode *M, SelectionDAG &DAG,
153 bool IsIntrinsic = false) const;
154
155 SDValue lowerIntrinsicLoad(MemSDNode *M, bool IsFormat, SelectionDAG &DAG,
156 ArrayRef<SDValue> Ops) const;
157
158 // Call DAG.getMemIntrinsicNode for a load, but first widen a dwordx3 type to
159 // dwordx4 if on SI.
160 SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
162 MachineMemOperand *MMO, SelectionDAG &DAG) const;
163
164 SDValue handleD16VData(SDValue VData, SelectionDAG &DAG,
165 bool ImageStore = false) const;
166
167 /// Converts \p Op, which must be of floating point type, to the
168 /// floating point type \p VT, by either extending or truncating it.
169 SDValue getFPExtOrFPRound(SelectionDAG &DAG,
170 SDValue Op,
171 const SDLoc &DL,
172 EVT VT) const;
173
174 SDValue convertArgType(
175 SelectionDAG &DAG, EVT VT, EVT MemVT, const SDLoc &SL, SDValue Val,
176 bool Signed, const ISD::InputArg *Arg = nullptr) const;
177
178 /// Custom lowering for ISD::FP_ROUND for MVT::f16.
179 SDValue lowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
180 SDValue splitFP_ROUNDVectorOp(SDValue Op, SelectionDAG &DAG) const;
181 SDValue lowerFMINNUM_FMAXNUM(SDValue Op, SelectionDAG &DAG) const;
182 SDValue lowerFMINIMUMNUM_FMAXIMUMNUM(SDValue Op, SelectionDAG &DAG) const;
183 SDValue lowerFLDEXP(SDValue Op, SelectionDAG &DAG) const;
184 SDValue promoteUniformOpToI32(SDValue Op, DAGCombinerInfo &DCI) const;
185 SDValue promoteUniformUnaryOpToI32(SDValue Op, DAGCombinerInfo &DCI) const;
186 SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
187 SDValue lowerMUL(SDValue Op, SelectionDAG &DAG) const;
188 SDValue lowerXMULO(SDValue Op, SelectionDAG &DAG) const;
189 SDValue lowerXMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
190
191 SDValue getBaseSegmentAperture(unsigned AS, const SDLoc &DL,
192 SelectionDAG &DAG) const;
193 SDValue getSegmentAperture(unsigned AS, const SDLoc &DL,
194 SelectionDAG &DAG) const;
195
196 SDValue lowerADDRSPACECAST(SDValue Op, SelectionDAG &DAG) const;
197 SDValue lowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
198 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
199 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
200 SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
201 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
202 SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
203
204 SDValue lowerTRAP(SDValue Op, SelectionDAG &DAG) const;
205 SDValue lowerTrapEndpgm(SDValue Op, SelectionDAG &DAG) const;
206 SDValue lowerTrapHsaQueuePtr(SDValue Op, SelectionDAG &DAG) const;
207 SDValue lowerTrapHsa(SDValue Op, SelectionDAG &DAG) const;
208 SDValue lowerDEBUGTRAP(SDValue Op, SelectionDAG &DAG) const;
209 SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
210
211 SDNode *adjustWritemask(MachineSDNode *&N, SelectionDAG &DAG) const;
212
213 SDValue performUCharToFloatCombine(SDNode *N,
214 DAGCombinerInfo &DCI) const;
215 SDValue performFCopySignCombine(SDNode *N, DAGCombinerInfo &DCI) const;
216
217 SDValue performSHLPtrCombine(SDNode *N,
218 unsigned AS,
219 EVT MemVT,
220 DAGCombinerInfo &DCI) const;
221
222 SDValue performMemSDNodeCombine(MemSDNode *N, DAGCombinerInfo &DCI) const;
223
224 SDValue splitBinaryBitConstantOp(DAGCombinerInfo &DCI, const SDLoc &SL,
225 unsigned Opc, SDValue LHS,
226 const ConstantSDNode *CRHS) const;
227
228 SDValue performAndCombine(SDNode *N, DAGCombinerInfo &DCI) const;
229 SDValue performOrCombine(SDNode *N, DAGCombinerInfo &DCI) const;
230 SDValue performXorCombine(SDNode *N, DAGCombinerInfo &DCI) const;
231 SDValue performZeroOrAnyExtendCombine(SDNode *N, DAGCombinerInfo &DCI) const;
232 SDValue performExtendTruncShiftCombine(SDNode *N, DAGCombinerInfo &DCI) const;
233 SDValue performSignExtendInRegCombine(SDNode *N, DAGCombinerInfo &DCI) const;
234 SDValue performClassCombine(SDNode *N, DAGCombinerInfo &DCI) const;
235 SDValue getCanonicalConstantFP(SelectionDAG &DAG, const SDLoc &SL, EVT VT,
236 const APFloat &C) const;
237 SDValue performFCanonicalizeCombine(SDNode *N, DAGCombinerInfo &DCI) const;
238
239 SDValue performFPMed3ImmCombine(SelectionDAG &DAG, const SDLoc &SL,
240 SDValue Op0, SDValue Op1,
241 bool IsKnownNoNaNs) const;
242 SDValue performIntMed3ImmCombine(SelectionDAG &DAG, const SDLoc &SL,
243 SDValue Src, SDValue MinVal, SDValue MaxVal,
244 bool Signed) const;
245 SDValue performMinMaxCombine(SDNode *N, DAGCombinerInfo &DCI) const;
246 SDValue performFMed3Combine(SDNode *N, DAGCombinerInfo &DCI) const;
247 SDValue performCvtPkRTZCombine(SDNode *N, DAGCombinerInfo &DCI) const;
248 SDValue performExponentOnlyScaleCombine(SDNode *N,
249 DAGCombinerInfo &DCI) const;
250 SDValue performExtractVectorEltCombine(SDNode *N, DAGCombinerInfo &DCI) const;
251 SDValue performInsertVectorEltCombine(SDNode *N, DAGCombinerInfo &DCI) const;
252 SDValue performFPRoundCombine(SDNode *N, DAGCombinerInfo &DCI) const;
253 SDValue performFrexpSelectCombine(SDNode *N, DAGCombinerInfo &DCI) const;
254 SDValue performSelectCombine(SDNode *N, DAGCombinerInfo &DCI) const;
255
256 SDValue reassociateScalarOps(SDNode *N, SelectionDAG &DAG) const;
257 unsigned getFusedOpcode(const SelectionDAG &DAG,
258 const SDNode *N0, const SDNode *N1) const;
259 SDValue tryFoldToMad64_32(SDNode *N, DAGCombinerInfo &DCI) const;
260 SDValue foldAddSub64WithZeroLowBitsTo32(SDNode *N,
261 DAGCombinerInfo &DCI) const;
262
263 SDValue performAddCombine(SDNode *N, DAGCombinerInfo &DCI) const;
264 SDValue performPtrAddCombine(SDNode *N, DAGCombinerInfo &DCI) const;
265 SDValue performSubCombine(SDNode *N, DAGCombinerInfo &DCI) const;
266 SDValue performFAddCombine(SDNode *N, DAGCombinerInfo &DCI) const;
267 SDValue performFSubCombine(SDNode *N, DAGCombinerInfo &DCI) const;
268 SDValue performFDivCombine(SDNode *N, DAGCombinerInfo &DCI) const;
269 SDValue performFMulCombine(SDNode *N, DAGCombinerInfo &DCI) const;
270 SDValue performFMACombine(SDNode *N, DAGCombinerInfo &DCI) const;
271 SDValue performSetCCCombine(SDNode *N, DAGCombinerInfo &DCI) const;
272 SDValue performCvtF32UByteNCombine(SDNode *N, DAGCombinerInfo &DCI) const;
273 SDValue performClampCombine(SDNode *N, DAGCombinerInfo &DCI) const;
274 SDValue performRcpCombine(SDNode *N, DAGCombinerInfo &DCI) const;
275
276 bool isLegalMUBUFAddressingMode(const AddrMode &AM) const;
277
278 unsigned isCFIntrinsic(const SDNode *Intr) const;
279
280public:
281 /// \returns True if fixup needs to be emitted for given global value \p GV,
282 /// false otherwise.
283 bool shouldEmitFixup(const GlobalValue *GV) const;
284
285 /// \returns True if GOT relocation needs to be emitted for given global value
286 /// \p GV, false otherwise.
287 bool shouldEmitGOTReloc(const GlobalValue *GV) const;
288
289 /// \returns True if PC-relative relocation needs to be emitted for given
290 /// global value \p GV, false otherwise.
291 bool shouldEmitPCReloc(const GlobalValue *GV) const;
292
293 /// \returns true if this should use a literal constant for an LDS address,
294 /// and not emit a relocation for an LDS global.
295 bool shouldUseLDSConstAddress(const GlobalValue *GV) const;
296
297 /// Check if EXTRACT_VECTOR_ELT/INSERT_VECTOR_ELT (<n x e>, var-idx) should be
298 /// expanded into a set of cmp/select instructions.
299 static bool shouldExpandVectorDynExt(unsigned EltSize, unsigned NumElem,
300 bool IsDivergentIdx,
301 const GCNSubtarget *Subtarget);
302
303 bool shouldExpandVectorDynExt(SDNode *N) const;
304
305 bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const override;
306
308 EVT PtrVT) const override;
309
310private:
311 /// Returns true if the first real instruction in MBB is 8 bytes and could
312 /// be split by a 32-byte fetch window boundary. Used on GFX950 to avoid
313 /// instruction fetch delays.
314 bool needsFetchWindowAlignment(const MachineBasicBlock &MBB) const;
315
316 // Analyze a combined offset from an amdgcn_s_buffer_load intrinsic and store
317 // the three offsets (voffset, soffset and instoffset) into the SDValue[3]
318 // array pointed to by Offsets.
319 void setBufferOffsets(SDValue CombinedOffset, SelectionDAG &DAG,
320 SDValue *Offsets, Align Alignment = Align(4)) const;
321
322 // Convert the i128 that an addrspace(8) pointer is natively represented as
323 // into the v4i32 that all the buffer intrinsics expect to receive. We can't
324 // add register classes for i128 on pain of the promotion logic going haywire,
325 // so this slightly ugly hack is what we've got. If passed a non-pointer
326 // argument (as would be seen in older buffer intrinsics), does nothing.
327 SDValue bufferRsrcPtrToVector(SDValue MaybePointer, SelectionDAG &DAG) const;
328
329 // Wrap a 64-bit pointer into a v4i32 (which is how all SelectionDAG code
330 // represents ptr addrspace(8)) using the flags specified in the intrinsic.
331 SDValue lowerPointerAsRsrcIntrin(SDNode *Op, SelectionDAG &DAG) const;
332
333 // Handle 8 bit and 16 bit buffer loads
334 SDValue handleByteShortBufferLoads(SelectionDAG &DAG, EVT LoadVT, SDLoc DL,
337 bool IsTFE = false) const;
338
339 // Handle 8 bit and 16 bit buffer stores
340 SDValue handleByteShortBufferStores(SelectionDAG &DAG, EVT VDataType,
341 SDLoc DL, SDValue Ops[],
342 MemSDNode *M) const;
343
344public:
345 SITargetLowering(const TargetMachine &tm, const GCNSubtarget &STI);
346
347 const GCNSubtarget *getSubtarget() const;
348
350
351 bool isFPExtFoldable(const SelectionDAG &DAG, unsigned Opcode, EVT DestVT,
352 EVT SrcVT) const override;
353
354 bool isFPExtFoldable(const MachineInstr &MI, unsigned Opcode, LLT DestTy,
355 LLT SrcTy) const override;
356
357 bool isShuffleMaskLegal(ArrayRef<int> /*Mask*/, EVT /*VT*/) const override;
358
359 // While address space 7 should never make it to codegen, it still needs to
360 // have a MVT to prevent some analyses that query this function from breaking.
361 // We use the custum MVT::amdgpuBufferFatPointer and
362 // amdgpu::amdgpuBufferStridedPointer for this, though we use v8i32 for the
363 // memory type (which is probably unused).
364 MVT getPointerTy(const DataLayout &DL, unsigned AS) const override;
365 MVT getPointerMemTy(const DataLayout &DL, unsigned AS) const override;
366
368 MachineFunction &MF,
369 unsigned IntrinsicID) const override;
370
373 Type *&AccessTy) const override;
374
375 bool isLegalFlatAddressingMode(const AddrMode &AM, unsigned AddrSpace) const;
376 bool isLegalGlobalAddressingMode(const AddrMode &AM) const;
377 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
378 unsigned AS,
379 Instruction *I = nullptr) const override;
380
381 bool canMergeStoresTo(unsigned AS, EVT MemVT,
382 const MachineFunction &MF) const override;
383
385 unsigned Size, unsigned AddrSpace, Align Alignment,
387 unsigned *IsFast = nullptr) const;
388
390 LLT Ty, unsigned AddrSpace, Align Alignment,
392 unsigned *IsFast = nullptr) const override {
393 if (IsFast)
394 *IsFast = 0;
395 return allowsMisalignedMemoryAccessesImpl(Ty.getSizeInBits(), AddrSpace,
396 Alignment, Flags, IsFast);
397 }
398
400 EVT VT, unsigned AS, Align Alignment,
402 unsigned *IsFast = nullptr) const override;
403
404 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
405 const AttributeList &FuncAttributes) const override;
406
407 bool isMemOpHasNoClobberedMemOperand(const SDNode *N) const;
408
409 static bool isNonGlobalAddrSpace(unsigned AS);
410
411 bool isFreeAddrSpaceCast(const DataLayout &DL, unsigned SrcAS,
412 unsigned DestAS) const override;
413
415 getPreferredVectorAction(MVT VT) const override;
416
418 Type *Ty) const override;
419
421 unsigned Index) const override;
422 bool isExtractVecEltCheap(EVT VT, unsigned Index) const override;
423
424 bool isTypeDesirableForOp(unsigned Op, EVT VT) const override;
425 bool isTypeDesirableForOp(SDNode *N, EVT VT) const override;
426
427 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
428
429 unsigned combineRepeatedFPDivisors() const override {
430 // Combine multiple FDIVs with the same divisor into multiple FMULs by the
431 // reciprocal.
432 return 2;
433 }
434
435 bool supportSplitCSR(MachineFunction *MF) const override;
436 void initializeSplitCSR(MachineBasicBlock *Entry) const override;
438 MachineBasicBlock *Entry,
439 const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
440
442 bool isVarArg,
444 const SDLoc &DL, SelectionDAG &DAG,
445 SmallVectorImpl<SDValue> &InVals) const override;
446
447 bool CanLowerReturn(CallingConv::ID CallConv,
448 MachineFunction &MF, bool isVarArg,
450 LLVMContext &Context, const Type *RetTy) const override;
451
452 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
454 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
455 SelectionDAG &DAG) const override;
456
458 CallLoweringInfo &CLI,
459 CCState &CCInfo,
460 const SIMachineFunctionInfo &Info,
461 SmallVectorImpl<std::pair<unsigned, SDValue>> &RegsToPass,
462 SmallVectorImpl<SDValue> &MemOpChains,
463 SDValue Chain) const;
464
466 CallingConv::ID CallConv, bool isVarArg,
468 const SDLoc &DL, SelectionDAG &DAG,
469 SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
470 SDValue ThisVal) const;
471
472 bool mayBeEmittedAsTailCall(const CallInst *) const override;
473
475 SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
477 const SmallVectorImpl<SDValue> &OutVals,
478 const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG &DAG) const;
479
480 SDValue LowerCall(CallLoweringInfo &CLI,
481 SmallVectorImpl<SDValue> &InVals) const override;
482
487
493
494 Register getRegisterByName(const char* RegName, LLT VT,
495 const MachineFunction &MF) const override;
496
498 MachineBasicBlock *BB) const;
499
502 MachineBasicBlock *BB) const;
503
506 MachineBasicBlock *BB) const override;
507
508 bool enableAggressiveFMAFusion(EVT VT) const override;
509 bool enableAggressiveFMAFusion(LLT Ty) const override;
511 EVT VT) const override;
512 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override;
513 LLT getPreferredShiftAmountTy(LLT Ty) const override;
514
516 EVT VT) const override;
518 const LLT Ty) const override;
519 bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const override;
520 bool isFMADLegal(const MachineInstr &MI, const LLT Ty) const override;
521
522 /// Variants for IR level callers, which have no MachineFunction to read the
523 /// denormal mode from and must pass \p FPEnv explicitly.
524 bool isFMAFasterThanFMulAndFAdd(EVT VT, DenormalFPEnv FPEnv) const;
525
526 /// \p VT is used as written, so a vector type reports false.
527 bool isFMADLegal(EVT VT, DenormalFPEnv FPEnv) const;
528
529 /// \p Ty is taken by its scalar type, so a vector type asks about a lane.
530 bool isFMADLegal(const Function &F, Type *Ty) const;
531
532 bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *Ty) const override;
533
537 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
539 SelectionDAG &DAG) const override;
540
541 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
542 SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override;
543 void AddMemOpInit(MachineInstr &MI) const;
545 SDNode *Node) const override;
546
548
550 SDValue Ptr) const;
552 uint32_t RsrcDword1, uint64_t RsrcDword2And3) const;
553 std::pair<unsigned, const TargetRegisterClass *>
555 StringRef Constraint, MVT VT) const override;
556 ConstraintType getConstraintType(StringRef Constraint) const override;
558 std::vector<SDValue> &Ops,
559 SelectionDAG &DAG) const override;
560 bool getAsmOperandConstVal(SDValue Op, uint64_t &Val) const;
561 bool checkAsmConstraintVal(SDValue Op, StringRef Constraint,
562 uint64_t Val) const;
564 uint64_t Val,
565 unsigned MaxSize = 64) const;
566 SDValue copyToM0(SelectionDAG &DAG, SDValue Chain, const SDLoc &DL,
567 SDValue V) const;
568
569 void finalizeLowering(MachineFunction &MF) const override;
570
572 const APInt &DemandedElts,
573 const SelectionDAG &DAG,
574 unsigned Depth = 0) const override;
576 const MachineFunction &MF,
577 Align Alignment) const override;
580 const APInt &DemandedElts,
582 unsigned Depth = 0) const override;
583
585 Register R,
587 unsigned Depth = 0) const override;
589 UniformityInfo *UA) const override;
590
591 bool hasMemSDNodeUser(SDNode *N) const;
592
594 SDValue N1) const override;
595
597 Register N1) const override;
598
600 SDNodeFlags UserFlags = {}, unsigned MaxDepth = 5) const;
601
602 /// Returns true if \p Op is provably canonical (no FCANONICALIZE needed).
603 /// \p QueryVT is the scalar FP type being checked, threaded unchanged
604 /// through recursion since canonicality is per vector element. FP operands
605 /// whose scalar type differs from \p QueryVT are treated as non-canonical,
606 /// since canonicality does not survive a change of FP format (e.g. bitcast
607 /// v2bf16 to v2f16); non-FP operands are not checked against \p QueryVT.
608 bool isCanonicalized(SelectionDAG &DAG, SDValue Op, EVT QueryVT,
609 SDNodeFlags UserFlags, unsigned MaxDepth) const;
611 unsigned MaxDepth = 5) const;
612 bool denormalsEnabledForType(const SelectionDAG &DAG, EVT VT) const;
613 bool denormalsEnabledForType(LLT Ty, const MachineFunction &MF) const;
614
615 bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts,
616 const SelectionDAG &DAG, bool SNaN = false,
617 unsigned Depth = 0) const override;
619 shouldExpandAtomicRMWInIR(const AtomicRMWInst *) const override;
620 AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override;
621 AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
623 shouldExpandAtomicCmpXchgInIR(const AtomicCmpXchgInst *AI) const override;
624
625 void emitExpandAtomicAddrSpacePredicate(Instruction *AI) const;
626 void emitExpandAtomicRMW(AtomicRMWInst *AI) const override;
627 void emitExpandAtomicCmpXchg(AtomicCmpXchgInst *CI) const override;
628 void emitExpandAtomicLoad(LoadInst *LI) const override;
629 void emitExpandAtomicStore(StoreInst *SI) const override;
630
632 bool isDivergent) const override;
634 const Value *V) const override;
635 Align
636 getPrefLoopAlignment(MachineLoop *ML,
637 const MachineBasicBlock *BlockToAlign) const override;
638 unsigned
639 getMaxPermittedBytesForAlignment(MachineBasicBlock *MBB) const override;
640
641 void allocateHSAUserSGPRs(CCState &CCInfo,
642 MachineFunction &MF,
643 const SIRegisterInfo &TRI,
644 SIMachineFunctionInfo &Info) const;
645
646 void allocatePreloadKernArgSGPRs(CCState &CCInfo,
647 SmallVectorImpl<CCValAssign> &ArgLocs,
648 const SmallVectorImpl<ISD::InputArg> &Ins,
649 MachineFunction &MF,
650 const SIRegisterInfo &TRI,
651 SIMachineFunctionInfo &Info) const;
652
653 void allocateLDSKernelId(CCState &CCInfo, MachineFunction &MF,
654 const SIRegisterInfo &TRI,
655 SIMachineFunctionInfo &Info) const;
656
657 void allocateSystemSGPRs(CCState &CCInfo,
658 MachineFunction &MF,
659 SIMachineFunctionInfo &Info,
660 CallingConv::ID CallConv,
661 bool IsShader) const;
662
663 void allocateSpecialEntryInputVGPRs(CCState &CCInfo,
664 MachineFunction &MF,
665 const SIRegisterInfo &TRI,
666 SIMachineFunctionInfo &Info) const;
668 CCState &CCInfo,
669 MachineFunction &MF,
670 const SIRegisterInfo &TRI,
671 SIMachineFunctionInfo &Info) const;
672
673 void allocateSpecialInputVGPRsFixed(CCState &CCInfo,
674 MachineFunction &MF,
675 const SIRegisterInfo &TRI,
676 SIMachineFunctionInfo &Info) const;
677
679 getTargetMMOFlags(const Instruction &I) const override;
680};
681
682// Returns true if argument is a boolean value which is not serialized into
683// memory or argument and does not require v_cndmask_b32 to be deserialized.
684bool isBoolSGPR(SDValue V);
685
686} // End namespace llvm
687
688#endif
uint64_t uint64_t
uint64_t Imm
Interface definition of the TargetLowering class that is common to all AMD GPUs.
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
Utilities for dealing with flags related to floating point properties and mode controls.
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
RISCVCC::CondCode CC
MachineRegisterInfo & MRI
Value * LHS
AMDGPUTargetLowering(const TargetMachine &TM, const TargetSubtargetInfo &STI, const AMDGPUSubtarget &AMDGPUSTI)
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
CCState - This class holds information needed while lowering arguments and return values.
CCValAssign - Represent assignment of one arg/retval to a location.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
This class is used to represent ISD::LOAD nodes.
Machine Value Type.
Representation of each machine instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
An SDNode that represents everything that will be needed to construct a MachineInstr.
This is an abstract virtual class for memory operations.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
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.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
bool isTypeDesirableForOp(unsigned Op, EVT VT) const override
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDNode * PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override
Fold the instructions after selecting them.
SDValue splitTernaryVectorOp(SDValue Op, SelectionDAG &DAG) const
MachineSDNode * wrapAddr64Rsrc(SelectionDAG &DAG, const SDLoc &DL, SDValue Ptr) const
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT VT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
SDValue lowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const
AtomicExpansionKind shouldExpandAtomicRMWInIR(const AtomicRMWInst *) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
bool requiresUniformRegister(MachineFunction &MF, const Value *V) const override
Allows target to decide about the register class of the specific value that is live outside the defin...
bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const override
Returns true if be combined with to form an ISD::FMAD.
AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const override
Returns how the given (atomic) store should be expanded by the IR-level AtomicExpand pass into.
void bundleInstWithWaitcnt(MachineInstr &MI) const
Insert MI into a BUNDLE with an S_WAITCNT 0 immediately following it.
SDValue lowerROTR(SDValue Op, SelectionDAG &DAG) const
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
SDValue LowerCall(CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
MVT getPointerTy(const DataLayout &DL, unsigned AS) const override
Map address space 7 to MVT::amdgpuBufferFatPointer because that's its in-memory representation.
bool denormalsEnabledForType(const SelectionDAG &DAG, EVT VT) const
void insertCopiesSplitCSR(MachineBasicBlock *Entry, const SmallVectorImpl< MachineBasicBlock * > &Exits) const override
Insert explicit copies in entry and exit blocks.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the ValueType of the result of SETCC operations.
SDNode * legalizeTargetIndependentNode(SDNode *Node, SelectionDAG &DAG) const
Legalize target independent instructions (e.g.
bool allowsMisalignedMemoryAccessesImpl(unsigned Size, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *IsFast=nullptr) const
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
SDValue lowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const
const GCNSubtarget * getSubtarget() const
bool enableAggressiveFMAFusion(EVT VT) const override
Return true if target always benefits from combining into FMA for a given value type.
bool shouldEmitGOTReloc(const GlobalValue *GV) const
SDValue splitUnaryVectorOp(SDValue Op, SelectionDAG &DAG) const
SDValue lowerGET_FPENV(SDValue Op, SelectionDAG &DAG) const
bool isCanonicalized(SelectionDAG &DAG, SDValue Op, SDNodeFlags UserFlags={}, unsigned MaxDepth=5) const
void allocateSpecialInputSGPRs(CCState &CCInfo, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
void allocateLDSKernelId(CCState &CCInfo, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
SDValue LowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const
bool isReassocProfitable(SelectionDAG &DAG, SDValue N0, SDValue N1) const override
void allocateHSAUserSGPRs(CCState &CCInfo, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
ArrayRef< MCPhysReg > getRoundingControlRegisters() const override
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint, return the type of constraint it is for this target.
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const override
This hook must be implemented to lower outgoing return values, described by the Outs array,...
const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent) const override
Return the register class that should be used for the specified value type.
void AddMemOpInit(MachineInstr &MI) const
MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const override
This callback is used to inspect load/store instructions and add target-specific MachineMemOperand fl...
bool isLegalGlobalAddressingMode(const AddrMode &AM) const
bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const override
Return true if it is beneficial to convert a load of a constant to just the constant itself.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
void emitExpandAtomicStore(StoreInst *SI) const override
Perform a atomic store using a target-specific way.
AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override
Returns how the given (atomic) load should be expanded by the IR-level AtomicExpand pass.
Align computeKnownAlignForTargetInstr(GISelValueTracking &Analysis, Register R, const MachineRegisterInfo &MRI, unsigned Depth=0) const override
Determine the known alignment for the pointer value R.
bool getAsmOperandConstVal(SDValue Op, uint64_t &Val) const
bool isShuffleMaskLegal(ArrayRef< int >, EVT) const override
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
void emitExpandAtomicLoad(LoadInst *LI) const override
Perform a atomic load using a target-specific way.
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
Returns the target specific optimal type for load and store operations as a result of memset,...
void computeKnownBitsForStackObjectPointer(KnownBits &Known, const MachineFunction &MF, Align Alignment) const override
Determine known bits of a pointer to a known valid stack object.
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
LLT getPreferredShiftAmountTy(LLT Ty) const override
Return the preferred type to use for a shift opcode, given the shifted amount type is ShiftValueTy.
ExtractSubvectorCost getExtractSubvectorCost(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return the cost of extracting a subvector of type ResVT from a vector of type SrcVT,...
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
Align getPrefLoopAlignment(MachineLoop *ML, const MachineBasicBlock *BlockToAlign) const override
Return the preferred loop alignment.
SDValue lowerSET_FPENV(SDValue Op, SelectionDAG &DAG) const
bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const override
True if target has some particular form of dealing with pointer arithmetic semantics for pointers wit...
void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &, const CallBase &, MachineFunction &MF, unsigned IntrinsicID) const override
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const override
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
SDValue lowerSET_ROUNDING(SDValue Op, SelectionDAG &DAG) const
void allocateSpecialInputVGPRsFixed(CCState &CCInfo, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
Allocate implicit function VGPR arguments in fixed registers.
MachineBasicBlock * emitGWSMemViolTestLoop(MachineInstr &MI, MachineBasicBlock *BB) const
bool getAddrModeArguments(const IntrinsicInst *I, SmallVectorImpl< Value * > &Ops, Type *&AccessTy) const override
CodeGenPrepare sinks address calculations into the same BB as Load/Store instructions reading the add...
bool checkAsmConstraintValA(SDValue Op, uint64_t Val, unsigned MaxSize=64) const
bool shouldEmitFixup(const GlobalValue *GV) const
MachineBasicBlock * splitKillBlock(MachineInstr &MI, MachineBasicBlock *BB) const
void emitExpandAtomicCmpXchg(AtomicCmpXchgInst *CI) const override
Perform a cmpxchg expansion using a target-specific method.
bool canTransformPtrArithOutOfBounds(const Function &F, EVT PtrVT) const override
True if the target allows transformations of in-bounds pointer arithmetic that cause out-of-bounds in...
bool hasMemSDNodeUser(SDNode *N) const
bool isSDNodeSourceOfDivergence(const SDNode *N, FunctionLoweringInfo *FLI, UniformityInfo *UA) const override
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *BB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
bool isEligibleForTailCallOptimization(SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SmallVectorImpl< ISD::InputArg > &Ins, SelectionDAG &DAG) const
bool isMemOpHasNoClobberedMemOperand(const SDNode *N) const
bool isLegalFlatAddressingMode(const AddrMode &AM, unsigned AddrSpace) const
SDValue LowerCallResult(SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &DL, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals, bool isThisReturn, SDValue ThisVal) const
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &DL, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
bool isFPExtFoldable(const SelectionDAG &DAG, unsigned Opcode, EVT DestVT, EVT SrcVT) const override
Return true if an fpext operation input to an Opcode operation is free (for instance,...
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
Assign the register class depending on the number of bits set in the writemask.
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
void finalizeLowering(MachineFunction &MF) const override
Execute target specific actions to finalize target lowering.
static bool isNonGlobalAddrSpace(unsigned AS)
void emitExpandAtomicAddrSpacePredicate(Instruction *AI) const
MachineSDNode * buildRSRC(SelectionDAG &DAG, const SDLoc &DL, SDValue Ptr, uint32_t RsrcDword1, uint64_t RsrcDword2And3) const
Return a resource descriptor with the 'Add TID' bit enabled The TID (Thread ID) is multiplied by the ...
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
bool mayBeEmittedAsTailCall(const CallInst *) const override
Return true if the target may be able emit the call instruction as a tail call.
void passSpecialInputs(CallLoweringInfo &CLI, CCState &CCInfo, const SIMachineFunctionInfo &Info, SmallVectorImpl< std::pair< unsigned, SDValue > > &RegsToPass, SmallVectorImpl< SDValue > &MemOpChains, SDValue Chain) const
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
bool checkAsmConstraintVal(SDValue Op, StringRef Constraint, uint64_t Val) const
bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool SNaN=false, unsigned Depth=0) const override
If SNaN is false,.
void emitExpandAtomicRMW(AtomicRMWInst *AI) const override
Perform a atomicrmw expansion using a target-specific way.
static bool shouldExpandVectorDynExt(unsigned EltSize, unsigned NumElem, bool IsDivergentIdx, const GCNSubtarget *Subtarget)
Check if EXTRACT_VECTOR_ELT/INSERT_VECTOR_ELT (<n x e>, var-idx) should be expanded into a set of cmp...
bool shouldUseLDSConstAddress(const GlobalValue *GV) const
bool supportSplitCSR(MachineFunction *MF) const override
Return true if the target supports that a subset of CSRs for the given machine function is handled ex...
bool isExtractVecEltCheap(EVT VT, unsigned Index) const override
Return true if extraction of a scalar element from the given vector type at the given index is cheap.
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
bool allowsMisalignedMemoryAccesses(LLT Ty, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *IsFast=nullptr) const override
LLT handling variant.
unsigned combineRepeatedFPDivisors() const override
Indicate whether this target prefers to combine FDIVs with the same divisor.
bool canMergeStoresTo(unsigned AS, EVT MemVT, const MachineFunction &MF) const override
Returns if it's reasonable to merge stores to MemVT size.
SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const
SITargetLowering(const TargetMachine &tm, const GCNSubtarget &STI)
void computeKnownBitsForTargetInstr(GISelValueTracking &Analysis, Register R, KnownBits &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const override
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool isFreeAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DestAS) const override
Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g.
bool shouldEmitPCReloc(const GlobalValue *GV) const
bool isUniformLoad(const LoadSDNode *Load) const
AtomicExpansionKind shouldExpandAtomicCmpXchgInIR(const AtomicCmpXchgInst *AI) const override
Returns how the given atomic cmpxchg should be expanded by the IR-level AtomicExpand pass.
void initializeSplitCSR(MachineBasicBlock *Entry) const override
Perform necessary initialization to handle a subset of CSRs explicitly via copies.
void allocateSpecialEntryInputVGPRs(CCState &CCInfo, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
void allocatePreloadKernArgSGPRs(CCState &CCInfo, SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< ISD::InputArg > &Ins, MachineFunction &MF, const SIRegisterInfo &TRI, SIMachineFunctionInfo &Info) const
SDValue copyToM0(SelectionDAG &DAG, SDValue Chain, const SDLoc &DL, SDValue V) const
SDValue splitBinaryVectorOp(SDValue Op, SelectionDAG &DAG) const
MachinePointerInfo getKernargSegmentPtrInfo(MachineFunction &MF) const
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
MVT getPointerMemTy(const DataLayout &DL, unsigned AS) const override
Similarly, the in-memory representation of a p7 is {p8, i32}, aka v8i32 when padding is added.
void allocateSystemSGPRs(CCState &CCInfo, MachineFunction &MF, SIMachineFunctionInfo &Info, CallingConv::ID CallConv, bool IsShader) const
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, LLVMContext &Context, const Type *RetTy) const override
This hook should be implemented to check whether the return values described by the Outs array can fi...
unsigned getMaxPermittedBytesForAlignment(MachineBasicBlock *MBB) const override
Return the maximum amount of bytes allowed to be emitted when padding for alignment.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
ExtractSubvectorCost
Enum that specifies how expensive lowering an EXTRACT_SUBVECTOR is.
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
@ Offset
Definition DWP.cpp:577
@ Known
Known to have no common set bits.
@ Load
The value being inserted comes from a load (InsertElement only).
bool isBoolSGPR(SDValue V)
DWARFExpression::Operation Op
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represents the full denormal controls for a function, including the default mode and the f32 specific...
Extended Value Type.
Definition ValueTypes.h:35
InputArg - This struct carries flags and type information about a single incoming (formal) argument o...
This class contains a discriminated union of information about pointers in memory operands,...
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...