35#define DEBUG_TYPE "gcn-subtarget"
37#define GET_SUBTARGETINFO_TARGET_DESC
38#define GET_SUBTARGETINFO_CTOR
39#define AMDGPUSubtarget GCNSubtarget
40#include "AMDGPUGenSubtargetInfo.inc"
100 FullFS +=
"+flat-for-global,+unaligned-access-mode,+trap-handler,";
102 FullFS +=
"+enable-prt-strict-null,";
105 if (FS.contains_insensitive(
"+wavefrontsize")) {
106 if (!FS.contains_insensitive(
"wavefrontsize16"))
107 FullFS +=
"-wavefrontsize16,";
108 if (!FS.contains_insensitive(
"wavefrontsize32"))
109 FullFS +=
"-wavefrontsize32,";
110 if (!FS.contains_insensitive(
"wavefrontsize64"))
111 FullFS +=
"-wavefrontsize64,";
127 }
else if (!
hasFeature(AMDGPU::FeatureWavefrontSize32) &&
128 !
hasFeature(AMDGPU::FeatureWavefrontSize64)) {
132 ToggleFeature(AMDGPU::FeatureWavefrontSize32);
147 if (!
hasAddr64() && !FS.contains(
"flat-for-global") && !UseFlatForGlobal) {
148 ToggleFeature(AMDGPU::FeatureUseFlatForGlobal);
149 UseFlatForGlobal =
true;
153 if (!
hasFlat() && !FS.contains(
"flat-for-global") && UseFlatForGlobal) {
154 ToggleFeature(AMDGPU::FeatureUseFlatForGlobal);
155 UseFlatForGlobal =
false;
189 "InstCacheLineSize must be a power of 2");
194 if (hasXNACKOnOffModes())
195 TargetID.setXnackSetting(XnackSetting);
199 if (hasSRAMECCOnOffModes())
200 TargetID.setSramEccSetting(SramEccSetting);
207 if (
hasFeature(AMDGPU::FeatureWavefrontSize32) &&
210 F,
"must specify exactly one of wavefrontsize32 and wavefrontsize64"));
238 <<
TargetID.getXnackSetting() <<
'\n');
240 <<
TargetID.getSramEccSetting() <<
'\n');
244 TSInfo = std::make_unique<AMDGPUSelectionDAGInfo>();
247 InlineAsmLoweringInfo =
249 Legalizer = std::make_unique<AMDGPULegalizerInfo>(*
this, TM);
250 RegBankInfo = std::make_unique<AMDGPURegisterBankInfo>(*
this);
252 std::make_unique<AMDGPUInstructionSelector>(*
this, *RegBankInfo);
264 case AMDGPU::V_LSHLREV_B64_e64:
265 case AMDGPU::V_LSHLREV_B64_gfx10:
266 case AMDGPU::V_LSHLREV_B64_e64_gfx11:
267 case AMDGPU::V_LSHLREV_B64_e32_gfx12:
268 case AMDGPU::V_LSHLREV_B64_e64_gfx12:
269 case AMDGPU::V_LSHL_B64_e64:
270 case AMDGPU::V_LSHRREV_B64_e64:
271 case AMDGPU::V_LSHRREV_B64_gfx10:
272 case AMDGPU::V_LSHRREV_B64_e64_gfx11:
273 case AMDGPU::V_LSHRREV_B64_e64_gfx12:
274 case AMDGPU::V_LSHR_B64_e64:
275 case AMDGPU::V_ASHRREV_I64_e64:
276 case AMDGPU::V_ASHRREV_I64_gfx10:
277 case AMDGPU::V_ASHRREV_I64_e64_gfx11:
278 case AMDGPU::V_ASHRREV_I64_e64_gfx12:
279 case AMDGPU::V_ASHR_I64_e64:
289 case AMDGPU::V_CVT_F16_F32_e32:
290 case AMDGPU::V_CVT_F16_F32_e64:
291 case AMDGPU::V_CVT_F16_U16_e32:
292 case AMDGPU::V_CVT_F16_U16_e64:
293 case AMDGPU::V_CVT_F16_I16_e32:
294 case AMDGPU::V_CVT_F16_I16_e64:
295 case AMDGPU::V_RCP_F16_e64:
296 case AMDGPU::V_RCP_F16_e32:
297 case AMDGPU::V_RSQ_F16_e64:
298 case AMDGPU::V_RSQ_F16_e32:
299 case AMDGPU::V_SQRT_F16_e64:
300 case AMDGPU::V_SQRT_F16_e32:
301 case AMDGPU::V_LOG_F16_e64:
302 case AMDGPU::V_LOG_F16_e32:
303 case AMDGPU::V_EXP_F16_e64:
304 case AMDGPU::V_EXP_F16_e32:
305 case AMDGPU::V_SIN_F16_e64:
306 case AMDGPU::V_SIN_F16_e32:
307 case AMDGPU::V_COS_F16_e64:
308 case AMDGPU::V_COS_F16_e32:
309 case AMDGPU::V_FLOOR_F16_e64:
310 case AMDGPU::V_FLOOR_F16_e32:
311 case AMDGPU::V_CEIL_F16_e64:
312 case AMDGPU::V_CEIL_F16_e32:
313 case AMDGPU::V_TRUNC_F16_e64:
314 case AMDGPU::V_TRUNC_F16_e32:
315 case AMDGPU::V_RNDNE_F16_e64:
316 case AMDGPU::V_RNDNE_F16_e32:
317 case AMDGPU::V_FRACT_F16_e64:
318 case AMDGPU::V_FRACT_F16_e32:
319 case AMDGPU::V_FREXP_MANT_F16_e64:
320 case AMDGPU::V_FREXP_MANT_F16_e32:
321 case AMDGPU::V_FREXP_EXP_I16_F16_e64:
322 case AMDGPU::V_FREXP_EXP_I16_F16_e32:
323 case AMDGPU::V_LDEXP_F16_e64:
324 case AMDGPU::V_LDEXP_F16_e32:
325 case AMDGPU::V_LSHLREV_B16_e64:
326 case AMDGPU::V_LSHLREV_B16_e32:
327 case AMDGPU::V_LSHRREV_B16_e64:
328 case AMDGPU::V_LSHRREV_B16_e32:
329 case AMDGPU::V_ASHRREV_I16_e64:
330 case AMDGPU::V_ASHRREV_I16_e32:
331 case AMDGPU::V_ADD_U16_e64:
332 case AMDGPU::V_ADD_U16_e32:
333 case AMDGPU::V_SUB_U16_e64:
334 case AMDGPU::V_SUB_U16_e32:
335 case AMDGPU::V_SUBREV_U16_e64:
336 case AMDGPU::V_SUBREV_U16_e32:
337 case AMDGPU::V_MUL_LO_U16_e64:
338 case AMDGPU::V_MUL_LO_U16_e32:
339 case AMDGPU::V_ADD_F16_e64:
340 case AMDGPU::V_ADD_F16_e32:
341 case AMDGPU::V_SUB_F16_e64:
342 case AMDGPU::V_SUB_F16_e32:
343 case AMDGPU::V_SUBREV_F16_e64:
344 case AMDGPU::V_SUBREV_F16_e32:
345 case AMDGPU::V_MUL_F16_e64:
346 case AMDGPU::V_MUL_F16_e32:
347 case AMDGPU::V_MAX_F16_e64:
348 case AMDGPU::V_MAX_F16_e32:
349 case AMDGPU::V_MIN_F16_e64:
350 case AMDGPU::V_MIN_F16_e32:
351 case AMDGPU::V_MAX_U16_e64:
352 case AMDGPU::V_MAX_U16_e32:
353 case AMDGPU::V_MIN_U16_e64:
354 case AMDGPU::V_MIN_U16_e32:
355 case AMDGPU::V_MAX_I16_e64:
356 case AMDGPU::V_MAX_I16_e32:
357 case AMDGPU::V_MIN_I16_e64:
358 case AMDGPU::V_MIN_I16_e32:
359 case AMDGPU::V_MAD_F16_e64:
360 case AMDGPU::V_MAD_U16_e64:
361 case AMDGPU::V_MAD_I16_e64:
362 case AMDGPU::V_FMA_F16_e64:
363 case AMDGPU::V_DIV_FIXUP_F16_e64:
366 case AMDGPU::V_MADAK_F16:
367 case AMDGPU::V_MADMK_F16:
368 case AMDGPU::V_MAC_F16_e64:
369 case AMDGPU::V_MAC_F16_e32:
370 case AMDGPU::V_FMAMK_F16:
371 case AMDGPU::V_FMAAK_F16:
372 case AMDGPU::V_FMAC_F16_e64:
373 case AMDGPU::V_FMAC_F16_e32:
378 case AMDGPU::V_MAD_MIXLO_F16:
379 case AMDGPU::V_MAD_MIXHI_F16:
405 if (!enableSIScheduler())
412 Attribute PostRADirectionAttr =
F.getFnAttribute(
"amdgpu-post-ra-direction");
413 if (!PostRADirectionAttr.
isValid())
417 if (PostRADirectionStr ==
"topdown") {
420 }
else if (PostRADirectionStr ==
"bottomup") {
423 }
else if (PostRADirectionStr ==
"bidirectional") {
428 F,
F.getSubprogram(),
"invalid value for postRA direction attribute");
429 F.getContext().diagnose(Diag);
433 const char *DirStr =
"default";
439 DirStr =
"bidirectional";
441 dbgs() <<
"Post-MI-sched direction (" <<
F.getName() <<
"): " << DirStr
455 for (
auto &
MBB : MF) {
457 InstrInfo.fixImplicitOperands(
MI);
463 return InstrInfo.pseudoToMCOpcode(AMDGPU::V_MAD_F16_e64) != -1;
467 return hasVGPRIndexMode() && (!hasMovrel() ||
getCLOpts().vgpr_index_mode);
473 Align A,
bool NoWrapFromMax,
474 bool NoPartialOOB)
const {
480 TypeSize ElemBits =
DL.getTypeSizeInBits(VT->getElementType());
488 Result = std::min(Result, std::max(
A,
Align(4)));
511 return Result.value() * 8;
520 unsigned DynamicVGPRBlockSize)
const {
522 DynamicVGPRBlockSize);
530 if (HasFlatScratch || HasArchitectedFlatScratch) {
551 const bool KernelUsesFlatScratch = hasFlatAddressSpace();
555std::pair<unsigned, unsigned>
557 unsigned NumSGPRs,
unsigned NumVGPRs)
const {
564 MaxOcc = std::min({MaxOcc, SGPROcc, VGPROcc});
565 return {std::min(MinOcc, MaxOcc), MaxOcc};
569 const Function &
F, std::pair<unsigned, unsigned> WavesPerEU,
570 unsigned PreloadedSGPRs,
unsigned ReservedNumSGPRs)
const {
574 unsigned MaxAddressableNumSGPRs =
getMaxNumSGPRs(WavesPerEU.first,
true);
578 unsigned Requested =
static_cast<unsigned>(
579 F.getFnAttributeAsParsedInteger(
"amdgpu-num-sgpr", MaxNumSGPRs));
581 if (Requested != MaxNumSGPRs) {
583 if (Requested && (Requested <= ReservedNumSGPRs))
593 unsigned InputNumSGPRs = PreloadedSGPRs;
594 if (Requested && Requested < InputNumSGPRs)
595 Requested = InputNumSGPRs;
599 if (Requested && Requested >
getMaxNumSGPRs(WavesPerEU.first,
false))
601 if (WavesPerEU.second && Requested &&
606 MaxNumSGPRs = Requested;
609 if (hasSGPRInitBug())
612 return std::min(MaxNumSGPRs - ReservedNumSGPRs, MaxAddressableNumSGPRs);
625 const unsigned MaxUserSGPRs =
626 USI::getNumUserSGPRForField(USI::PrivateSegmentBufferID) +
627 USI::getNumUserSGPRForField(USI::DispatchPtrID) +
628 USI::getNumUserSGPRForField(USI::QueuePtrID) +
629 USI::getNumUserSGPRForField(USI::KernargSegmentPtrID) +
630 USI::getNumUserSGPRForField(USI::DispatchIdID) +
631 USI::getNumUserSGPRForField(USI::FlatScratchInitID) +
632 USI::getNumUserSGPRForField(USI::ImplicitBufferPtrID);
635 const unsigned MaxSystemSGPRs = 1 +
642 const unsigned SyntheticSGPRs = 1;
644 return MaxUserSGPRs + MaxSystemSGPRs + SyntheticSGPRs;
653 const Function &
F, std::pair<unsigned, unsigned> NumVGPRBounds)
const {
654 const auto [Min, Max] = NumVGPRBounds;
659 unsigned Requested =
static_cast<unsigned>(
660 F.getFnAttributeAsParsedInteger(
"amdgpu-num-vgpr", Max));
661 if (Requested != Max && hasGFX90AInsts())
665 return std::clamp(Requested, Min, Max);
678 if (DynamicVGPRBlockSize != 0 &&
680 MaxNumVGPRs = std::min(MaxNumVGPRs, DynamicVGPRBlockSize);
689std::pair<unsigned, unsigned>
693 unsigned MaxNumVGPRs = MaxVectorRegs;
694 unsigned MaxNumAGPRs = 0;
705 if (hasGFX90AInsts()) {
706 unsigned MinNumAGPRs = 0;
707 const unsigned TotalNumAGPRs = AMDGPU::AGPR_32RegClass.getNumRegs();
709 const std::pair<unsigned, unsigned> DefaultNumAGPR = {~0u, ~0u};
713 std::tie(MinNumAGPRs, MaxNumAGPRs) =
717 if (MinNumAGPRs == DefaultNumAGPR.first) {
719 MinNumAGPRs = MaxNumAGPRs = MaxVectorRegs / 2;
722 MinNumAGPRs =
alignTo(MinNumAGPRs, 4);
724 MinNumAGPRs = std::min(MinNumAGPRs, TotalNumAGPRs);
729 MaxNumAGPRs = std::min(std::max(MinNumAGPRs, MaxNumAGPRs), MaxVectorRegs);
730 MinNumAGPRs = std::min({MinNumAGPRs, TotalNumAGPRs, MaxNumAGPRs});
732 MaxNumVGPRs = std::min(MaxVectorRegs - MinNumAGPRs, NumArchVGPRs);
733 MaxNumAGPRs = std::min(MaxVectorRegs - MaxNumVGPRs, MaxNumAGPRs);
735 assert(MaxNumVGPRs + MaxNumAGPRs <= MaxVectorRegs &&
736 MaxNumAGPRs <= TotalNumAGPRs && MaxNumVGPRs <= NumArchVGPRs &&
737 "invalid register counts");
738 }
else if (hasMAIInsts()) {
740 MaxNumAGPRs = MaxNumVGPRs = MaxVectorRegs;
743 return std::pair(MaxNumVGPRs, MaxNumAGPRs);
753 AMDGPU::OpName UseName = AMDGPU::getOperandIdxName(
754 UseI.
getOpcode(),
static_cast<int16_t
>(UseOpIdx));
756 case AMDGPU::OpName::src0:
757 return InstrInfo.getNamedOperand(UseI, AMDGPU::OpName::src0_modifiers);
758 case AMDGPU::OpName::src1:
759 return InstrInfo.getNamedOperand(UseI, AMDGPU::OpName::src1_modifiers);
760 case AMDGPU::OpName::src2:
761 return InstrInfo.getNamedOperand(UseI, AMDGPU::OpName::src2_modifiers);
774 if (!InstrInfo.isVOP3P(
I) || InstrInfo.isWMMA(
I) || InstrInfo.isSWMMAC(
I))
775 return AMDGPU::NoSubRegister;
780 return AMDGPU::NoSubRegister;
799 if ((!InstrInfo.isVOP3PMix(
I) && (!OpSel || !OpSelHi) &&
800 (OpSel || OpSelHi)) ||
801 (InstrInfo.isVOP3PMix(
I) && !OpSelHi))
802 return AMDGPU::NoSubRegister;
807 if (
unsigned SubRegIdx = OpSel ? AMDGPU::sub1 : AMDGPU::sub0;
808 TRI.getSubClassWithSubReg(RC, SubRegIdx) == RC)
810 if (
unsigned SubRegIdx = OpSel ? AMDGPU::hi16 : AMDGPU::lo16;
811 TRI.getSubClassWithSubReg(RC, SubRegIdx) == RC)
814 return AMDGPU::NoSubRegister;
820 int UseOpIdx)
const {
822 const MachineOperand &DefOp = DefI.
getOperand(DefOpIdx);
823 const MachineOperand &UseOp = UseI.
getOperand(UseOpIdx);
832 unsigned DefSubRegIdx = DefOp.
getSubReg();
833 if (DefReg.
isVirtual() && DefSubRegIdx == AMDGPU::NoSubRegister)
839 if (!
TRI->checkSubRegInterference(DefReg, DefSubRegIdx,
UseReg, UseSubRegIdx))
847 MCRegister DefMCReg =
848 DefSubRegIdx ?
TRI->getSubReg(DefReg, DefSubRegIdx) : DefReg.
asMCReg();
849 MCRegister UseMCReg =
851 return TRI->isSubRegisterEq(DefMCReg, UseMCReg) ? UseMCReg : DefMCReg;
865 if (Dep.
getReg() == AMDGPU::TENSORcnt || Dep.
getReg() == AMDGPU::ASYNCcnt) {
869 InstrInfo.isLDSDMA(*DefI) &&
870 (UseOp == AMDGPU::S_WAIT_TENSORCNT || UseOp == AMDGPU::S_WAIT_ASYNCCNT);
871 if (!IsBarrierCase) {
877 if (
Register Reg = getRealSchedDependency(*DefI, DefOpIdx, *UseI, UseOpIdx)) {
890 for (++
I;
I != E &&
I->isBundledWithPred(); ++
I) {
891 if (
I->isMetaInstruction())
893 if (
I->modifiesRegister(Reg,
TRI))
905 for (++
I;
I != E &&
I->isBundledWithPred() && Lat; ++
I) {
906 if (
I->isMetaInstruction())
908 if (
I->readsRegister(Reg,
TRI))
918 Dep.
setLatency(InstrInfo.getSchedModel().computeOperandLatency(
919 DefI, DefOpIdx, UseI, UseOpIdx));
928 return std::max(*
getCLOpts().nsa_threshold, 2u);
930 int Value =
static_cast<int>(MF.
getFunction().getFnAttributeAsParsedInteger(
931 "amdgpu-nsa-threshold", -1));
933 return std::max(
Value, 2);
942 const bool IsKernel =
945 if (IsKernel && (!
F.arg_empty() || ST.getImplicitArgNumBytes(
F) != 0))
946 KernargSegmentPtr =
true;
948 bool IsAmdHsaOrMesa = ST.isAmdHsaOrMesa(
F);
949 if (IsAmdHsaOrMesa && !ST.hasFlatScratchEnabled())
950 PrivateSegmentBuffer =
true;
951 else if (!ST.hasArchitectedFlatScratch() && ST.isMesaGfxShader(
F))
952 ImplicitBufferPtr =
true;
955 if (!
F.hasFnAttribute(
"amdgpu-no-dispatch-ptr"))
959 if (!
F.hasFnAttribute(
"amdgpu-no-queue-ptr"))
962 if (!
F.hasFnAttribute(
"amdgpu-no-dispatch-id"))
967 (IsAmdHsaOrMesa || ST.hasFlatScratchEnabled()) &&
970 (ST.hasFlatScratchEnabled() ||
972 !
F.hasFnAttribute(
"amdgpu-no-flat-scratch-init"))) &&
973 !ST.hasArchitectedFlatScratch()) {
974 FlatScratchInit = true;
1004 NumKernargPreloadSGPRs += NumSGPRs;
1005 NumUsedUserSGPRs += NumSGPRs;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file describes how to lower LLVM calls to machine code calls.
This file declares the targeting of the InstructionSelector class for AMDGPU.
This file declares the targeting of the Machinelegalizer class for AMDGPU.
This file declares the targeting of the RegisterBankInfo class for AMDGPU.
The AMDGPU TargetMachine interface definition for hw codegen targets.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static AMDGPUSubtarget::Generation computeDefaultGeneration(const Triple &TT)
static const MachineOperand * getVOP3PSourceModifierFromOpIdx(const MachineInstr &UseI, int UseOpIdx, const SIInstrInfo &InstrInfo)
static unsigned getEffectiveSubRegIdx(const SIRegisterInfo &TRI, const SIInstrInfo &InstrInfo, const MachineInstr &I, const MachineOperand &Op)
AMD GCN specific subclass of TargetSubtarget.
static Register UseReg(const MachineOperand &MO)
This file describes how to lower LLVM inline asm to machine code INLINEASM.
static bool hasFeature(StringRef Feature, const FeatureBitset &FeatureBits, ArrayRef< SubtargetFeatureKV > ProcFeatures)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
MachineRegisterInfo & MRI
This file defines the SmallString class.
unsigned FlatOffsetBitWidth
std::pair< unsigned, unsigned > getWavesPerEU(const Function &F) const
std::pair< unsigned, unsigned > getOccupancyWithWorkGroupSizes(uint32_t LDSBytes, const Function &F) const
Subtarget's minimum/maximum occupancy, in number of waves per EU, that can be achieved when the only ...
unsigned getWavefrontSizeLog2() const
const AMDGPUOptions & getCLOpts() const
unsigned AddressableLocalMemorySize
AMDGPUSubtarget(const Triple &TT, const AMDGPUOptions &CLOpts)
unsigned NumWorkGroupSIMDs
unsigned LDSAllocationGranularity
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
A parsed version of the target data layout string in and methods for querying it.
Diagnostic information for optimization failures.
Diagnostic information for unsupported feature in backend.
InstrItineraryData InstrItins
bool useVGPRIndexMode() const
void mirFileLoaded(MachineFunction &MF) const override
unsigned MaxPrivateElementSize
uint64_t getMaxBufferIntrinsicWidth(const DataLayout &DL, Type *T, Align A, bool NoWrapFromMax, bool NoPartialOOB) const
Return the maximum allowed load/store width for the given type and alignment combination based on sub...
unsigned getAddressableNumArchVGPRs() const
unsigned getMinNumSGPRs(unsigned WavesPerEU) const
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
void overridePipelinerPolicy(MachinePipelinerPolicy &Policy) const override
GCNSubtarget & initializeSubtargetDependencies(const Triple &TT, StringRef GPU, StringRef FS, AMDGPU::TargetIDSetting XnackSetting, AMDGPU::TargetIDSetting SramEccSetting)
bool hasRelaxedBufferOOBMode() const
unsigned getConstantBusLimit(unsigned Opcode) const
const InstrItineraryData * getInstrItineraryData() const override
void adjustSchedDependency(SUnit *Def, int DefOpIdx, SUnit *Use, int UseOpIdx, SDep &Dep, const TargetSchedModel *SchedModel) const override
void overridePostRASchedPolicy(MachineSchedPolicy &Policy, const SchedRegion &Region) const override
bool isFullSIMDMode() const
Align getStackAlignment() const
const bool BufferOOBRelaxed
unsigned getMinNumVGPRs(unsigned WavesPerEU, unsigned DynamicVGPRBlockSize) const
const SIRegisterInfo * getRegisterInfo() const override
unsigned getBaseMaxNumVGPRs(const Function &F, std::pair< unsigned, unsigned > NumVGPRBounds) const
bool zeroesHigh16BitsOfDest(unsigned Opcode) const
Returns if the result of this instruction with a 16-bit result returned in a 32-bit register implicit...
unsigned getBaseMaxNumSGPRs(const Function &F, std::pair< unsigned, unsigned > WavesPerEU, unsigned PreloadedSGPRs, unsigned ReservedNumSGPRs) const
unsigned getMaxNumPreloadedSGPRs() const
void overrideSchedPolicy(MachineSchedPolicy &Policy, const SchedRegion &Region) const override
std::pair< unsigned, unsigned > computeOccupancy(const Function &F, unsigned LDSSize=0, unsigned NumSGPRs=0, unsigned NumVGPRs=0) const
Subtarget's minimum/maximum occupancy, in number of waves per EU, that can be achieved when the only ...
unsigned getMaxNumVGPRs(unsigned WavesPerEU, unsigned DynamicVGPRBlockSize) const
AMDGPU::TargetID TargetID
const SITargetLowering * getTargetLowering() const override
unsigned getNSAThreshold(const MachineFunction &MF) const
const AMDGPU::TargetID & getTargetID() const
GCNSubtarget(const Triple &TT, StringRef GPU, StringRef FS, const GCNTargetMachine &TM, bool BufferOOBRelaxed=false, bool TBufferOOBRelaxed=false, AMDGPU::TargetIDSetting XnackSetting=AMDGPU::TargetIDSetting::Any, AMDGPU::TargetIDSetting SramEccSetting=AMDGPU::TargetIDSetting::Any)
unsigned getReservedNumSGPRs(const MachineFunction &MF) const
const bool TBufferOOBRelaxed
bool useAA() const override
unsigned getOccupancyWithNumVGPRs(unsigned VGPRs, unsigned DynamicVGPRBlockSize) const
Return the maximum number of waves per SIMD for kernels using VGPRs VGPRs.
bool hasUnalignedBufferAccessEnabled() const
unsigned InstCacheLineSize
unsigned getOccupancyWithNumSGPRs(unsigned SGPRs) const
Return the maximum number of waves per SIMD for kernels using SGPRs SGPRs.
Generation getGeneration() const
unsigned getMaxNumSGPRs(unsigned WavesPerEU, bool Addressable) const
std::pair< unsigned, unsigned > getMaxNumVectorRegs(const Function &F) const
Return a pair of maximum numbers of VGPRs and AGPRs that meet the number of waves per execution unit ...
bool isXNACKEnabled() const
unsigned getBaseReservedNumSGPRs(const bool HasFlatScratch) const
void checkSubtargetFeatures(const Function &F) const
Diagnose inconsistent subtarget features before attempting to codegen function F.
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
static unsigned getNumUserSGPRForField(UserSGPRID ID)
bool hasKernargSegmentPtr() const
void allocKernargPreloadSGPRs(unsigned NumSGPRs)
bool hasDispatchID() const
bool hasPrivateSegmentBuffer() const
unsigned getNumFreeUserSGPRs()
bool hasImplicitBufferPtr() const
bool hasPrivateSegmentSize() const
bool hasDispatchPtr() const
GCNUserSGPRUsageInfo(const Function &F, const GCNSubtarget &ST)
bool hasFlatScratchInit() const
This is an important class for using LLVM in a threaded context.
instr_iterator instr_end()
Instructions::const_iterator const_instr_iterator
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Kind getKind() const
Returns an enum value representing the kind of the dependence.
@ Data
Regular data dependence (aka true-dependence).
void setLatency(unsigned Lat)
Sets the latency for this edge.
@ Artificial
Arbitrary strong DAG edge (no real dependence).
unsigned getLatency() const
Returns the latency value for this edge, which roughly means the minimum number of cycles that must e...
Register getReg() const
Returns the register associated with this edge.
void setReg(Register Reg)
Assigns the associated register for this edge.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
unsigned getNumPreloadedSGPRs() const
std::pair< unsigned, unsigned > getWavesPerEU() const
GCNUserSGPRUsageInfo & getUserSGPRInfo()
Scheduling unit. This is a node in the scheduling DAG.
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Represent a constant reference to a string, i.e.
Information about stack frame layout on the target.
Provide an instruction scheduling machine model to CodeGen passes.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
self_iterator getIterator()
unsigned getNumWavesPerEUWithNumVGPRs(const MCSubtargetInfo &STI, unsigned NumVGPRs, unsigned DynamicVGPRBlockSize)
@ FIXED_NUM_SGPRS_FOR_INIT_BUG
unsigned getOccupancyWithNumSGPRs(unsigned SGPRs, unsigned MaxWaves, unsigned TotalNumSGPRs, unsigned Granule, unsigned TrapReserve)
LLVM_ABI unsigned getLDSAllocGranule(GPUKind AK)
LLVM_ABI unsigned getAddressableLocalMemorySize(GPUKind AK, bool FullSIMDMode)
constexpr unsigned getNumWorkGroupSIMDs(bool FullSIMDMode)
unsigned getMaxNumUserSGPRs(const MCSubtargetInfo &STI)
StringRef getSchedStrategy(const AMDGPUOptions &CLOpts, const Function &F)
LLVM_ABI unsigned getLocalMemorySize(GPUKind AK, bool FullSIMDMode)
LLVM_READNONE constexpr bool isEntryFunctionCC(CallingConv::ID CC)
unsigned getDynamicVGPRBlockSize(const Function &F)
LLVM_ABI Triple::SubArchType getMajorSubArch(Triple::SubArchType SubArch)
std::pair< unsigned, unsigned > getIntegerPairAttribute(const Function &F, StringRef Name, std::pair< unsigned, unsigned > Default, bool OnlyFirstRequired)
LLVM_READNONE constexpr bool isGraphics(CallingConv::ID CC)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ SPIR_KERNEL
Used for SPIR kernel functions.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
DWARFExpression::Operation Op
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
MCRegisterClass TargetRegisterClass
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Software pipelining policy for a loop, which a target can customize by implementing TargetSubtargetIn...
bool ShouldLimitRegPressure
Limit the register pressure of the scheduled loop, retrying at a higher II when a schedule needs too ...
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.
bool ShouldTrackLaneMasks
Track LaneMasks to allow reordering of independent subregister writes of the same vreg.
A region of an MBB for scheduling.