[llvm-branch-commits] [clang] [flang] [llvm] clang: Start using new amdgpu subarch triples (PR #206482)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jun 29 06:16:32 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
Fixup invocations using --target=amdgcn + -mcpu to introduce
the subarch in the triple.
For offload toolchains, a single toolchain is constructed for the
top level amdgpu architecture, and the effective triple is used for
target specific tool invocations.
The specifics of the resource directory layout are tbd. This does
try to find resources in the subarch named directory. The paths
are searched at toolchain creation time, so that does not work
when there are multiple subarches.
Fixes #<!-- -->154925
---
Patch is 235.86 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/206482.diff
108 Files Affected:
- (modified) clang/include/clang/Basic/OffloadArch.h (+4-5)
- (modified) clang/include/clang/Driver/ToolChain.h (+3-1)
- (modified) clang/lib/Basic/OffloadArch.cpp (+230-2)
- (modified) clang/lib/Basic/Targets/AMDGPU.cpp (+5-2)
- (modified) clang/lib/Driver/Driver.cpp (+43-12)
- (modified) clang/lib/Driver/ToolChain.cpp (+23-1)
- (modified) clang/lib/Driver/ToolChains/AMDGPU.cpp (+15)
- (modified) clang/lib/Driver/ToolChains/Arch/AMDGPU.cpp (+18-3)
- (modified) clang/lib/Driver/ToolChains/Arch/AMDGPU.h (+2-2)
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+50-16)
- (modified) clang/lib/Driver/ToolChains/HIPAMD.cpp (+3)
- (modified) clang/lib/Driver/ToolChains/HIPUtility.cpp (+14-5)
- (added) clang/test/CodeGen/amdgpu-builtin-is-invocable-subarch.c (+37)
- (added) clang/test/CodeGen/amdgpu-builtin-processor-is-subarch.c (+48)
- (added) clang/test/CodeGenOpenCL/amdgpu-wavefront-size-from-subarch.cl (+37)
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_major_version/lib/amdgpu9-amd-amdhsa-llvm/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_subarch_triples/lib/amdgpu10.30-amd-amdhsa-llvm/libclang_rt.profile.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_subarch_triples/lib/amdgpu10.30-amd-amdhsa-llvm/libclang_rt.ubsan_minimal.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_subarch_triples/lib/amdgpu10.30-amd-amdhsa-llvm/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_subarch_triples/lib/amdgpu10.30-amd-amdhsa-llvm/libflang_rt.runtime.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa-llvm/gfx90a/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa-llvm/libclang_rt.profile.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa-llvm/libclang_rt.ubsan_minimal.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa-llvm/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa-llvm/libflang_rt.runtime.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa/gfx90a/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa/libclang_rt.profile.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa/libclang_rt.ubsan_minimal.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu-amd-amdhsa/libflang_rt.runtime.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu10.30-amd-amdhsa/libclang_rt.profile.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu10.30-amd-amdhsa/libclang_rt.ubsan_minimal.a ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu10.30-amd-amdhsa/libclc.bc ()
- (added) clang/test/Driver/Inputs/resource_dir_amdgpu_triples/lib/amdgpu10.30-amd-amdhsa/libflang_rt.runtime.a ()
- (modified) clang/test/Driver/amdgpu-hip-system-arch.c (+1-1)
- (modified) clang/test/Driver/amdgpu-multilib.yaml (+1-1)
- (modified) clang/test/Driver/amdgpu-openmp-sanitize-options.c (+14-14)
- (modified) clang/test/Driver/amdgpu-openmp-system-arch-fail.c (+2-2)
- (added) clang/test/Driver/amdgpu-openmp-targets-triple-compat.c (+39)
- (modified) clang/test/Driver/amdgpu-openmp-toolchain.c (+13-13)
- (added) clang/test/Driver/amdgpu-subarch-diag.hip (+13)
- (added) clang/test/Driver/amdgpu-subarch-march-diag.cl (+12)
- (added) clang/test/Driver/amdgpu-subarch-resource-dir.cl (+42)
- (modified) clang/test/Driver/amdgpu-unwind.cl (+3-3)
- (modified) clang/test/Driver/amdgpu-validate-sanitize.cl (+1-1)
- (modified) clang/test/Driver/amdgpu-xnack-sramecc-flags.c (+10-10)
- (modified) clang/test/Driver/atomic-options.hip (+1-1)
- (modified) clang/test/Driver/cl-denorms-are-zero.cl (+1-1)
- (modified) clang/test/Driver/cl-offload.cu (+2-2)
- (modified) clang/test/Driver/ftime-trace-offload.cpp (+4-4)
- (modified) clang/test/Driver/gpu-libc.c (+1-1)
- (modified) clang/test/Driver/hip-autolink.hip (+1-1)
- (modified) clang/test/Driver/hip-binding.hip (+33-33)
- (modified) clang/test/Driver/hip-code-object-version.hip (+2-2)
- (modified) clang/test/Driver/hip-cuid.hip (+6-6)
- (modified) clang/test/Driver/hip-device-compile.hip (+3-3)
- (modified) clang/test/Driver/hip-fpie-option.hip (+3-3)
- (modified) clang/test/Driver/hip-gz-options.hip (+1-1)
- (modified) clang/test/Driver/hip-host-cpu-features.hip (+3-3)
- (modified) clang/test/Driver/hip-link-bc-to-bc.hip (+6-6)
- (modified) clang/test/Driver/hip-link-bundle-archive.hip (+5-5)
- (modified) clang/test/Driver/hip-link-save-temps.hip (+4-4)
- (modified) clang/test/Driver/hip-link-shared-library.hip (+4-4)
- (modified) clang/test/Driver/hip-link-static-library.hip (+4-4)
- (modified) clang/test/Driver/hip-offload-arch.hip (+32-2)
- (modified) clang/test/Driver/hip-offload-compress-zstd.hip (+3-3)
- (modified) clang/test/Driver/hip-options.hip (+27-27)
- (modified) clang/test/Driver/hip-phases.hip (+43-43)
- (modified) clang/test/Driver/hip-rdc-device-only.hip (+24-24)
- (modified) clang/test/Driver/hip-sanitize-options.hip (+12-14)
- (modified) clang/test/Driver/hip-save-temps.hip (+33-15)
- (modified) clang/test/Driver/hip-target-id.hip (+12-7)
- (modified) clang/test/Driver/hip-thinlto.hip (+4-4)
- (modified) clang/test/Driver/hip-toolchain-device-only.hip (+2-2)
- (modified) clang/test/Driver/hip-toolchain-mllvm.hip (+2-2)
- (modified) clang/test/Driver/hip-toolchain-no-rdc.hip (+17-17)
- (modified) clang/test/Driver/hip-toolchain-opt.hip (+9-9)
- (modified) clang/test/Driver/hip-toolchain-rdc-separate.hip (+13-13)
- (modified) clang/test/Driver/hip-toolchain-rdc-static-lib.hip (+7-7)
- (modified) clang/test/Driver/hip-toolchain-rdc.hip (+8-8)
- (modified) clang/test/Driver/offload-Xarch.c (+13-5)
- (modified) clang/test/Driver/offload-arch-translation-amdgpu.cu (+59-59)
- (modified) clang/test/Driver/offload-darwin-host.hip (+2-2)
- (modified) clang/test/Driver/offload-target.c (+2-2)
- (modified) clang/test/Driver/offload.f90 (+1-1)
- (modified) clang/test/Driver/openmp-Xopenmp-target-forward-args.c (+1-1)
- (modified) clang/test/Driver/openmp-offload-gpu.c (+31-15)
- (modified) clang/test/Driver/openmp-offload-infer.c (+2-2)
- (modified) clang/test/Driver/openmp-system-arch.c (+6-6)
- (modified) clang/test/Driver/rocm-detect.cl (+1-1)
- (modified) clang/test/Driver/rocm-detect.hip (+1-1)
- (modified) clang/test/Driver/rocm-device-libs.cl (+1-1)
- (added) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-amdgpu-triple-compat.c (+30)
- (modified) clang/test/OpenMP/amdgpu-arch-compat.c (+4-1)
- (modified) clang/test/Preprocessor/hash_builtin.cpp (+2)
- (added) clang/test/SemaHIP/amdgpu-processor-is-invalid-subarch-arg-list.hip (+11)
- (modified) clang/test/SemaHIP/amdgpu-processor-is.hip (+11)
- (modified) clang/test/SemaOpenCL/builtins-amdgcn-gfx11.cl (+4)
- (modified) clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp (+4-2)
- (modified) clang/unittests/Basic/OffloadArchTest.cpp (+22)
- (modified) flang/test/Driver/code-object-version.f90 (+1-1)
- (modified) flang/test/Driver/offload-device.f90 (+1-1)
- (modified) flang/test/Driver/omp-driver-offload.f90 (+9-9)
- (modified) flang/test/Driver/target-cpu-features.f90 (+1-1)
- (modified) flang/test/Driver/target-gpu-features.f90 (+1-1)
- (modified) flang/test/Driver/xoffload-linker.f90 (+2-2)
- (modified) llvm/include/llvm/Frontend/OpenMP/OMPKinds.def (+1)
- (modified) llvm/lib/TargetParser/AMDGPUTargetParser.cpp (+8-2)
``````````diff
diff --git a/clang/include/clang/Basic/OffloadArch.h b/clang/include/clang/Basic/OffloadArch.h
index 552f1b0316ccf..1ca8f1bba4524 100644
--- a/clang/include/clang/Basic/OffloadArch.h
+++ b/clang/include/clang/Basic/OffloadArch.h
@@ -9,13 +9,9 @@
#ifndef LLVM_CLANG_BASIC_OFFLOADARCH_H
#define LLVM_CLANG_BASIC_OFFLOADARCH_H
-#include "llvm/ADT/StringRef.h"
+#include "llvm/TargetParser/Triple.h"
#include <tuple>
-namespace llvm {
-class Triple;
-} // namespace llvm
-
namespace clang {
enum class OffloadArch {
@@ -165,6 +161,9 @@ const char *OffloadArchToVirtualArchString(OffloadArch A);
// OffloadArch::Unknown if the string is not recognized.
OffloadArch StringToOffloadArch(llvm::StringRef S);
+OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch);
+llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID);
+
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
OffloadArch ID);
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 863ba1084cb1a..60bf559b8a073 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -911,7 +911,9 @@ class ToolChain {
return;
}
- if (TT.isAMDGPU()) {
+ if (TT.isAMDGCN()) {
+ // Fixup legacy "amdgcn" triples to "amdgpu"
+ TT.setArch(llvm::Triple::amdgpu, TT.getSubArch());
if (TT.getVendor() == llvm::Triple::UnknownVendor)
TT.setVendor(llvm::Triple::AMD);
if (TT.getOS() == llvm::Triple::UnknownOS)
diff --git a/clang/lib/Basic/OffloadArch.cpp b/clang/lib/Basic/OffloadArch.cpp
index 5d12f257f3680..768965624a1cd 100644
--- a/clang/lib/Basic/OffloadArch.cpp
+++ b/clang/lib/Basic/OffloadArch.cpp
@@ -158,6 +158,232 @@ OffloadArch StringToOffloadArch(llvm::StringRef S) {
return Result->Arch;
}
+OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch) {
+ static const OffloadArch AMDGPUSubArchs[llvm::Triple::LastAMDGPUSubArch -
+ llvm::Triple::FirstAMDGPUSubArch +
+ 1] = {
+ OffloadArch::Unknown, OffloadArch::GFX600, OffloadArch::GFX601,
+ OffloadArch::GFX602,
+
+ OffloadArch::Unknown, OffloadArch::GFX700, OffloadArch::GFX701,
+ OffloadArch::GFX702, OffloadArch::GFX703, OffloadArch::GFX704,
+ OffloadArch::GFX705,
+
+ OffloadArch::Unknown, OffloadArch::GFX801, OffloadArch::GFX802,
+ OffloadArch::GFX803, OffloadArch::GFX805,
+
+ OffloadArch::GFX810,
+
+ OffloadArch::GFX9_GENERIC, OffloadArch::GFX900, OffloadArch::GFX902,
+ OffloadArch::GFX904, OffloadArch::GFX906, OffloadArch::GFX909,
+ OffloadArch::GFX90c,
+
+ OffloadArch::GFX908,
+
+ OffloadArch::GFX90a,
+
+ OffloadArch::GFX9_4_GENERIC, OffloadArch::GFX942, OffloadArch::GFX950,
+
+ OffloadArch::GFX10_1_GENERIC, OffloadArch::GFX1010, OffloadArch::GFX1011,
+ OffloadArch::GFX1012, OffloadArch::GFX1013,
+
+ OffloadArch::GFX10_3_GENERIC, OffloadArch::GFX1030, OffloadArch::GFX1031,
+ OffloadArch::GFX1032, OffloadArch::GFX1033, OffloadArch::GFX1034,
+ OffloadArch::GFX1035, OffloadArch::GFX1036,
+
+ OffloadArch::GFX11_GENERIC, OffloadArch::GFX1100, OffloadArch::GFX1101,
+ OffloadArch::GFX1102, OffloadArch::GFX1103, OffloadArch::GFX1150,
+ OffloadArch::GFX1151, OffloadArch::GFX1152, OffloadArch::GFX1153,
+ OffloadArch::GFX1154,
+
+ OffloadArch::Unknown, OffloadArch::GFX1170, OffloadArch::GFX1171,
+ OffloadArch::GFX1172,
+
+ OffloadArch::GFX12_GENERIC, OffloadArch::GFX1200, OffloadArch::GFX1201,
+
+ OffloadArch::GFX12_5_GENERIC, OffloadArch::GFX1250, OffloadArch::GFX1251,
+
+ OffloadArch::Unknown, OffloadArch::GFX1310};
+
+ if (SubArch < llvm::Triple::FirstAMDGPUSubArch ||
+ SubArch > llvm::Triple::LastAMDGPUSubArch)
+ return OffloadArch::Unknown;
+
+ return AMDGPUSubArchs[SubArch - llvm::Triple::FirstAMDGPUSubArch];
+}
+
+llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID) {
+ switch (ID) {
+ case OffloadArch::Unused:
+ case OffloadArch::Unknown:
+ case OffloadArch::SM_20:
+ case OffloadArch::SM_21:
+ case OffloadArch::SM_30:
+ case OffloadArch::SM_32_:
+ case OffloadArch::SM_35:
+ case OffloadArch::SM_37:
+ case OffloadArch::SM_50:
+ case OffloadArch::SM_52:
+ case OffloadArch::SM_53:
+ case OffloadArch::SM_60:
+ case OffloadArch::SM_61:
+ case OffloadArch::SM_62:
+ case OffloadArch::SM_70:
+ case OffloadArch::SM_72:
+ case OffloadArch::SM_75:
+ case OffloadArch::SM_80:
+ case OffloadArch::SM_86:
+ case OffloadArch::SM_87:
+ case OffloadArch::SM_88:
+ case OffloadArch::SM_89:
+ case OffloadArch::SM_90:
+ case OffloadArch::SM_90a:
+ case OffloadArch::SM_100:
+ case OffloadArch::SM_100a:
+ case OffloadArch::SM_100f:
+ case OffloadArch::SM_101:
+ case OffloadArch::SM_101a:
+ case OffloadArch::SM_101f:
+ case OffloadArch::SM_103:
+ case OffloadArch::SM_103a:
+ case OffloadArch::SM_103f:
+ case OffloadArch::SM_110:
+ case OffloadArch::SM_110a:
+ case OffloadArch::SM_110f:
+ case OffloadArch::SM_120:
+ case OffloadArch::SM_120a:
+ case OffloadArch::SM_120f:
+ case OffloadArch::SM_121:
+ case OffloadArch::SM_121a:
+ case OffloadArch::SM_121f:
+ case OffloadArch::AMDGCNSPIRV:
+ case OffloadArch::Generic:
+ case OffloadArch::GRANITERAPIDS:
+ case OffloadArch::BMG_G21:
+ return llvm::Triple::NoSubArch;
+ case OffloadArch::GFX600:
+ return llvm::Triple::AMDGPUSubArch600;
+ case OffloadArch::GFX601:
+ return llvm::Triple::AMDGPUSubArch601;
+ case OffloadArch::GFX602:
+ return llvm::Triple::AMDGPUSubArch602;
+ case OffloadArch::GFX700:
+ return llvm::Triple::AMDGPUSubArch700;
+ case OffloadArch::GFX701:
+ return llvm::Triple::AMDGPUSubArch701;
+ case OffloadArch::GFX702:
+ return llvm::Triple::AMDGPUSubArch702;
+ case OffloadArch::GFX703:
+ return llvm::Triple::AMDGPUSubArch703;
+ case OffloadArch::GFX704:
+ return llvm::Triple::AMDGPUSubArch704;
+ case OffloadArch::GFX705:
+ return llvm::Triple::AMDGPUSubArch705;
+ case OffloadArch::GFX801:
+ return llvm::Triple::AMDGPUSubArch801;
+ case OffloadArch::GFX802:
+ return llvm::Triple::AMDGPUSubArch802;
+ case OffloadArch::GFX803:
+ return llvm::Triple::AMDGPUSubArch803;
+ case OffloadArch::GFX805:
+ return llvm::Triple::AMDGPUSubArch805;
+ case OffloadArch::GFX810:
+ return llvm::Triple::AMDGPUSubArch810;
+ case OffloadArch::GFX9_GENERIC:
+ return llvm::Triple::AMDGPUSubArch9;
+ case OffloadArch::GFX900:
+ return llvm::Triple::AMDGPUSubArch900;
+ case OffloadArch::GFX902:
+ return llvm::Triple::AMDGPUSubArch902;
+ case OffloadArch::GFX904:
+ return llvm::Triple::AMDGPUSubArch904;
+ case OffloadArch::GFX906:
+ return llvm::Triple::AMDGPUSubArch906;
+ case OffloadArch::GFX908:
+ return llvm::Triple::AMDGPUSubArch908;
+ case OffloadArch::GFX909:
+ return llvm::Triple::AMDGPUSubArch909;
+ case OffloadArch::GFX90a:
+ return llvm::Triple::AMDGPUSubArch90A;
+ case OffloadArch::GFX90c:
+ return llvm::Triple::AMDGPUSubArch90C;
+ case OffloadArch::GFX9_4_GENERIC:
+ return llvm::Triple::AMDGPUSubArch9_4;
+ case OffloadArch::GFX942:
+ return llvm::Triple::AMDGPUSubArch942;
+ case OffloadArch::GFX950:
+ return llvm::Triple::AMDGPUSubArch950;
+ case OffloadArch::GFX10_1_GENERIC:
+ return llvm::Triple::AMDGPUSubArch10_1;
+ case OffloadArch::GFX1010:
+ return llvm::Triple::AMDGPUSubArch1010;
+ case OffloadArch::GFX1011:
+ return llvm::Triple::AMDGPUSubArch1011;
+ case OffloadArch::GFX1012:
+ return llvm::Triple::AMDGPUSubArch1012;
+ case OffloadArch::GFX1013:
+ return llvm::Triple::AMDGPUSubArch1013;
+ case OffloadArch::GFX10_3_GENERIC:
+ return llvm::Triple::AMDGPUSubArch10_3;
+ case OffloadArch::GFX1030:
+ return llvm::Triple::AMDGPUSubArch1030;
+ case OffloadArch::GFX1031:
+ return llvm::Triple::AMDGPUSubArch1031;
+ case OffloadArch::GFX1032:
+ return llvm::Triple::AMDGPUSubArch1032;
+ case OffloadArch::GFX1033:
+ return llvm::Triple::AMDGPUSubArch1033;
+ case OffloadArch::GFX1034:
+ return llvm::Triple::AMDGPUSubArch1034;
+ case OffloadArch::GFX1035:
+ return llvm::Triple::AMDGPUSubArch1035;
+ case OffloadArch::GFX1036:
+ return llvm::Triple::AMDGPUSubArch1036;
+ case OffloadArch::GFX11_GENERIC:
+ return llvm::Triple::AMDGPUSubArch11;
+ case OffloadArch::GFX1100:
+ return llvm::Triple::AMDGPUSubArch1100;
+ case OffloadArch::GFX1101:
+ return llvm::Triple::AMDGPUSubArch1101;
+ case OffloadArch::GFX1102:
+ return llvm::Triple::AMDGPUSubArch1102;
+ case OffloadArch::GFX1103:
+ return llvm::Triple::AMDGPUSubArch1103;
+ case OffloadArch::GFX1150:
+ return llvm::Triple::AMDGPUSubArch1150;
+ case OffloadArch::GFX1151:
+ return llvm::Triple::AMDGPUSubArch1151;
+ case OffloadArch::GFX1152:
+ return llvm::Triple::AMDGPUSubArch1152;
+ case OffloadArch::GFX1153:
+ return llvm::Triple::AMDGPUSubArch1153;
+ case OffloadArch::GFX1154:
+ return llvm::Triple::AMDGPUSubArch1154;
+ case OffloadArch::GFX1170:
+ return llvm::Triple::AMDGPUSubArch1170;
+ case OffloadArch::GFX1171:
+ return llvm::Triple::AMDGPUSubArch1171;
+ case OffloadArch::GFX1172:
+ return llvm::Triple::AMDGPUSubArch1172;
+ case OffloadArch::GFX12_GENERIC:
+ return llvm::Triple::AMDGPUSubArch12;
+ case OffloadArch::GFX1200:
+ return llvm::Triple::AMDGPUSubArch1200;
+ case OffloadArch::GFX1201:
+ return llvm::Triple::AMDGPUSubArch1201;
+ case OffloadArch::GFX1250:
+ return llvm::Triple::AMDGPUSubArch1250;
+ case OffloadArch::GFX1251:
+ return llvm::Triple::AMDGPUSubArch1251;
+ case OffloadArch::GFX12_5_GENERIC:
+ return llvm::Triple::AMDGPUSubArch12_5;
+ case OffloadArch::GFX1310:
+ return llvm::Triple::AMDGPUSubArch1310;
+ }
+
+ llvm_unreachable("covered switch");
+}
+
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
OffloadArch ID) {
if (ID == OffloadArch::AMDGCNSPIRV)
@@ -172,8 +398,10 @@ llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
llvm::Triple::CUDA);
}
- if (IsAMDOffloadArch(ID))
- return llvm::Triple("amdgcn-amd-amdhsa");
+ if (IsAMDOffloadArch(ID)) {
+ return llvm::Triple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
+ llvm::Triple::AMD, llvm::Triple::AMDHSA);
+ }
return {};
}
diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp
index 3fd9643373383..67d8f65c2975d 100644
--- a/clang/lib/Basic/Targets/AMDGPU.cpp
+++ b/clang/lib/Basic/Targets/AMDGPU.cpp
@@ -191,8 +191,11 @@ void AMDGPUTargetInfo::fillValidCPUList(
AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts)
: TargetInfo(Triple),
- GPUKind(Triple.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Opts.CPU)
- : llvm::AMDGPU::parseArchR600(Opts.CPU)),
+ GPUKind(Triple.isAMDGCN()
+ ? (Opts.CPU.empty() ? llvm::AMDGPU::getGPUKindFromSubArch(
+ Triple.getSubArch())
+ : llvm::AMDGPU::parseArchAMDGCN(Opts.CPU))
+ : llvm::AMDGPU::parseArchR600(Opts.CPU)),
GPUFeatures(Triple.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
: llvm::AMDGPU::getArchAttrR600(GPUKind)) {
resetDataLayout();
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 1d4e6ab50152c..4be846b63dc8b 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -940,9 +940,11 @@ static TripleSet inferOffloadToolchains(Compilation &C,
TripleSet Triples;
for (llvm::StringRef Arch : Archs) {
OffloadArch ID = StringToOffloadArch(Arch);
- if (ID == OffloadArch::Unknown)
- ID = StringToOffloadArch(
- getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
+ if (ID == OffloadArch::Unknown) {
+ llvm::Triple AMDGPUTriple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
+ llvm::Triple::AMD, llvm::Triple::AMDHSA);
+ ID = StringToOffloadArch(getProcessorFromTargetID(AMDGPUTriple, Arch));
+ }
if (Kind == Action::OFK_HIP && !IsAMDOffloadArch(ID)) {
C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
@@ -987,9 +989,10 @@ static TripleSet inferOffloadToolchains(Compilation &C,
}
// Infer the default target triple if no specific architectures are given.
- if (Archs.empty() && Kind == Action::OFK_HIP)
- Triples.insert(llvm::Triple("amdgcn-amd-amdhsa"));
- else if (Archs.empty() && Kind == Action::OFK_Cuda) {
+ if (Archs.empty() && Kind == Action::OFK_HIP) {
+ Triples.insert(llvm::Triple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
+ llvm::Triple::AMD, llvm::Triple::AMDHSA));
+ } else if (Archs.empty() && Kind == Action::OFK_Cuda) {
llvm::Triple::ArchType Arch =
C.getDefaultToolChain().getTriple().isArch64Bit()
? llvm::Triple::nvptx64
@@ -4853,11 +4856,22 @@ static StringRef getCanonicalArchString(Compilation &C,
C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
<< "CUDA" << ArchStr;
return StringRef();
- } else if (Triple.isAMDGPU() &&
- (Arch == OffloadArch::Unknown || !IsAMDOffloadArch(Arch))) {
- C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
- << "HIP" << ArchStr;
- return StringRef();
+ } else if (Triple.isAMDGPU()) {
+ if (Arch == OffloadArch::Unknown || !IsAMDOffloadArch(Arch)) {
+ C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
+ << "HIP" << ArchStr;
+ return {};
+ }
+
+ if (Triple.getSubArch() != llvm::Triple::NoSubArch) {
+ llvm::Triple::SubArchType ArchSubArch = getOffloadArchSubArch(Arch);
+ if (ArchSubArch != Triple.getSubArch() &&
+ llvm::AMDGPU::getMajorSubArch(ArchSubArch) != Triple.getSubArch()) {
+ C.getDriver().Diag(clang::diag::err_target_unsupported_arch)
+ << ArchStr << Triple.getArchName();
+ return {};
+ }
+ }
}
if (IsNVIDIAOffloadArch(Arch))
@@ -4955,7 +4969,9 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
<< ConflictingArchs->first << ConflictingArchs->second;
// Fill in the default architectures if not provided explicitly.
- if (Archs.empty()) {
+ bool HasSubArch = TC.getTriple().isAMDGCN() &&
+ TC.getTriple().getSubArch() != llvm::Triple::NoSubArch;
+ if (Archs.empty() && !HasSubArch) {
if (Kind == Action::OFK_Cuda) {
Archs.insert(OffloadArchToString(TC.getTriple().isSPIRV()
? OffloadArch::Unused
@@ -4985,7 +5001,22 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
}
}
}
+ } else if (Archs.empty() && HasSubArch) {
+ // Use default CPU if we have a subarch in the triple.
+ //
+ // TODO: We ought to be able to get away with the empty string here, but
+ // many tests require removal of redundant -target-cpu arguments
+ OffloadArch TripleOffloadArch =
+ getSubArchOffloadArch(TC.getTriple().getSubArch());
+ llvm::StringRef ArchStr = TripleOffloadArch == OffloadArch::Unknown
+ ? ""
+ : OffloadArchToString(TripleOffloadArch);
+ StringRef CanonicalStr =
+ getCanonicalArchString(C, Args, ArchStr, TC.getTriple());
+ if (!CanonicalStr.empty())
+ Archs.insert(CanonicalStr);
}
+
Args.ClaimAllArgs(options::OPT_offload_arch_EQ);
Args.ClaimAllArgs(options::OPT_no_offload_arch_EQ);
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 3f6049d83423f..e7f431b4d2001 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -45,6 +45,7 @@
#include "llvm/Support/VersionTuple.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/TargetParser/AArch64TargetParser.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
#include "llvm/TargetParser/RISCVISAInfo.h"
#include "llvm/TargetParser/TargetParser.h"
#include "llvm/TargetParser/Triple.h"
@@ -1169,6 +1170,20 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
if (T.isAndroid())
return getFallbackAndroidTargetPath(BaseDir);
+ if (T.isAMDGCN()) {
+ // Clear the subarch as a fallback.
+ // TODO: Remove this when libc and compiler-rt builds are migrated.
+ llvm::Triple AMDGPUTriple = T;
+ AMDGPUTriple.setArch(Triple::amdgpu);
+ if (auto Path = getPathForTriple(AMDGPUTriple))
+ return *Path;
+
+ // Try legacy architecture name.
+ AMDGPUTriple.setArchName("amdgcn");
+ if (auto Path = getPathForTriple(AMDGPUTriple))
+ return *Path;
+ }
+
return {};
}
@@ -1484,7 +1499,8 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args, BoundArch BA,
return getTripleString().str();
case llvm::Triple::amdgpu: {
llvm::Triple Triple = getTriple();
- tools::AMDGPU::setArchNameInTriple(getDriver(), Args, InputType, Triple);
+ tools::AMDGPU::setArchNameInTriple(getDriver(), Args, BA, InputType,
+ Triple);
return Triple.getTriple();
}
case llvm::Triple::arm:
@@ -2110,6 +2126,12 @@ void ToolChain::TranslateXarchArgs(
static bool isXArchCompatibleTripleArch(const llvm::Triple &TT,
StringRef XArchVal) {
llvm::Triple ParsedTriple(XArchVal);
+
+ // Accept -Xarch_amdgcn for all amdgpu subarches, and -Xarch_amdgpu9 for
+ // amdgpu9.xx
+ if (TT.isAMDGCN() && ParsedTriple.isAMDGCN())
+ return llvm::AMDGPU::isSubArchCompatible(TT, ParsedTriple);
+
return TT.getArch() == ParsedTriple.getArch() &&
TT.getSubArch() == ParsedTriple.getSubArch();
}
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 325dba03c4136..217455ac209ab 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -951,6 +951,21 @@ AMDGPUToolChain::checkTargetID(const llvm::opt::ArgList &DriverArgs) const {
if (PTID.OptionalTargetID && !PTID.OptionalGPUArch) {
getDriver().Diag(clang::diag::err_drv_bad_target_id)
<< *PTID.OptionalTargetID;
+ return PTID;
+ }
+
+ if (getTriple().getSubArch() != llvm::Triple::NoSubArch &&
+ PTID.OptionalGPUArch) {
+ llvm::AMDGPU::GPUKind Kind =
+ llvm::AMDGPU::parseArchAMDGCN(*PTID.OptionalGPUArch);
+ llvm::Triple::SubArchType KindSubArch =
+ static_cast<llvm::Triple::SubArchType>(llvm::AMDGPU::getSubArch(Kind));
+ if (getTriple().getSubArch() != KindSubArch &&
+ getTriple().getSubArch() !=
+ llvm::AMDGPU::getMajorSubArch(KindSubArch)) {
+ getDriver().Diag(clang::diag::err_target_unsupported_arch)
+ << *PTID.OptionalGPUArch << getTriple().getArchName();
+ }
}
return PTID;
}
diff --git a/clang/lib/Driver/ToolChains/Arch/AMDGPU.cpp b/clang/lib/Driver/ToolChains/Arch/AMDGPU.cpp
index 266f9859ac88f..c3aebe952c87e 100644
--- a/clang/lib/Driver/ToolChains/Arch/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AMDGPU.cpp
@@ -7,8 +7,10 @@
//===----------------------------------------------------------------------===//
#include "AMDGPU.h"
+#include "clang/Basic/TargetID.h"
#include "clang/Driver/Driver.h"
#include "clang/Options/Options.h"
+#include "llvm/TargetParser/AMDGPUTargetParser.h"
using namespace clang::driver;
using namespace clang::driver::tools;
@@ -16,14 +18,27 @@ using namespace clang;
using namespace llvm::opt;
void AMDGPU::setArchNameInTriple(const Driver &D, const ArgList &Args,
- types::ID InputType, llvm::Triple &Triple) {
- StringRef MArch;
- AMDGPU::getAMDGPUArchCPUFromArgs(Triple, Args, MArch);
+ BoundArch BA, types::ID InputType,
+ llvm::Triple &Triple) {
+ StringRef MArch = BA.ArchName;
+ if (MArch.empty())
+ AMDGPU:...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/206482
More information about the llvm-branch-commits
mailing list