19using namespace AMDGPU;
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[] = {
193 return A.Kind <
B.Kind;
196 if (
I == Table.
end() ||
I->Kind != Search.Kind)
223 if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
224 return Entry->CanonicalName;
229 if (
const auto *Entry = getArchEntry(AK, R600GPUs))
230 return Entry->CanonicalName;
235 for (
const auto &
C : AMDGCNGPUs) {
240 return AMDGPU::GPUKind::GK_NONE;
244 for (
const auto &
C : R600GPUs) {
249 return AMDGPU::GPUKind::GK_NONE;
253 if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
254 return Entry->Features;
259 if (
const auto *Entry = getArchEntry(AK, R600GPUs))
260 return Entry->Features;
266 for (
const auto &
C : AMDGCNGPUs)
271 for (
const auto &
C : R600GPUs)
277 if (AK == AMDGPU::GPUKind::GK_NONE) {
278 if (GPU ==
"generic-hsa")
280 if (GPU ==
"generic")
353 default:
return {0, 0, 0};
367static std::pair<FeatureError, StringRef>
371 const bool IsNullGPU = GPU.
empty();
372 const bool TargetHasWave32 = DefaultFeatures.
count(
"wavefrontsize32");
373 const bool TargetHasWave64 = DefaultFeatures.
count(
"wavefrontsize64");
374 const bool HaveWave32 = Features.
count(
"wavefrontsize32");
375 const bool HaveWave64 = Features.
count(
"wavefrontsize64");
376 if (HaveWave32 && HaveWave64)
378 "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
380 if (HaveWave32 && !IsNullGPU && TargetHasWave64)
383 if (HaveWave64 && !IsNullGPU && TargetHasWave32)
388 if (!IsNullGPU && !HaveWave32 && !HaveWave64 && !TargetHasWave32 &&
390 Features.
insert(std::make_pair(
"wavefrontsize32",
true));
392 for (
const auto &Entry : DefaultFeatures) {
393 if (!Features.
count(Entry.getKey()))
394 Features[Entry.getKey()] = Entry.getValue();
408 Features[
"ci-insts"] =
true;
409 Features[
"dot7-insts"] =
true;
410 Features[
"dot8-insts"] =
true;
411 Features[
"dl-insts"] =
true;
412 Features[
"16-bit-insts"] =
true;
413 Features[
"dpp"] =
true;
414 Features[
"gfx8-insts"] =
true;
415 Features[
"gfx9-insts"] =
true;
416 Features[
"gfx10-insts"] =
true;
417 Features[
"gfx10-3-insts"] =
true;
418 Features[
"gfx11-insts"] =
true;
419 Features[
"gfx12-insts"] =
true;
420 Features[
"gfx1250-insts"] =
true;
421 Features[
"bitop3-insts"] =
true;
422 Features[
"prng-inst"] =
true;
423 Features[
"tanh-insts"] =
true;
424 Features[
"tensor-cvt-lut-insts"] =
true;
425 Features[
"transpose-load-f4f6-insts"] =
true;
426 Features[
"bf16-trans-insts"] =
true;
427 Features[
"bf16-cvt-insts"] =
true;
428 Features[
"fp8-conversion-insts"] =
true;
429 Features[
"fp8e5m3-insts"] =
true;
430 Features[
"permlane16-swap"] =
true;
431 Features[
"ashr-pk-insts"] =
true;
432 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
433 Features[
"vmem-pref-insts"] =
true;
434 Features[
"atomic-fadd-rtn-insts"] =
true;
435 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
436 Features[
"atomic-flat-pk-add-16-insts"] =
true;
437 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
438 Features[
"atomic-ds-pk-add-16-insts"] =
true;
439 Features[
"setprio-inc-wg-inst"] =
true;
440 Features[
"atomic-fmin-fmax-global-f32"] =
true;
441 Features[
"atomic-fmin-fmax-global-f64"] =
true;
442 Features[
"wavefrontsize32"] =
true;
447 Features[
"ci-insts"] =
true;
448 Features[
"dot7-insts"] =
true;
449 Features[
"dot8-insts"] =
true;
450 Features[
"dot9-insts"] =
true;
451 Features[
"dot10-insts"] =
true;
452 Features[
"dot11-insts"] =
true;
453 Features[
"dot12-insts"] =
true;
454 Features[
"dl-insts"] =
true;
455 Features[
"atomic-ds-pk-add-16-insts"] =
true;
456 Features[
"atomic-flat-pk-add-16-insts"] =
true;
457 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
458 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
459 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
460 Features[
"16-bit-insts"] =
true;
461 Features[
"dpp"] =
true;
462 Features[
"gfx8-insts"] =
true;
463 Features[
"gfx9-insts"] =
true;
464 Features[
"gfx10-insts"] =
true;
465 Features[
"gfx10-3-insts"] =
true;
466 Features[
"gfx11-insts"] =
true;
467 Features[
"gfx12-insts"] =
true;
468 Features[
"atomic-fadd-rtn-insts"] =
true;
469 Features[
"image-insts"] =
true;
470 Features[
"fp8-conversion-insts"] =
true;
471 Features[
"atomic-fmin-fmax-global-f32"] =
true;
482 Features[
"ci-insts"] =
true;
483 Features[
"dot5-insts"] =
true;
484 Features[
"dot7-insts"] =
true;
485 Features[
"dot8-insts"] =
true;
486 Features[
"dot9-insts"] =
true;
487 Features[
"dot10-insts"] =
true;
488 Features[
"dot12-insts"] =
true;
489 Features[
"dl-insts"] =
true;
490 Features[
"16-bit-insts"] =
true;
491 Features[
"dpp"] =
true;
492 Features[
"gfx8-insts"] =
true;
493 Features[
"gfx9-insts"] =
true;
494 Features[
"gfx10-insts"] =
true;
495 Features[
"gfx10-3-insts"] =
true;
496 Features[
"gfx11-insts"] =
true;
497 Features[
"atomic-fadd-rtn-insts"] =
true;
498 Features[
"image-insts"] =
true;
499 Features[
"gws"] =
true;
500 Features[
"atomic-fmin-fmax-global-f32"] =
true;
510 Features[
"ci-insts"] =
true;
511 Features[
"dot1-insts"] =
true;
512 Features[
"dot2-insts"] =
true;
513 Features[
"dot5-insts"] =
true;
514 Features[
"dot6-insts"] =
true;
515 Features[
"dot7-insts"] =
true;
516 Features[
"dot10-insts"] =
true;
517 Features[
"dl-insts"] =
true;
518 Features[
"16-bit-insts"] =
true;
519 Features[
"dpp"] =
true;
520 Features[
"gfx8-insts"] =
true;
521 Features[
"gfx9-insts"] =
true;
522 Features[
"gfx10-insts"] =
true;
523 Features[
"gfx10-3-insts"] =
true;
524 Features[
"image-insts"] =
true;
525 Features[
"s-memrealtime"] =
true;
526 Features[
"s-memtime-inst"] =
true;
527 Features[
"gws"] =
true;
528 Features[
"vmem-to-lds-load-insts"] =
true;
529 Features[
"atomic-fmin-fmax-global-f32"] =
true;
530 Features[
"atomic-fmin-fmax-global-f64"] =
true;
534 Features[
"dot1-insts"] =
true;
535 Features[
"dot2-insts"] =
true;
536 Features[
"dot5-insts"] =
true;
537 Features[
"dot6-insts"] =
true;
538 Features[
"dot7-insts"] =
true;
539 Features[
"dot10-insts"] =
true;
544 Features[
"dl-insts"] =
true;
545 Features[
"ci-insts"] =
true;
546 Features[
"16-bit-insts"] =
true;
547 Features[
"dpp"] =
true;
548 Features[
"gfx8-insts"] =
true;
549 Features[
"gfx9-insts"] =
true;
550 Features[
"gfx10-insts"] =
true;
551 Features[
"image-insts"] =
true;
552 Features[
"s-memrealtime"] =
true;
553 Features[
"s-memtime-inst"] =
true;
554 Features[
"gws"] =
true;
555 Features[
"vmem-to-lds-load-insts"] =
true;
556 Features[
"atomic-fmin-fmax-global-f32"] =
true;
557 Features[
"atomic-fmin-fmax-global-f64"] =
true;
560 Features[
"bitop3-insts"] =
true;
561 Features[
"fp6bf6-cvt-scale-insts"] =
true;
562 Features[
"fp4-cvt-scale-insts"] =
true;
563 Features[
"bf8-cvt-scale-insts"] =
true;
564 Features[
"fp8-cvt-scale-insts"] =
true;
565 Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] =
true;
566 Features[
"f32-to-f16bf16-cvt-sr-insts"] =
true;
567 Features[
"prng-inst"] =
true;
568 Features[
"permlane16-swap"] =
true;
569 Features[
"permlane32-swap"] =
true;
570 Features[
"ashr-pk-insts"] =
true;
571 Features[
"dot12-insts"] =
true;
572 Features[
"dot13-insts"] =
true;
573 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
574 Features[
"gfx950-insts"] =
true;
577 Features[
"fp8-insts"] =
true;
578 Features[
"fp8-conversion-insts"] =
true;
580 Features[
"xf32-insts"] =
true;
583 Features[
"gfx940-insts"] =
true;
584 Features[
"atomic-ds-pk-add-16-insts"] =
true;
585 Features[
"atomic-flat-pk-add-16-insts"] =
true;
586 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
587 Features[
"gfx90a-insts"] =
true;
588 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
589 Features[
"atomic-fadd-rtn-insts"] =
true;
590 Features[
"dot3-insts"] =
true;
591 Features[
"dot4-insts"] =
true;
592 Features[
"dot5-insts"] =
true;
593 Features[
"dot6-insts"] =
true;
594 Features[
"mai-insts"] =
true;
595 Features[
"dl-insts"] =
true;
596 Features[
"dot1-insts"] =
true;
597 Features[
"dot2-insts"] =
true;
598 Features[
"dot7-insts"] =
true;
599 Features[
"dot10-insts"] =
true;
600 Features[
"gfx9-insts"] =
true;
601 Features[
"gfx8-insts"] =
true;
602 Features[
"16-bit-insts"] =
true;
603 Features[
"dpp"] =
true;
604 Features[
"s-memrealtime"] =
true;
605 Features[
"ci-insts"] =
true;
606 Features[
"s-memtime-inst"] =
true;
607 Features[
"gws"] =
true;
608 Features[
"vmem-to-lds-load-insts"] =
true;
609 Features[
"atomic-fmin-fmax-global-f64"] =
true;
610 Features[
"wavefrontsize64"] =
true;
613 Features[
"gfx90a-insts"] =
true;
614 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
615 Features[
"atomic-fadd-rtn-insts"] =
true;
616 Features[
"atomic-fmin-fmax-global-f64"] =
true;
619 Features[
"dot3-insts"] =
true;
620 Features[
"dot4-insts"] =
true;
621 Features[
"dot5-insts"] =
true;
622 Features[
"dot6-insts"] =
true;
623 Features[
"mai-insts"] =
true;
626 Features[
"dl-insts"] =
true;
627 Features[
"dot1-insts"] =
true;
628 Features[
"dot2-insts"] =
true;
629 Features[
"dot7-insts"] =
true;
630 Features[
"dot10-insts"] =
true;
638 Features[
"gfx9-insts"] =
true;
639 Features[
"vmem-to-lds-load-insts"] =
true;
646 Features[
"gfx8-insts"] =
true;
647 Features[
"16-bit-insts"] =
true;
648 Features[
"dpp"] =
true;
649 Features[
"s-memrealtime"] =
true;
650 Features[
"ci-insts"] =
true;
651 Features[
"image-insts"] =
true;
652 Features[
"s-memtime-inst"] =
true;
653 Features[
"gws"] =
true;
654 Features[
"wavefrontsize64"] =
true;
662 Features[
"ci-insts"] =
true;
667 Features[
"image-insts"] =
true;
668 Features[
"s-memtime-inst"] =
true;
669 Features[
"gws"] =
true;
670 Features[
"atomic-fmin-fmax-global-f32"] =
true;
671 Features[
"atomic-fmin-fmax-global-f64"] =
true;
672 Features[
"wavefrontsize64"] =
true;
684std::pair<FeatureError, StringRef>
688 if (
T.isSPIRV() &&
T.getOS() == Triple::OSType::AMDHSA) {
692 Features[
"16-bit-insts"] =
true;
693 Features[
"ashr-pk-insts"] =
true;
694 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
695 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
696 Features[
"atomic-ds-pk-add-16-insts"] =
true;
697 Features[
"atomic-fadd-rtn-insts"] =
true;
698 Features[
"atomic-flat-pk-add-16-insts"] =
true;
699 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
700 Features[
"bf16-trans-insts"] =
true;
701 Features[
"bf16-cvt-insts"] =
true;
702 Features[
"bf8-cvt-scale-insts"] =
true;
703 Features[
"bitop3-insts"] =
true;
704 Features[
"ci-insts"] =
true;
705 Features[
"dl-insts"] =
true;
706 Features[
"dot1-insts"] =
true;
707 Features[
"dot2-insts"] =
true;
708 Features[
"dot3-insts"] =
true;
709 Features[
"dot4-insts"] =
true;
710 Features[
"dot5-insts"] =
true;
711 Features[
"dot6-insts"] =
true;
712 Features[
"dot7-insts"] =
true;
713 Features[
"dot8-insts"] =
true;
714 Features[
"dot9-insts"] =
true;
715 Features[
"dot10-insts"] =
true;
716 Features[
"dot11-insts"] =
true;
717 Features[
"dot12-insts"] =
true;
718 Features[
"dot13-insts"] =
true;
719 Features[
"dpp"] =
true;
720 Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] =
true;
721 Features[
"f32-to-f16bf16-cvt-sr-insts"] =
true;
722 Features[
"fp4-cvt-scale-insts"] =
true;
723 Features[
"fp6bf6-cvt-scale-insts"] =
true;
724 Features[
"fp8e5m3-insts"] =
true;
725 Features[
"fp8-conversion-insts"] =
true;
726 Features[
"fp8-cvt-scale-insts"] =
true;
727 Features[
"fp8-insts"] =
true;
728 Features[
"gfx8-insts"] =
true;
729 Features[
"gfx9-insts"] =
true;
730 Features[
"gfx90a-insts"] =
true;
731 Features[
"gfx940-insts"] =
true;
732 Features[
"gfx950-insts"] =
true;
733 Features[
"gfx10-insts"] =
true;
734 Features[
"gfx10-3-insts"] =
true;
735 Features[
"gfx11-insts"] =
true;
736 Features[
"gfx12-insts"] =
true;
737 Features[
"gfx1250-insts"] =
true;
738 Features[
"gws"] =
true;
739 Features[
"image-insts"] =
true;
740 Features[
"mai-insts"] =
true;
741 Features[
"permlane16-swap"] =
true;
742 Features[
"permlane32-swap"] =
true;
743 Features[
"prng-inst"] =
true;
744 Features[
"setprio-inc-wg-inst"] =
true;
745 Features[
"s-memrealtime"] =
true;
746 Features[
"s-memtime-inst"] =
true;
747 Features[
"tanh-insts"] =
true;
748 Features[
"tensor-cvt-lut-insts"] =
true;
749 Features[
"transpose-load-f4f6-insts"] =
true;
750 Features[
"vmem-pref-insts"] =
true;
751 Features[
"vmem-to-lds-load-insts"] =
true;
752 Features[
"wavefrontsize32"] =
true;
753 Features[
"wavefrontsize64"] =
true;
754 }
else if (
T.isAMDGCN()) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static const BasicSubtargetSubTypeKV * find(StringRef S, ArrayRef< BasicSubtargetSubTypeKV > A)
Find KV in array using binary search.
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 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.