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

Reply via email to