https://github.com/mgcarrasco updated https://github.com/llvm/llvm-project/pull/162282
>From e89ce89521602f651495cf936e016d8f0c926974 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <manuel.carra...@amd.com> Date: Tue, 7 Oct 2025 06:05:21 -0700 Subject: [PATCH 1/2] [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 <juama...@amd.com> --- clang/include/clang/Driver/Options.td | 14 ++++++++ clang/lib/Driver/ToolChains/HIPAMD.cpp | 36 +++++++++++++++----- clang/test/Driver/amdgpu-spirv-backend-opt.c | 12 +++++++ 3 files changed, 53 insertions(+), 9 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 ec38231f906eb..37dbb820ce22f 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5483,6 +5483,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/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index c0c8afec07264..aeccf381c7a63 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -175,15 +175,33 @@ 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, /*Default=*/false); + + // Emit SPIR-V binary either using the SPIRV backend or the translator. + if (UseSPIRVBackend) { + llvm::opt::ArgStringList CmdArgs; + const char *Triple = + C.getArgs().MakeArgString("-triple=spirv64-amd-amdhsa"); + 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 { + // Use the SPIRV translator for code gen. + 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..0435ad9dad6d1 --- /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 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=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 +// 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 -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR >From 8d56d95ebc8f5ce620b08eb7af516a645364af9c Mon Sep 17 00:00:00 2001 From: Manuel Carrasco <manuel.carra...@amd.com> Date: Fri, 10 Oct 2025 01:49:49 -0700 Subject: [PATCH 2/2] Switch to hip prefix for new flags. --- clang/include/clang/Driver/Options.td | 26 +++++++++----------- clang/lib/Driver/ToolChains/HIPAMD.cpp | 4 +-- clang/test/Driver/amdgpu-spirv-backend-opt.c | 12 --------- clang/test/Driver/hip-spirv-backend-opt.c | 12 +++++++++ 4 files changed, 26 insertions(+), 28 deletions(-) delete mode 100644 clang/test/Driver/amdgpu-spirv-backend-opt.c create mode 100644 clang/test/Driver/hip-spirv-backend-opt.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 37dbb820ce22f..7da478e5e71d6 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1421,6 +1421,18 @@ def fhip_emit_relocatable : Flag<["-"], "fhip-emit-relocatable">, HelpText<"Compile HIP source to relocatable">; def fno_hip_emit_relocatable : Flag<["-"], "fno-hip-emit-relocatable">, HelpText<"Do not override toolchain to compile HIP source to relocatable">; +def hip_use_experimental_spirv_backend + : Flag<["-"], "hip-use-experimental-spirv-backend">, + Group<hip_Group>, + Flags<[HelpHidden]>, + HelpText<"Use experimental SPIRV backend for HIP compilation (HIP " + "only)">; +def no_hip_use_experimental_spirv_backend + : Flag<["-"], "no-hip-use-experimental-spirv-backend">, + Group<hip_Group>, + Flags<[HelpHidden]>, + HelpText<"Do not use experimental SPIRV backend for HIP compilation " + "(HIP only)">; } // Clang specific/exclusive options for OpenACC. @@ -5483,20 +5495,6 @@ 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/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index aeccf381c7a63..1b8a9af197ff7 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -176,8 +176,8 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand( constructLlvmLinkCommand(C, JA, Inputs, LinkedBCFile, Args); bool UseSPIRVBackend = Args.hasFlag( - options::OPT_amdgpu_use_experimental_spirv_backend, - options::OPT_no_amdgpu_use_experimental_spirv_backend, /*Default=*/false); + options::OPT_hip_use_experimental_spirv_backend, + options::OPT_no_hip_use_experimental_spirv_backend, /*Default=*/false); // Emit SPIR-V binary either using the SPIRV backend or the translator. if (UseSPIRVBackend) { diff --git a/clang/test/Driver/amdgpu-spirv-backend-opt.c b/clang/test/Driver/amdgpu-spirv-backend-opt.c deleted file mode 100644 index 0435ad9dad6d1..0000000000000 --- a/clang/test/Driver/amdgpu-spirv-backend-opt.c +++ /dev/null @@ -1,12 +0,0 @@ -// COM: This test case validates the behavior of -amdgpu-use-experimental-spirv-backend - -// 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=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 -// 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 -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR diff --git a/clang/test/Driver/hip-spirv-backend-opt.c b/clang/test/Driver/hip-spirv-backend-opt.c new file mode 100644 index 0000000000000..7fe9819514066 --- /dev/null +++ b/clang/test/Driver/hip-spirv-backend-opt.c @@ -0,0 +1,12 @@ +// COM: This test case validates the behavior of -hip-use-experimental-spirv-backend + +// COM: Test that -hip-use-experimental-spirv-backend calls clang -cc1 with the SPIRV triple. +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -hip-use-experimental-spirv-backend -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-BACKEND +// CHECK-SPIRV-BACKEND: "{{.*}}clang{{.*}}" "-cc1" "{{.*-triple=spirv64-amd-amdhsa}}" + +// COM: Test that -no-hip-use-experimental-spirv-backend calls the SPIRV translator +// RUN: %clang -x hip %s --cuda-device-only --offload-arch=amdgcnspirv -no-hip-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 -nogpuinc -nogpulib -### 2>&1 | FileCheck %s --check-prefix=CHECK-SPIRV-TRANSLATOR _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits