19using namespace AMDGPU;
30constexpr GPUInfo R600GPUs[] = {
63constexpr GPUInfo AMDGCNGPUs[] = {
147 return A.Kind <
B.Kind;
150 if (
I == Table.
end() ||
I->Kind != Search.Kind)
177 if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
178 return Entry->CanonicalName;
183 if (
const auto *Entry = getArchEntry(AK, R600GPUs))
184 return Entry->CanonicalName;
189 for (
const auto &
C : AMDGCNGPUs) {
194 return AMDGPU::GPUKind::GK_NONE;
198 for (
const auto &
C : R600GPUs) {
203 return AMDGPU::GPUKind::GK_NONE;
207 if (
const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
208 return Entry->Features;
213 if (
const auto *Entry = getArchEntry(AK, R600GPUs))
214 return Entry->Features;
220 for (
const auto &
C : AMDGCNGPUs)
225 for (
const auto &
C : R600GPUs)
231 if (AK == AMDGPU::GPUKind::GK_NONE) {
232 if (GPU ==
"generic-hsa")
234 if (GPU ==
"generic")
308 default:
return {0, 0, 0};
325 if (
T.isSPIRV() &&
T.getOS() == Triple::OSType::AMDHSA) {
329 Features[
"16-bit-insts"] =
true;
330 Features[
"ashr-pk-insts"] =
true;
331 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
332 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
333 Features[
"atomic-ds-pk-add-16-insts"] =
true;
334 Features[
"atomic-fadd-rtn-insts"] =
true;
335 Features[
"atomic-flat-pk-add-16-insts"] =
true;
336 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
337 Features[
"bf8-cvt-scale-insts"] =
true;
338 Features[
"bitop3-insts"] =
true;
339 Features[
"ci-insts"] =
true;
340 Features[
"dl-insts"] =
true;
341 Features[
"dot1-insts"] =
true;
342 Features[
"dot2-insts"] =
true;
343 Features[
"dot3-insts"] =
true;
344 Features[
"dot4-insts"] =
true;
345 Features[
"dot5-insts"] =
true;
346 Features[
"dot6-insts"] =
true;
347 Features[
"dot7-insts"] =
true;
348 Features[
"dot8-insts"] =
true;
349 Features[
"dot9-insts"] =
true;
350 Features[
"dot10-insts"] =
true;
351 Features[
"dot11-insts"] =
true;
352 Features[
"dot12-insts"] =
true;
353 Features[
"dot13-insts"] =
true;
354 Features[
"dpp"] =
true;
355 Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] =
true;
356 Features[
"f32-to-f16bf16-cvt-sr-insts"] =
true;
357 Features[
"fp4-cvt-scale-insts"] =
true;
358 Features[
"fp6bf6-cvt-scale-insts"] =
true;
359 Features[
"fp8-insts"] =
true;
360 Features[
"fp8-conversion-insts"] =
true;
361 Features[
"fp8-cvt-scale-insts"] =
true;
362 Features[
"gfx8-insts"] =
true;
363 Features[
"gfx9-insts"] =
true;
364 Features[
"gfx90a-insts"] =
true;
365 Features[
"gfx940-insts"] =
true;
366 Features[
"gfx950-insts"] =
true;
367 Features[
"gfx10-insts"] =
true;
368 Features[
"gfx10-3-insts"] =
true;
369 Features[
"gfx11-insts"] =
true;
370 Features[
"gfx12-insts"] =
true;
371 Features[
"gws"] =
true;
372 Features[
"image-insts"] =
true;
373 Features[
"s-memrealtime"] =
true;
374 Features[
"s-memtime-inst"] =
true;
375 Features[
"mai-insts"] =
true;
376 Features[
"permlane16-swap"] =
true;
377 Features[
"permlane32-swap"] =
true;
378 Features[
"prng-inst"] =
true;
379 Features[
"wavefrontsize32"] =
true;
380 Features[
"wavefrontsize64"] =
true;
381 }
else if (
T.isAMDGCN()) {
387 Features[
"ci-insts"] =
true;
388 Features[
"dot7-insts"] =
true;
389 Features[
"dot8-insts"] =
true;
390 Features[
"dot9-insts"] =
true;
391 Features[
"dot10-insts"] =
true;
392 Features[
"dot11-insts"] =
true;
393 Features[
"dot12-insts"] =
true;
394 Features[
"dl-insts"] =
true;
395 Features[
"atomic-ds-pk-add-16-insts"] =
true;
396 Features[
"atomic-flat-pk-add-16-insts"] =
true;
397 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
398 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
399 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
400 Features[
"16-bit-insts"] =
true;
401 Features[
"dpp"] =
true;
402 Features[
"gfx8-insts"] =
true;
403 Features[
"gfx9-insts"] =
true;
404 Features[
"gfx10-insts"] =
true;
405 Features[
"gfx10-3-insts"] =
true;
406 Features[
"gfx11-insts"] =
true;
407 Features[
"gfx12-insts"] =
true;
408 Features[
"atomic-fadd-rtn-insts"] =
true;
409 Features[
"image-insts"] =
true;
410 Features[
"fp8-conversion-insts"] =
true;
421 Features[
"ci-insts"] =
true;
422 Features[
"dot5-insts"] =
true;
423 Features[
"dot7-insts"] =
true;
424 Features[
"dot8-insts"] =
true;
425 Features[
"dot9-insts"] =
true;
426 Features[
"dot10-insts"] =
true;
427 Features[
"dot12-insts"] =
true;
428 Features[
"dl-insts"] =
true;
429 Features[
"16-bit-insts"] =
true;
430 Features[
"dpp"] =
true;
431 Features[
"gfx8-insts"] =
true;
432 Features[
"gfx9-insts"] =
true;
433 Features[
"gfx10-insts"] =
true;
434 Features[
"gfx10-3-insts"] =
true;
435 Features[
"gfx11-insts"] =
true;
436 Features[
"atomic-fadd-rtn-insts"] =
true;
437 Features[
"image-insts"] =
true;
438 Features[
"gws"] =
true;
448 Features[
"ci-insts"] =
true;
449 Features[
"dot1-insts"] =
true;
450 Features[
"dot2-insts"] =
true;
451 Features[
"dot5-insts"] =
true;
452 Features[
"dot6-insts"] =
true;
453 Features[
"dot7-insts"] =
true;
454 Features[
"dot10-insts"] =
true;
455 Features[
"dl-insts"] =
true;
456 Features[
"16-bit-insts"] =
true;
457 Features[
"dpp"] =
true;
458 Features[
"gfx8-insts"] =
true;
459 Features[
"gfx9-insts"] =
true;
460 Features[
"gfx10-insts"] =
true;
461 Features[
"gfx10-3-insts"] =
true;
462 Features[
"image-insts"] =
true;
463 Features[
"s-memrealtime"] =
true;
464 Features[
"s-memtime-inst"] =
true;
465 Features[
"gws"] =
true;
469 Features[
"dot1-insts"] =
true;
470 Features[
"dot2-insts"] =
true;
471 Features[
"dot5-insts"] =
true;
472 Features[
"dot6-insts"] =
true;
473 Features[
"dot7-insts"] =
true;
474 Features[
"dot10-insts"] =
true;
479 Features[
"dl-insts"] =
true;
480 Features[
"ci-insts"] =
true;
481 Features[
"16-bit-insts"] =
true;
482 Features[
"dpp"] =
true;
483 Features[
"gfx8-insts"] =
true;
484 Features[
"gfx9-insts"] =
true;
485 Features[
"gfx10-insts"] =
true;
486 Features[
"image-insts"] =
true;
487 Features[
"s-memrealtime"] =
true;
488 Features[
"s-memtime-inst"] =
true;
489 Features[
"gws"] =
true;
492 Features[
"bitop3-insts"] =
true;
493 Features[
"fp6bf6-cvt-scale-insts"] =
true;
494 Features[
"fp4-cvt-scale-insts"] =
true;
495 Features[
"bf8-cvt-scale-insts"] =
true;
496 Features[
"fp8-cvt-scale-insts"] =
true;
497 Features[
"f16bf16-to-fp6bf6-cvt-scale-insts"] =
true;
498 Features[
"f32-to-f16bf16-cvt-sr-insts"] =
true;
499 Features[
"prng-inst"] =
true;
500 Features[
"permlane16-swap"] =
true;
501 Features[
"permlane32-swap"] =
true;
502 Features[
"ashr-pk-insts"] =
true;
503 Features[
"dot12-insts"] =
true;
504 Features[
"dot13-insts"] =
true;
505 Features[
"atomic-buffer-pk-add-bf16-inst"] =
true;
506 Features[
"gfx950-insts"] =
true;
511 Features[
"fp8-insts"] =
true;
512 Features[
"fp8-conversion-insts"] =
true;
514 Features[
"xf32-insts"] =
true;
517 Features[
"gfx940-insts"] =
true;
518 Features[
"atomic-ds-pk-add-16-insts"] =
true;
519 Features[
"atomic-flat-pk-add-16-insts"] =
true;
520 Features[
"atomic-global-pk-add-bf16-inst"] =
true;
521 Features[
"gfx90a-insts"] =
true;
522 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
523 Features[
"atomic-fadd-rtn-insts"] =
true;
524 Features[
"dot3-insts"] =
true;
525 Features[
"dot4-insts"] =
true;
526 Features[
"dot5-insts"] =
true;
527 Features[
"dot6-insts"] =
true;
528 Features[
"mai-insts"] =
true;
529 Features[
"dl-insts"] =
true;
530 Features[
"dot1-insts"] =
true;
531 Features[
"dot2-insts"] =
true;
532 Features[
"dot7-insts"] =
true;
533 Features[
"dot10-insts"] =
true;
534 Features[
"gfx9-insts"] =
true;
535 Features[
"gfx8-insts"] =
true;
536 Features[
"16-bit-insts"] =
true;
537 Features[
"dpp"] =
true;
538 Features[
"s-memrealtime"] =
true;
539 Features[
"ci-insts"] =
true;
540 Features[
"s-memtime-inst"] =
true;
541 Features[
"gws"] =
true;
544 Features[
"gfx90a-insts"] =
true;
545 Features[
"atomic-buffer-global-pk-add-f16-insts"] =
true;
546 Features[
"atomic-fadd-rtn-insts"] =
true;
549 Features[
"dot3-insts"] =
true;
550 Features[
"dot4-insts"] =
true;
551 Features[
"dot5-insts"] =
true;
552 Features[
"dot6-insts"] =
true;
553 Features[
"mai-insts"] =
true;
556 Features[
"dl-insts"] =
true;
557 Features[
"dot1-insts"] =
true;
558 Features[
"dot2-insts"] =
true;
559 Features[
"dot7-insts"] =
true;
560 Features[
"dot10-insts"] =
true;
568 Features[
"gfx9-insts"] =
true;
575 Features[
"gfx8-insts"] =
true;
576 Features[
"16-bit-insts"] =
true;
577 Features[
"dpp"] =
true;
578 Features[
"s-memrealtime"] =
true;
586 Features[
"ci-insts"] =
true;
591 Features[
"image-insts"] =
true;
592 Features[
"s-memtime-inst"] =
true;
593 Features[
"gws"] =
true;
631 bool IsWave32Capable =
false;
660 IsWave32Capable =
true;
666 return IsWave32Capable;
669std::pair<FeatureError, StringRef>
673 const bool IsNullGPU = GPU.
empty();
674 const bool HaveWave32 = Features.
count(
"wavefrontsize32");
675 const bool HaveWave64 = Features.
count(
"wavefrontsize64");
676 if (HaveWave32 && HaveWave64) {
678 "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
680 if (HaveWave32 && !IsNullGPU && !IsWave32Capable) {
686 if (!HaveWave32 && !HaveWave64) {
688 IsWave32Capable ?
"wavefrontsize32" :
"wavefrontsize64";
689 Features.
insert(std::make_pair(DefaultWaveSizeFeature,
true));
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isWave32Capable(StringRef GPU, const Triple &T)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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.
StringRef getArchNameR600(GPUKind AK)
GPUKind
GPU kinds supported by the AMDGPU target.
StringRef getCanonicalArchName(const Triple &T, StringRef Arch)
void fillValidArchListR600(SmallVectorImpl< StringRef > &Values)
StringRef getArchFamilyNameAMDGCN(GPUKind AK)
IsaVersion getIsaVersion(StringRef GPU)
void fillAMDGPUFeatureMap(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Fills Features map with default values for given target GPU.
std::pair< FeatureError, StringRef > insertWaveSizeFeature(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Inserts wave size feature for given GPU into features map.
void fillValidArchListAMDGCN(SmallVectorImpl< StringRef > &Values)
GPUKind parseArchAMDGCN(StringRef CPU)
@ UNSUPPORTED_TARGET_FEATURE
@ INVALID_FEATURE_COMBINATION
@ FEATURE_FAST_DENORMAL_F32
StringRef getArchNameAMDGCN(GPUKind AK)
unsigned getArchAttrAMDGCN(GPUKind AK)
unsigned getArchAttrR600(GPUKind AK)
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...
Instruction set architecture version.