Juan Manuel Martinez =?utf-8?q?Caamaño?= <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]>,Manuel Carrasco <[email protected]> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/[email protected]>
https://github.com/mgcarrasco updated https://github.com/llvm/llvm-project/pull/162282 >From 070d11c215c245ed518dd6605d3af34000be3e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?= <[email protected]> Date: Mon, 6 Oct 2025 16:38:29 +0200 Subject: [PATCH 01/13] [NFC][Driver][HIP] Expose getTempFile helper in HIPUtility.h --- clang/lib/Driver/ToolChains/HIPSPV.cpp | 15 ++------------- clang/lib/Driver/ToolChains/HIPUtility.cpp | 11 +++++++++++ clang/lib/Driver/ToolChains/HIPUtility.h | 2 ++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp index 62bca0493a09a..bce7f46dea468 100644 --- a/clang/lib/Driver/ToolChains/HIPSPV.cpp +++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp @@ -22,17 +22,6 @@ using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; -// Convenience function for creating temporary file for both modes of -// isSaveTempsEnabled(). -static const char *getTempFile(Compilation &C, StringRef Prefix, - StringRef Extension) { - if (C.getDriver().isSaveTempsEnabled()) { - return C.getArgs().MakeArgString(Prefix + "." + Extension); - } - auto TmpFile = C.getDriver().GetTemporaryPath(Prefix, Extension); - return C.addTempFile(C.getArgs().MakeArgString(TmpFile)); -} - // Locates HIP pass plugin. static std::string findPassPlugin(const Driver &D, const llvm::opt::ArgList &Args) { @@ -65,7 +54,7 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand( assert(!Inputs.empty() && "Must have at least one input."); std::string Name = std::string(llvm::sys::path::stem(Output.getFilename())); - const char *TempFile = getTempFile(C, Name + "-link", "bc"); + const char *TempFile = HIP::getTempFile(C, Name + "-link", "bc"); // Link LLVM bitcode. ArgStringList LinkArgs{}; @@ -93,7 +82,7 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand( auto PassPluginPath = findPassPlugin(C.getDriver(), Args); if (!PassPluginPath.empty()) { const char *PassPathCStr = C.getArgs().MakeArgString(PassPluginPath); - const char *OptOutput = getTempFile(C, Name + "-lower", "bc"); + const char *OptOutput = HIP::getTempFile(C, Name + "-lower", "bc"); ArgStringList OptArgs{TempFile, "-load-pass-plugin", PassPathCStr, "-passes=hip-post-link-passes", "-o", OptOutput}; diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp index cb061ffede234..732403e69a075 100644 --- a/clang/lib/Driver/ToolChains/HIPUtility.cpp +++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp @@ -472,3 +472,14 @@ void HIP::constructGenerateObjFileFromHIPFatBinary( D.getClangProgramPath(), ClangArgs, Inputs, Output, D.getPrependArg())); } + +// Convenience function for creating temporary file for both modes of +// isSaveTempsEnabled(). +const char *HIP::getTempFile(Compilation &C, StringRef Prefix, + StringRef Extension) { + if (C.getDriver().isSaveTempsEnabled()) { + return C.getArgs().MakeArgString(Prefix + "." + Extension); + } + auto TmpFile = C.getDriver().GetTemporaryPath(Prefix, Extension); + return C.addTempFile(C.getArgs().MakeArgString(TmpFile)); +} diff --git a/clang/lib/Driver/ToolChains/HIPUtility.h b/clang/lib/Driver/ToolChains/HIPUtility.h index 29e5a922024ab..55c155e5c35cf 100644 --- a/clang/lib/Driver/ToolChains/HIPUtility.h +++ b/clang/lib/Driver/ToolChains/HIPUtility.h @@ -16,6 +16,8 @@ namespace driver { namespace tools { namespace HIP { +const char *getTempFile(Compilation &C, StringRef Prefix, StringRef Extension); + // Construct command for creating HIP fatbin. void constructHIPFatbinCommand(Compilation &C, const JobAction &JA, StringRef OutputFileName, >From b74824812daffbe484c6e5381d2e614146ef9814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?= <[email protected]> Date: Mon, 6 Oct 2025 16:39:37 +0200 Subject: [PATCH 02/13] [HIP][SPIRV] Create an intermediate file for the llvm-link output Before this patch we had: clang -cc1 source.c -o bitcode.bc llvm-link -o a.out bitcode.bc llvm-spirv -o a.out a.out Now we have: clang -cc1 source.c -o bitcode.bc llvm-link -o a-linked.bc bitcode.bc llvm-spirv -o a.out a-linked.bc Co-authored-by: Manuel Carrasco <[email protected]> --- clang/lib/Driver/ToolChains/HIPAMD.cpp | 9 ++++++--- clang/test/Driver/hip-toolchain-no-rdc.hip | 2 +- clang/test/Driver/spirv-amd-toolchain.c | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 5f3fbea40f162..c0c8afec07264 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -168,9 +168,12 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( const InputInfo &Output, const llvm::opt::ArgList &Args) const { assert(!Inputs.empty() && "Must have at least one input."); - constructLlvmLinkCommand(C, JA, Inputs, Output, Args); + std::string LinkedBCFilePrefix( + Twine(llvm::sys::path::stem(Output.getFilename()), "-linked").str()); + const char *LinkedBCFilePath = HIP::getTempFile(C, LinkedBCFilePrefix, "bc"); + InputInfo LinkedBCFile(&JA, LinkedBCFilePath, Output.getBaseInput()); - // Linked BC is now in Output + constructLlvmLinkCommand(C, JA, Inputs, LinkedBCFile, Args); // Emit SPIR-V binary. llvm::opt::ArgStringList TrArgs{ @@ -180,7 +183,7 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( "--spirv-lower-const-expr", "--spirv-preserve-auxdata", "--spirv-debug-info-version=nonsemantic-shader-200"}; - SPIRV::constructTranslateCommand(C, *this, JA, Output, Output, TrArgs); + SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile, TrArgs); } // For amdgcn the inputs of the linker job are device bitcode and output is diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip b/clang/test/Driver/hip-toolchain-no-rdc.hip index dc8f0a97ad371..a9e7de9aa0040 100644 --- a/clang/test/Driver/hip-toolchain-no-rdc.hip +++ b/clang/test/Driver/hip-toolchain-no-rdc.hip @@ -207,7 +207,7 @@ // // AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" {{.*}}"-fembed-bitcode=marker" "-disable-llvm-passes" {{.*}} "-o" "[[AMDGCNSPV_BC:.*bc]]" -// AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*out]]" "[[AMDGCNSPV_BC]]" +// AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*bc]]" "[[AMDGCNSPV_BC]]" // AMDGCNSPIRV: {{".*llvm-spirv.*"}} "--spirv-max-version=1.6" "--spirv-ext=+all" {{.*}} "[[AMDGCNSPV_TMP]]" {{.*}}"-o" "[[AMDGCNSPV_CO:.*out]]" // AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-obj" {{.*}}"-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_OBJ:.*o]]" // AMDGCNSPIRV: {{".*lld.*"}} {{.*}}"-plugin-opt=mcpu=gfx900" {{.*}} "-o" "[[GFX900_CO:.*out]]" {{.*}}"[[GFX900_OBJ]]" diff --git a/clang/test/Driver/spirv-amd-toolchain.c b/clang/test/Driver/spirv-amd-toolchain.c index 14ba8f4632477..8f1f0f33e53f9 100644 --- a/clang/test/Driver/spirv-amd-toolchain.c +++ b/clang/test/Driver/spirv-amd-toolchain.c @@ -15,5 +15,5 @@ // RUN: %clang -### --target=spirv64-amd-amdhsa %s -nogpulib -nogpuinc 2>&1 \ // RUN: | FileCheck %s --check-prefix=INVOCATION // INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c" -// INVOCATION: "{{.*}}llvm-link" "-o" "a.out" "[[OUTPUT]]" -// INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" "--spirv-ext=+all" "--spirv-allow-unknown-intrinsics" "--spirv-lower-const-expr" "--spirv-preserve-auxdata" "--spirv-debug-info-version=nonsemantic-shader-200" "a.out" "-o" "a.out" +// INVOCATION: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]" +// INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" "--spirv-ext=+all" "--spirv-allow-unknown-intrinsics" "--spirv-lower-const-expr" "--spirv-preserve-auxdata" "--spirv-debug-info-version=nonsemantic-shader-200" "[[LINKED_OUTPUT]]" "-o" "a.out" >From dfddf9d71fdc7fd65cf3c89e430810e60c1a515e Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Tue, 7 Oct 2025 06:05:21 -0700 Subject: [PATCH 03/13] [HIP][SPIRV] Enable the SPIRV backend instead of the translator through an experimental flag. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Juan Manuel Martinez Caamaño <[email protected]> --- clang/include/clang/Driver/Options.td | 14 ++++++++ clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/HIPAMD.cpp | 35 +++++++++++++++----- clang/test/Driver/amdgpu-spirv-backend-opt.c | 12 +++++++ clang/test/Driver/hip-phases.hip | 2 +- 5 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 clang/test/Driver/amdgpu-spirv-backend-opt.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 9bfa1dd52effe..7844bd4cb7f49 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5462,6 +5462,20 @@ defm wavefrontsize64 : SimpleMFlag<"wavefrontsize64", defm amdgpu_precise_memory_op : SimpleMFlag<"amdgpu-precise-memory-op", "Enable", "Disable", " precise memory mode (AMDGPU only)">; +def amdgpu_use_experimental_spirv_backend + : Flag<["-"], "amdgpu-use-experimental-spirv-backend">, + Group<m_amdgpu_Features_Group>, + Flags<[HelpHidden]>, + Visibility<[ClangOption]>, + HelpText<"Use experimental SPIRV backend for AMDGPU compilation (AMDGPU " + "only)">; +def no_amdgpu_use_experimental_spirv_backend + : Flag<["-"], "no-amdgpu-use-experimental-spirv-backend">, + Group<m_amdgpu_Features_Group>, + Flags<[HelpHidden]>, + Visibility<[ClangOption]>, + HelpText<"Do not use experimental SPIRV backend for AMDGPU compilation " + "(AMDGPU only)">; def munsafe_fp_atomics : Flag<["-"], "munsafe-fp-atomics">, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, Alias<fatomic_ignore_denormal_mode>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 85a1335785542..f05956d3b0966 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -995,7 +995,7 @@ inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) { StringRef Triple; if (ID == OffloadArch::AMDGCNSPIRV) - Triple = "spirv64-amd-amdhsa"; + Triple = "spirv64v1.6-amd-amdhsa"; else if (IsNVIDIAOffloadArch(ID)) Triple = C.getDefaultToolChain().getTriple().isArch64Bit() ? "nvptx64-nvidia-cuda" diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index c0c8afec07264..9305f831609f0 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -175,15 +175,32 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( constructLlvmLinkCommand(C, JA, Inputs, LinkedBCFile, Args); - // Emit SPIR-V binary. - llvm::opt::ArgStringList TrArgs{ - "--spirv-max-version=1.6", - "--spirv-ext=+all", - "--spirv-allow-unknown-intrinsics", - "--spirv-lower-const-expr", - "--spirv-preserve-auxdata", - "--spirv-debug-info-version=nonsemantic-shader-200"}; - SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile, TrArgs); + bool UseSPIRVBackend = Args.hasFlag( + options::OPT_amdgpu_use_experimental_spirv_backend, + options::OPT_no_amdgpu_use_experimental_spirv_backend, false); + + if (UseSPIRVBackend) { + llvm::opt::ArgStringList CmdArgs; + CmdArgs.push_back(LinkedBCFile.getFilename()); + CmdArgs.append({"-o", Output.getFilename()}); + const char *Exec = + C.getArgs().MakeArgString(getToolChain().GetProgramPath("llc")); + CmdArgs.push_back("-mtriple=spirv64v1.6-amd-amdhsa"); + C.addCommand(std::make_unique<Command>(JA, *this, + ResponseFileSupport::None(), Exec, + CmdArgs, LinkedBCFile, Output)); + } else { + // Emit SPIR-V binary. + llvm::opt::ArgStringList TrArgs{ + "--spirv-max-version=1.6", + "--spirv-ext=+all", + "--spirv-allow-unknown-intrinsics", + "--spirv-lower-const-expr", + "--spirv-preserve-auxdata", + "--spirv-debug-info-version=nonsemantic-shader-200"}; + SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile, + TrArgs); + } } // For amdgcn the inputs of the linker job are device bitcode and output is diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c new file mode 100644 index 0000000000000..6ea1b9f82a1eb --- /dev/null +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -0,0 +1,12 @@ +// COM: This test case validates the behavior of -amdgpu-use-experimental-spirv-backend + +// COM: Test that -amdgpu-use-experimental-spirv-backend calls llc with the SPIRV triple. +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND +// CHECK-SPIRV-BACKEND: "{{.*}}llc{{.*}}" "{{-mtriple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" + +// COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator +// COM: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR +// CHECK-SPIRV-TRANSLATOR: "{{.*llvm-spirv.*}}" "{{--spirv-max-version=[0-9]+\.[0-9]}}" + +// COM: Test that by default we use the translator +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR \ No newline at end of file diff --git a/clang/test/Driver/hip-phases.hip b/clang/test/Driver/hip-phases.hip index 6bac97ab8064b..f50a7fb1a2a86 100644 --- a/clang/test/Driver/hip-phases.hip +++ b/clang/test/Driver/hip-phases.hip @@ -700,6 +700,6 @@ // SPIRV-ONLY-NEXT: 9: compiler, {8}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 10: backend, {9}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 11: linker, {10}, image, (device-hip, amdgcnspirv) -// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64-amd-amdhsa:amdgcnspirv)" {11}, image +// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64v{{[0-9]+\.[0-9]+}}-amd-amdhsa:amdgcnspirv)" {11}, image // SPIRV-ONLY-NEXT: 13: linker, {6, 12}, hip-fatbin, (device-hip) // SPIRV-ONLY-NEXT: 14: offload, "device-hip (amdgcn-amd-amdhsa)" {13}, none >From 2206cc4cb2dfe9304799cb93abbab3781890bd1a Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Tue, 7 Oct 2025 07:58:45 -0700 Subject: [PATCH 04/13] Fix whitespaces. --- clang/test/Driver/amdgpu-spirv-backend-opt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index 6ea1b9f82a1eb..d866ce910b70d 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -1,12 +1,12 @@ // COM: This test case validates the behavior of -amdgpu-use-experimental-spirv-backend // COM: Test that -amdgpu-use-experimental-spirv-backend calls llc with the SPIRV triple. -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND // CHECK-SPIRV-BACKEND: "{{.*}}llc{{.*}}" "{{-mtriple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" // COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator -// COM: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR +// COM: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR // CHECK-SPIRV-TRANSLATOR: "{{.*llvm-spirv.*}}" "{{--spirv-max-version=[0-9]+\.[0-9]}}" // COM: Test that by default we use the translator -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR \ No newline at end of file +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR \ No newline at end of file >From bcc25b76394342221d1aa32ab7c19d7b2ec7d5b4 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Tue, 7 Oct 2025 09:26:54 -0700 Subject: [PATCH 05/13] Fix typo. --- clang/test/Driver/amdgpu-spirv-backend-opt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index d866ce910b70d..489b5c817022a 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -5,7 +5,7 @@ // CHECK-SPIRV-BACKEND: "{{.*}}llc{{.*}}" "{{-mtriple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" // COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator -// COM: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR // CHECK-SPIRV-TRANSLATOR: "{{.*llvm-spirv.*}}" "{{--spirv-max-version=[0-9]+\.[0-9]}}" // COM: Test that by default we use the translator >From f8b90cf4476bc0397a5df38a2c0ee266cc66273d Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 01:45:14 -0700 Subject: [PATCH 06/13] Document better method call's arguments. --- clang/lib/Driver/ToolChains/HIPAMD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 9305f831609f0..b2db417f707d9 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -177,7 +177,7 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( bool UseSPIRVBackend = Args.hasFlag( options::OPT_amdgpu_use_experimental_spirv_backend, - options::OPT_no_amdgpu_use_experimental_spirv_backend, false); + options::OPT_no_amdgpu_use_experimental_spirv_backend, /*Default=*/false); if (UseSPIRVBackend) { llvm::opt::ArgStringList CmdArgs; >From 349d537ac4eb20e3c93d779c797c11b3df06da7c Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 01:46:24 -0700 Subject: [PATCH 07/13] Add empty line at EOF. --- clang/test/Driver/amdgpu-spirv-backend-opt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index 489b5c817022a..105f8e5928f7d 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -9,4 +9,4 @@ // CHECK-SPIRV-TRANSLATOR: "{{.*llvm-spirv.*}}" "{{--spirv-max-version=[0-9]+\.[0-9]}}" // COM: Test that by default we use the translator -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR \ No newline at end of file +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR >From b4d42486bd9a4cf79a0845fe411bf66d2bf64ee4 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 01:56:13 -0700 Subject: [PATCH 08/13] Check the explicit SPIRV version. --- clang/test/Driver/hip-phases.hip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/hip-phases.hip b/clang/test/Driver/hip-phases.hip index f50a7fb1a2a86..c3b0978fe378f 100644 --- a/clang/test/Driver/hip-phases.hip +++ b/clang/test/Driver/hip-phases.hip @@ -700,6 +700,6 @@ // SPIRV-ONLY-NEXT: 9: compiler, {8}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 10: backend, {9}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 11: linker, {10}, image, (device-hip, amdgcnspirv) -// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64v{{[0-9]+\.[0-9]+}}-amd-amdhsa:amdgcnspirv)" {11}, image +// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64v1.6-amd-amdhsa:amdgcnspirv)" {11}, image // SPIRV-ONLY-NEXT: 13: linker, {6, 12}, hip-fatbin, (device-hip) // SPIRV-ONLY-NEXT: 14: offload, "device-hip (amdgcn-amd-amdhsa)" {13}, none >From 8cd4f1ff1fa17522d2595acb54c03265fa79f483 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 03:20:48 -0700 Subject: [PATCH 09/13] Refactor triple handling. --- clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/HIPAMD.cpp | 4 +++- clang/lib/Driver/ToolChains/HIPAMD.h | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f05956d3b0966..d6dd053634ee8 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -995,7 +995,7 @@ inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) { StringRef Triple; if (ID == OffloadArch::AMDGCNSPIRV) - Triple = "spirv64v1.6-amd-amdhsa"; + Triple = tools::AMDGCN::Linker::getSpirvBackendTriple(); else if (IsNVIDIAOffloadArch(ID)) Triple = C.getDefaultToolChain().getTriple().isArch64Bit() ? "nvptx64-nvidia-cuda" diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index b2db417f707d9..082cfbb8680dc 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -185,7 +185,9 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( CmdArgs.append({"-o", Output.getFilename()}); const char *Exec = C.getArgs().MakeArgString(getToolChain().GetProgramPath("llc")); - CmdArgs.push_back("-mtriple=spirv64v1.6-amd-amdhsa"); + const char *Triple = + C.getArgs().MakeArgString("-mtriple=" + getSpirvBackendTriple()); + CmdArgs.push_back(Triple); C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, LinkedBCFile, Output)); diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index 30fc01a2f8e40..778c20f83a688 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -13,6 +13,7 @@ #include "clang/Driver/SyclInstallationDetector.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" +#include "llvm/ADT/StringRef.h" namespace clang { namespace driver { @@ -33,6 +34,10 @@ class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; + static constexpr StringRef getSpirvBackendTriple() { + return "spirv64v1.6-amd-amdhsa"; + } + private: void constructLldCommand(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const InputInfo &Output, >From 3906dbc4f2c4039c263dad2813240c8d88e58514 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 03:30:54 -0700 Subject: [PATCH 10/13] Attempt to fix test case failure in CI. --- clang/test/Driver/amdgpu-spirv-backend-opt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index 105f8e5928f7d..d9b0c7b7a2808 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -1,12 +1,12 @@ // COM: This test case validates the behavior of -amdgpu-use-experimental-spirv-backend // COM: Test that -amdgpu-use-experimental-spirv-backend calls llc with the SPIRV triple. -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND // CHECK-SPIRV-BACKEND: "{{.*}}llc{{.*}}" "{{-mtriple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" // COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR // CHECK-SPIRV-TRANSLATOR: "{{.*llvm-spirv.*}}" "{{--spirv-max-version=[0-9]+\.[0-9]}}" // COM: Test that by default we use the translator -// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR >From 4a063b8f612efb7a15bcd8f8f0102456af2d377a Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 07:59:40 -0700 Subject: [PATCH 11/13] Replace llc with clang -cc1 for invoking the SPIRV backend. --- clang/lib/Driver/ToolChains/HIPAMD.cpp | 13 ++++++------- clang/test/Driver/amdgpu-spirv-backend-opt.c | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 082cfbb8680dc..58de903a5182e 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -179,20 +179,19 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( options::OPT_amdgpu_use_experimental_spirv_backend, options::OPT_no_amdgpu_use_experimental_spirv_backend, /*Default=*/false); + // Emit SPIR-V binary either using the SPIRV backend or the translator. if (UseSPIRVBackend) { llvm::opt::ArgStringList CmdArgs; - CmdArgs.push_back(LinkedBCFile.getFilename()); - CmdArgs.append({"-o", Output.getFilename()}); - const char *Exec = - C.getArgs().MakeArgString(getToolChain().GetProgramPath("llc")); const char *Triple = - C.getArgs().MakeArgString("-mtriple=" + getSpirvBackendTriple()); - CmdArgs.push_back(Triple); + C.getArgs().MakeArgString("-triple=" + getSpirvBackendTriple()); + CmdArgs.append({"-cc1", Triple, "-emit-obj", LinkedBCFile.getFilename(), + "-o", Output.getFilename()}); + const char *Exec = getToolChain().getDriver().getClangProgramPath(); C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, LinkedBCFile, Output)); } else { - // Emit SPIR-V binary. + // Use the SPIRV translator for code gen. llvm::opt::ArgStringList TrArgs{ "--spirv-max-version=1.6", "--spirv-ext=+all", diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index d9b0c7b7a2808..956ae20e149ad 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -1,8 +1,8 @@ // COM: This test case validates the behavior of -amdgpu-use-experimental-spirv-backend -// COM: Test that -amdgpu-use-experimental-spirv-backend calls llc with the SPIRV triple. +// COM: Test that -amdgpu-use-experimental-spirv-backend calls clang -cc1 with the SPIRV triple. // RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND -// CHECK-SPIRV-BACKEND: "{{.*}}llc{{.*}}" "{{-mtriple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" +// CHECK-SPIRV-BACKEND: "{{.*}}clang{{.*}}" "-cc1" "{{.*-triple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" // COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator // RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR >From 479c4d92f749014764a7005dde6e2211da0addb1 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 09:17:18 -0700 Subject: [PATCH 12/13] Revert changes in triple. --- clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/HIPAMD.cpp | 2 +- clang/lib/Driver/ToolChains/HIPAMD.h | 4 ---- clang/test/Driver/amdgpu-spirv-backend-opt.c | 2 +- clang/test/Driver/hip-phases.hip | 2 +- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index d6dd053634ee8..85a1335785542 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -995,7 +995,7 @@ inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) { StringRef Triple; if (ID == OffloadArch::AMDGCNSPIRV) - Triple = tools::AMDGCN::Linker::getSpirvBackendTriple(); + Triple = "spirv64-amd-amdhsa"; else if (IsNVIDIAOffloadArch(ID)) Triple = C.getDefaultToolChain().getTriple().isArch64Bit() ? "nvptx64-nvidia-cuda" diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 58de903a5182e..aeccf381c7a63 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -183,7 +183,7 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( if (UseSPIRVBackend) { llvm::opt::ArgStringList CmdArgs; const char *Triple = - C.getArgs().MakeArgString("-triple=" + getSpirvBackendTriple()); + C.getArgs().MakeArgString("-triple=spirv64-amd-amdhsa"); CmdArgs.append({"-cc1", Triple, "-emit-obj", LinkedBCFile.getFilename(), "-o", Output.getFilename()}); const char *Exec = getToolChain().getDriver().getClangProgramPath(); diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index 778c20f83a688..a4ac464b2ef50 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -34,10 +34,6 @@ class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; - static constexpr StringRef getSpirvBackendTriple() { - return "spirv64v1.6-amd-amdhsa"; - } - private: void constructLldCommand(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const InputInfo &Output, diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c index 956ae20e149ad..0435ad9dad6d1 100644 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ b/clang/test/Driver/amdgpu-spirv-backend-opt.c @@ -2,7 +2,7 @@ // COM: Test that -amdgpu-use-experimental-spirv-backend calls clang -cc1 with the SPIRV triple. // RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND -// CHECK-SPIRV-BACKEND: "{{.*}}clang{{.*}}" "-cc1" "{{.*-triple=spirv64v[0-9]+\.[0-9]+-amd-amdhsa}}" +// CHECK-SPIRV-BACKEND: "{{.*}}clang{{.*}}" "-cc1" "{{.*-triple=spirv64-amd-amdhsa}}" // COM: Test that -no-amdgpu-use-experimental-spirv-backend calls the SPIRV translator // RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-amdgpu-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR diff --git a/clang/test/Driver/hip-phases.hip b/clang/test/Driver/hip-phases.hip index c3b0978fe378f..6bac97ab8064b 100644 --- a/clang/test/Driver/hip-phases.hip +++ b/clang/test/Driver/hip-phases.hip @@ -700,6 +700,6 @@ // SPIRV-ONLY-NEXT: 9: compiler, {8}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 10: backend, {9}, ir, (device-hip, amdgcnspirv) // SPIRV-ONLY-NEXT: 11: linker, {10}, image, (device-hip, amdgcnspirv) -// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64v1.6-amd-amdhsa:amdgcnspirv)" {11}, image +// SPIRV-ONLY-NEXT: 12: offload, "device-hip (spirv64-amd-amdhsa:amdgcnspirv)" {11}, image // SPIRV-ONLY-NEXT: 13: linker, {6, 12}, hip-fatbin, (device-hip) // SPIRV-ONLY-NEXT: 14: offload, "device-hip (amdgcn-amd-amdhsa)" {13}, none >From f65ed810ae70fe25953051eeda9bddc898df7ac5 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <[email protected]> Date: Wed, 8 Oct 2025 09:21:29 -0700 Subject: [PATCH 13/13] Remove no longer needed include. --- clang/lib/Driver/ToolChains/HIPAMD.h | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index a4ac464b2ef50..30fc01a2f8e40 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -13,7 +13,6 @@ #include "clang/Driver/SyclInstallationDetector.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" -#include "llvm/ADT/StringRef.h" namespace clang { namespace driver { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
