39  for (
const auto &FE : FeatureTable)
 
   40    if (Implies.
test(FE.Value))
 
 
   59  [[maybe_unused]] 
unsigned BitSize = Bits.size();
 
   61    assert(FE.Value < BitSize && 
"Target Feature is out of range");
 
   63      DefaultFeatures[FE.Key] = 
true;
 
   65  return DefaultFeatures;
 
 
   77constexpr GPUInfo R600GPUs[] = {
 
  110constexpr GPUInfo AMDGCNGPUs[] = {
 
  194        return A.Kind < 
B.Kind;
 
  197  if (
I == Table.
end() || 
I->Kind != Search.Kind)
 
  224  if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
 
  225    return Entry->CanonicalName;
 
 
  230  if (
const auto *Entry = getArchEntry(AK, R600GPUs))
 
  231    return Entry->CanonicalName;
 
 
  236  for (
const auto &
C : AMDGCNGPUs) {
 
 
  245  for (
const auto &
C : R600GPUs) {
 
 
  254  if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
 
  255    return Entry->Features;
 
 
  260  if (
const auto *Entry = getArchEntry(AK, R600GPUs))
 
  261    return Entry->Features;
 
 
  267  for (
const auto &
C : AMDGCNGPUs)
 
 
  272  for (
const auto &
C : R600GPUs)
 
 
  279    if (GPU == 
"generic-hsa")
 
  281    if (GPU == 
"generic")
 
  355  default:         
return {0, 0, 0};
 
 
  369static std::pair<FeatureError, StringRef>
 
  373  const bool IsNullGPU = GPU.
empty();
 
  374  const bool TargetHasWave32 = DefaultFeatures.
count(
"wavefrontsize32");
 
  375  const bool TargetHasWave64 = DefaultFeatures.
count(
"wavefrontsize64");
 
  376  const bool HaveWave32 = Features.
count(
"wavefrontsize32");
 
  377  const bool HaveWave64 = Features.
count(
"wavefrontsize64");
 
  378  if (HaveWave32 && HaveWave64)
 
  380            "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
 
  382  if (HaveWave32 && !IsNullGPU && TargetHasWave64)
 
  385  if (HaveWave64 && !IsNullGPU && TargetHasWave32)
 
  390  if (!IsNullGPU && !HaveWave32 && !HaveWave64 && !TargetHasWave32 &&
 
  392    Features.
insert(std::make_pair(
"wavefrontsize32", 
true));
 
  394  for (
const auto &Entry : DefaultFeatures) {
 
  395    if (!Features.
count(Entry.getKey()))
 
  396      Features[Entry.getKey()] = Entry.getValue();
 
 
  411    Features[
"ci-insts"] = 
true;
 
  412    Features[
"dot7-insts"] = 
true;
 
  413    Features[
"dot8-insts"] = 
true;
 
  414    Features[
"dl-insts"] = 
true;
 
  415    Features[
"16-bit-insts"] = 
true;
 
  416    Features[
"dpp"] = 
true;
 
  417    Features[
"gfx8-insts"] = 
true;
 
  418    Features[
"gfx9-insts"] = 
true;
 
  419    Features[
"gfx10-insts"] = 
true;
 
  420    Features[
"gfx10-3-insts"] = 
true;
 
  421    Features[
"gfx11-insts"] = 
true;
 
  422    Features[
"gfx12-insts"] = 
true;
 
  423    Features[
"gfx1250-insts"] = 
true;
 
  424    Features[
"bitop3-insts"] = 
true;
 
  425    Features[
"prng-inst"] = 
true;
 
  426    Features[
"tanh-insts"] = 
true;
 
  427    Features[
"tensor-cvt-lut-insts"] = 
true;
 
  428    Features[
"transpose-load-f4f6-insts"] = 
true;
 
  429    Features[
"bf16-trans-insts"] = 
true;
 
  430    Features[
"bf16-cvt-insts"] = 
true;
 
  431    Features[
"bf16-pk-insts"] = 
true;
 
  432    Features[
"fp8-conversion-insts"] = 
true;
 
  433    Features[
"fp8e5m3-insts"] = 
true;
 
  434    Features[
"permlane16-swap"] = 
true;
 
  435    Features[
"ashr-pk-insts"] = 
true;
 
  436    Features[
"add-min-max-insts"] = 
true;
 
  437    Features[
"pk-add-min-max-insts"] = 
true;
 
  438    Features[
"atomic-buffer-pk-add-bf16-inst"] = 
true;
 
  439    Features[
"vmem-pref-insts"] = 
true;
 
  440    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  441    Features[
"atomic-buffer-global-pk-add-f16-insts"] = 
true;
 
  442    Features[
"atomic-flat-pk-add-16-insts"] = 
true;
 
  443    Features[
"atomic-global-pk-add-bf16-inst"] = 
true;
 
  444    Features[
"atomic-ds-pk-add-16-insts"] = 
true;
 
  445    Features[
"setprio-inc-wg-inst"] = 
true;
 
  446    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  447    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  448    Features[
"wavefrontsize32"] = 
true;
 
  449    Features[
"clusters"] = 
true;
 
  454    Features[
"ci-insts"] = 
true;
 
  455    Features[
"dot7-insts"] = 
true;
 
  456    Features[
"dot8-insts"] = 
true;
 
  457    Features[
"dot9-insts"] = 
true;
 
  458    Features[
"dot10-insts"] = 
true;
 
  459    Features[
"dot11-insts"] = 
true;
 
  460    Features[
"dot12-insts"] = 
true;
 
  461    Features[
"dl-insts"] = 
true;
 
  462    Features[
"atomic-ds-pk-add-16-insts"] = 
true;
 
  463    Features[
"atomic-flat-pk-add-16-insts"] = 
true;
 
  464    Features[
"atomic-buffer-global-pk-add-f16-insts"] = 
true;
 
  465    Features[
"atomic-buffer-pk-add-bf16-inst"] = 
true;
 
  466    Features[
"atomic-global-pk-add-bf16-inst"] = 
true;
 
  467    Features[
"16-bit-insts"] = 
true;
 
  468    Features[
"dpp"] = 
true;
 
  469    Features[
"gfx8-insts"] = 
true;
 
  470    Features[
"gfx9-insts"] = 
true;
 
  471    Features[
"gfx10-insts"] = 
true;
 
  472    Features[
"gfx10-3-insts"] = 
true;
 
  473    Features[
"gfx11-insts"] = 
true;
 
  474    Features[
"gfx12-insts"] = 
true;
 
  475    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  476    Features[
"image-insts"] = 
true;
 
  477    Features[
"fp8-conversion-insts"] = 
true;
 
  478    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  489    Features[
"ci-insts"] = 
true;
 
  490    Features[
"dot5-insts"] = 
true;
 
  491    Features[
"dot7-insts"] = 
true;
 
  492    Features[
"dot8-insts"] = 
true;
 
  493    Features[
"dot9-insts"] = 
true;
 
  494    Features[
"dot10-insts"] = 
true;
 
  495    Features[
"dot12-insts"] = 
true;
 
  496    Features[
"dl-insts"] = 
true;
 
  497    Features[
"16-bit-insts"] = 
true;
 
  498    Features[
"dpp"] = 
true;
 
  499    Features[
"gfx8-insts"] = 
true;
 
  500    Features[
"gfx9-insts"] = 
true;
 
  501    Features[
"gfx10-insts"] = 
true;
 
  502    Features[
"gfx10-3-insts"] = 
true;
 
  503    Features[
"gfx11-insts"] = 
true;
 
  504    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  505    Features[
"image-insts"] = 
true;
 
  506    Features[
"gws"] = 
true;
 
  507    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  517    Features[
"ci-insts"] = 
true;
 
  518    Features[
"dot1-insts"] = 
true;
 
  519    Features[
"dot2-insts"] = 
true;
 
  520    Features[
"dot5-insts"] = 
true;
 
  521    Features[
"dot6-insts"] = 
true;
 
  522    Features[
"dot7-insts"] = 
true;
 
  523    Features[
"dot10-insts"] = 
true;
 
  524    Features[
"dl-insts"] = 
true;
 
  525    Features[
"16-bit-insts"] = 
true;
 
  526    Features[
"dpp"] = 
true;
 
  527    Features[
"gfx8-insts"] = 
true;
 
  528    Features[
"gfx9-insts"] = 
true;
 
  529    Features[
"gfx10-insts"] = 
true;
 
  530    Features[
"gfx10-3-insts"] = 
true;
 
  531    Features[
"image-insts"] = 
true;
 
  532    Features[
"s-memrealtime"] = 
true;
 
  533    Features[
"s-memtime-inst"] = 
true;
 
  534    Features[
"gws"] = 
true;
 
  535    Features[
"vmem-to-lds-load-insts"] = 
true;
 
  536    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  537    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  541    Features[
"dot1-insts"] = 
true;
 
  542    Features[
"dot2-insts"] = 
true;
 
  543    Features[
"dot5-insts"] = 
true;
 
  544    Features[
"dot6-insts"] = 
true;
 
  545    Features[
"dot7-insts"] = 
true;
 
  546    Features[
"dot10-insts"] = 
true;
 
  551    Features[
"dl-insts"] = 
true;
 
  552    Features[
"ci-insts"] = 
true;
 
  553    Features[
"16-bit-insts"] = 
true;
 
  554    Features[
"dpp"] = 
true;
 
  555    Features[
"gfx8-insts"] = 
true;
 
  556    Features[
"gfx9-insts"] = 
true;
 
  557    Features[
"gfx10-insts"] = 
true;
 
  558    Features[
"image-insts"] = 
true;
 
  559    Features[
"s-memrealtime"] = 
true;
 
  560    Features[
"s-memtime-inst"] = 
true;
 
  561    Features[
"gws"] = 
true;
 
  562    Features[
"vmem-to-lds-load-insts"] = 
true;
 
  563    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  564    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  567    Features[
"bitop3-insts"] = 
true;
 
  568    Features[
"fp6bf6-cvt-scale-insts"] = 
true;
 
  569    Features[
"fp4-cvt-scale-insts"] = 
true;
 
  570    Features[
"bf8-cvt-scale-insts"] = 
true;
 
  571    Features[
"fp8-cvt-scale-insts"] = 
true;
 
  572    Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] = 
true;
 
  573    Features[
"f32-to-f16bf16-cvt-sr-insts"] = 
true;
 
  574    Features[
"prng-inst"] = 
true;
 
  575    Features[
"permlane16-swap"] = 
true;
 
  576    Features[
"permlane32-swap"] = 
true;
 
  577    Features[
"ashr-pk-insts"] = 
true;
 
  578    Features[
"dot12-insts"] = 
true;
 
  579    Features[
"dot13-insts"] = 
true;
 
  580    Features[
"atomic-buffer-pk-add-bf16-inst"] = 
true;
 
  581    Features[
"gfx950-insts"] = 
true;
 
  584    Features[
"fp8-insts"] = 
true;
 
  585    Features[
"fp8-conversion-insts"] = 
true;
 
  587      Features[
"xf32-insts"] = 
true;
 
  590    Features[
"gfx940-insts"] = 
true;
 
  591    Features[
"atomic-ds-pk-add-16-insts"] = 
true;
 
  592    Features[
"atomic-flat-pk-add-16-insts"] = 
true;
 
  593    Features[
"atomic-global-pk-add-bf16-inst"] = 
true;
 
  594    Features[
"gfx90a-insts"] = 
true;
 
  595    Features[
"atomic-buffer-global-pk-add-f16-insts"] = 
true;
 
  596    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  597    Features[
"dot3-insts"] = 
true;
 
  598    Features[
"dot4-insts"] = 
true;
 
  599    Features[
"dot5-insts"] = 
true;
 
  600    Features[
"dot6-insts"] = 
true;
 
  601    Features[
"mai-insts"] = 
true;
 
  602    Features[
"dl-insts"] = 
true;
 
  603    Features[
"dot1-insts"] = 
true;
 
  604    Features[
"dot2-insts"] = 
true;
 
  605    Features[
"dot7-insts"] = 
true;
 
  606    Features[
"dot10-insts"] = 
true;
 
  607    Features[
"gfx9-insts"] = 
true;
 
  608    Features[
"gfx8-insts"] = 
true;
 
  609    Features[
"16-bit-insts"] = 
true;
 
  610    Features[
"dpp"] = 
true;
 
  611    Features[
"s-memrealtime"] = 
true;
 
  612    Features[
"ci-insts"] = 
true;
 
  613    Features[
"s-memtime-inst"] = 
true;
 
  614    Features[
"gws"] = 
true;
 
  615    Features[
"vmem-to-lds-load-insts"] = 
true;
 
  616    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  617    Features[
"wavefrontsize64"] = 
true;
 
  620    Features[
"gfx90a-insts"] = 
true;
 
  621    Features[
"atomic-buffer-global-pk-add-f16-insts"] = 
true;
 
  622    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  623    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  626    Features[
"dot3-insts"] = 
true;
 
  627    Features[
"dot4-insts"] = 
true;
 
  628    Features[
"dot5-insts"] = 
true;
 
  629    Features[
"dot6-insts"] = 
true;
 
  630    Features[
"mai-insts"] = 
true;
 
  633    Features[
"dl-insts"] = 
true;
 
  634    Features[
"dot1-insts"] = 
true;
 
  635    Features[
"dot2-insts"] = 
true;
 
  636    Features[
"dot7-insts"] = 
true;
 
  637    Features[
"dot10-insts"] = 
true;
 
  645    Features[
"gfx9-insts"] = 
true;
 
  646    Features[
"vmem-to-lds-load-insts"] = 
true;
 
  653    Features[
"gfx8-insts"] = 
true;
 
  654    Features[
"16-bit-insts"] = 
true;
 
  655    Features[
"dpp"] = 
true;
 
  656    Features[
"s-memrealtime"] = 
true;
 
  657    Features[
"ci-insts"] = 
true;
 
  658    Features[
"image-insts"] = 
true;
 
  659    Features[
"s-memtime-inst"] = 
true;
 
  660    Features[
"gws"] = 
true;
 
  661    Features[
"wavefrontsize64"] = 
true;
 
  669    Features[
"ci-insts"] = 
true;
 
  674    Features[
"image-insts"] = 
true;
 
  675    Features[
"s-memtime-inst"] = 
true;
 
  676    Features[
"gws"] = 
true;
 
  677    Features[
"atomic-fmin-fmax-global-f32"] = 
true;
 
  678    Features[
"atomic-fmin-fmax-global-f64"] = 
true;
 
  679    Features[
"wavefrontsize64"] = 
true;
 
 
  691std::pair<FeatureError, StringRef>
 
  699    Features[
"16-bit-insts"] = 
true;
 
  700    Features[
"ashr-pk-insts"] = 
true;
 
  701    Features[
"atomic-buffer-pk-add-bf16-inst"] = 
true;
 
  702    Features[
"atomic-buffer-global-pk-add-f16-insts"] = 
true;
 
  703    Features[
"atomic-ds-pk-add-16-insts"] = 
true;
 
  704    Features[
"atomic-fadd-rtn-insts"] = 
true;
 
  705    Features[
"atomic-flat-pk-add-16-insts"] = 
true;
 
  706    Features[
"atomic-global-pk-add-bf16-inst"] = 
true;
 
  707    Features[
"bf16-trans-insts"] = 
true;
 
  708    Features[
"bf16-cvt-insts"] = 
true;
 
  709    Features[
"bf8-cvt-scale-insts"] = 
true;
 
  710    Features[
"bitop3-insts"] = 
true;
 
  711    Features[
"ci-insts"] = 
true;
 
  712    Features[
"dl-insts"] = 
true;
 
  713    Features[
"dot1-insts"] = 
true;
 
  714    Features[
"dot2-insts"] = 
true;
 
  715    Features[
"dot3-insts"] = 
true;
 
  716    Features[
"dot4-insts"] = 
true;
 
  717    Features[
"dot5-insts"] = 
true;
 
  718    Features[
"dot6-insts"] = 
true;
 
  719    Features[
"dot7-insts"] = 
true;
 
  720    Features[
"dot8-insts"] = 
true;
 
  721    Features[
"dot9-insts"] = 
true;
 
  722    Features[
"dot10-insts"] = 
true;
 
  723    Features[
"dot11-insts"] = 
true;
 
  724    Features[
"dot12-insts"] = 
true;
 
  725    Features[
"dot13-insts"] = 
true;
 
  726    Features[
"dpp"] = 
true;
 
  727    Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] = 
true;
 
  728    Features[
"f32-to-f16bf16-cvt-sr-insts"] = 
true;
 
  729    Features[
"fp4-cvt-scale-insts"] = 
true;
 
  730    Features[
"fp6bf6-cvt-scale-insts"] = 
true;
 
  731    Features[
"fp8e5m3-insts"] = 
true;
 
  732    Features[
"fp8-conversion-insts"] = 
true;
 
  733    Features[
"fp8-cvt-scale-insts"] = 
true;
 
  734    Features[
"fp8-insts"] = 
true;
 
  735    Features[
"gfx8-insts"] = 
true;
 
  736    Features[
"gfx9-insts"] = 
true;
 
  737    Features[
"gfx90a-insts"] = 
true;
 
  738    Features[
"gfx940-insts"] = 
true;
 
  739    Features[
"gfx950-insts"] = 
true;
 
  740    Features[
"gfx10-insts"] = 
true;
 
  741    Features[
"gfx10-3-insts"] = 
true;
 
  742    Features[
"gfx11-insts"] = 
true;
 
  743    Features[
"gfx12-insts"] = 
true;
 
  744    Features[
"gfx1250-insts"] = 
true;
 
  745    Features[
"gws"] = 
true;
 
  746    Features[
"image-insts"] = 
true;
 
  747    Features[
"mai-insts"] = 
true;
 
  748    Features[
"permlane16-swap"] = 
true;
 
  749    Features[
"permlane32-swap"] = 
true;
 
  750    Features[
"prng-inst"] = 
true;
 
  751    Features[
"setprio-inc-wg-inst"] = 
true;
 
  752    Features[
"s-memrealtime"] = 
true;
 
  753    Features[
"s-memtime-inst"] = 
true;
 
  754    Features[
"tanh-insts"] = 
true;
 
  755    Features[
"tensor-cvt-lut-insts"] = 
true;
 
  756    Features[
"transpose-load-f4f6-insts"] = 
true;
 
  757    Features[
"vmem-pref-insts"] = 
true;
 
  758    Features[
"vmem-to-lds-load-insts"] = 
true;
 
  759    Features[
"wavefrontsize32"] = 
true;
 
  760    Features[
"wavefrontsize64"] = 
true;
 
  761  } 
else if (
T.isAMDGCN()) {
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static void fillAMDGCNFeatureMap(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Fills Features map with default values for given target GPU.
static void setImpliedBits(FeatureBitset &Bits, const FeatureBitset &Implies, ArrayRef< BasicSubtargetFeatureKV > FeatureTable)
For each feature that is (transitively) implied by this feature, set it.
static std::pair< FeatureError, StringRef > insertWaveSizeFeature(StringRef GPU, const Triple &T, const StringMap< bool > &DefaultFeatures, StringMap< bool > &Features)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const FeatureBitset & getAsBitset() const
Container class for subtarget features.
constexpr bool test(unsigned I) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
bool insert(MapEntryTy *KeyValue)
insert - Insert the specified key/value pair into the map.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
Triple - Helper class for working with autoconf configuration names.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI StringRef getArchNameR600(GPUKind AK)
GPUKind
GPU kinds supported by the AMDGPU target.
LLVM_ABI StringRef getCanonicalArchName(const Triple &T, StringRef Arch)
LLVM_ABI void fillValidArchListR600(SmallVectorImpl< StringRef > &Values)
LLVM_ABI StringRef getArchFamilyNameAMDGCN(GPUKind AK)
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
LLVM_ABI void fillValidArchListAMDGCN(SmallVectorImpl< StringRef > &Values)
LLVM_ABI GPUKind parseArchAMDGCN(StringRef CPU)
@ UNSUPPORTED_TARGET_FEATURE
@ INVALID_FEATURE_COMBINATION
@ FEATURE_FAST_DENORMAL_F32
LLVM_ABI std::pair< FeatureError, StringRef > fillAMDGPUFeatureMap(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Fills Features map with default values for given target GPU.
LLVM_ABI StringRef getArchNameAMDGCN(GPUKind AK)
LLVM_ABI unsigned getArchAttrAMDGCN(GPUKind AK)
LLVM_ABI unsigned getArchAttrR600(GPUKind AK)
LLVM_ABI GPUKind parseArchR600(StringRef CPU)
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
LLVM_ABI std::optional< llvm::StringMap< bool > > getCPUDefaultTargetFeatures(StringRef CPU, ArrayRef< BasicSubtargetSubTypeKV > ProcDesc, ArrayRef< BasicSubtargetFeatureKV > ProcFeatures)
Instruction set architecture version.
Used to provide key value pairs for feature and CPU bit flags.
FeatureBitArray Implies
K-V bit mask.