https://github.com/MrSidims updated 
https://github.com/llvm/llvm-project/pull/198338

>From 5f8f879b841f35449b1cf0bb6dd0262903ed03af Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Sat, 16 May 2026 17:16:58 +0200
Subject: [PATCH 1/3] [HIP][SPIR-V] Enable SPIR-V backend by default

---
 clang/lib/Driver/Driver.cpp                | 24 +++++++++++++++-------
 clang/lib/Driver/ToolChains/Clang.cpp      |  1 +
 clang/lib/Driver/ToolChains/HIPAMD.cpp     |  9 +++++---
 clang/test/Driver/hip-phases.hip           |  3 ++-
 clang/test/Driver/hip-toolchain-no-rdc.hip |  4 ++--
 clang/test/Driver/spirv-amd-toolchain.c    |  4 +++-
 6 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index ed3ddd130d6c7..8b64141593238 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5096,9 +5096,14 @@ Driver::BuildOffloadingActions(Compilation &C, 
llvm::opt::DerivedArgList &Args,
           OffloadTriple && OffloadTriple->isSPIRV() &&
           (OffloadTriple->getOS() == llvm::Triple::OSType::AMDHSA ||
            OffloadTriple->getOS() == llvm::Triple::OSType::ChipStar);
-      bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
-                                          options::OPT_no_use_spirv_backend,
-                                          /*Default=*/false);
+      // Use SPIR-V backend by default for AMD HIP SPIR-V offload target.
+      bool DefaultUseSPIRVBackend =
+          OffloadTriple && OffloadTriple->isSPIRV() &&
+          OffloadTriple->getVendor() == llvm::Triple::AMD;
+      bool UseSPIRVBackend =
+          Args.hasFlag(options::OPT_use_spirv_backend,
+                       options::OPT_no_use_spirv_backend,
+                       /*Default=*/DefaultUseSPIRVBackend);
 
       // Special handling for the HIP SPIR-V toolchains in device-only.
       // The translator path has a linking step, whereas the SPIR-V backend 
path
@@ -5351,11 +5356,16 @@ Action *Driver::ConstructPhaseAction(
           Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
       return C.MakeAction<BackendJobAction>(Input, Output);
     }
-    bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
-                                        options::OPT_no_use_spirv_backend,
-                                        /*Default=*/false);
-
     auto OffloadingToolChain = Input->getOffloadingToolChain();
+    // Use SPIR-V backend by default for AMD HIP SPIR-V offload target.
+    bool DefaultUseSPIRVBackend =
+        OffloadingToolChain &&
+        OffloadingToolChain->getTriple().isSPIRV() &&
+        OffloadingToolChain->getTriple().getVendor() == llvm::Triple::AMD;
+    bool UseSPIRVBackend =
+        Args.hasFlag(options::OPT_use_spirv_backend,
+                     options::OPT_no_use_spirv_backend,
+                     /*Default=*/DefaultUseSPIRVBackend);
     // For AMD SPIRV, if offloadDeviceOnly(), we call the SPIRV backend unless
     // LLVM bitcode was requested explicitly or RDC is set. If
     // !offloadDeviceOnly, we emit LLVM bitcode, and clang-linker-wrapper will
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 92b3045dceff2..f0c8c60ae9d27 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -9490,6 +9490,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const 
JobAction &JA,
       OPT_flto_EQ,
       OPT_hipspv_pass_plugin_EQ,
       OPT_use_spirv_backend,
+      OPT_no_use_spirv_backend,
       OPT_fmultilib_flag,
       OPT_fprofile_generate,
       OPT_fprofile_generate_EQ,
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp 
b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index b7732c9274725..ef8ade1c1bdba 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -163,9 +163,12 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
   const char *LinkedBCFilePath = HIP::getTempFile(C, LinkedBCFilePrefix, "bc");
   InputInfo LinkedBCFile(&JA, LinkedBCFilePath, Output.getBaseInput());
 
-  bool UseSPIRVBackend =
-      Args.hasFlag(options::OPT_use_spirv_backend,
-                   options::OPT_no_use_spirv_backend, /*Default=*/false);
+  const llvm::Triple &TT = getToolChain().getEffectiveTriple();
+  bool DefaultUseSPIRVBackend =
+      TT.isSPIRV() && TT.getVendor() == llvm::Triple::AMD;
+  bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
+                                      options::OPT_no_use_spirv_backend,
+                                      /*Default=*/DefaultUseSPIRVBackend);
 
   constructLLVMLinkCommand(C, JA, Inputs, LinkedBCFile, Args);
 
diff --git a/clang/test/Driver/hip-phases.hip b/clang/test/Driver/hip-phases.hip
index be6423af1cd40..f672275502637 100644
--- a/clang/test/Driver/hip-phases.hip
+++ b/clang/test/Driver/hip-phases.hip
@@ -688,7 +688,8 @@
 // Test the new driver bundling SPIR-V targets.
 //
 // RUN: %clang -### --target=x86_64-linux-gnu --offload-new-driver 
-ccc-print-phases \
-// RUN:        --offload-device-only --offload-arch=amdgcnspirv,gfx1030 %s 
2>&1 \
+// RUN:        --offload-device-only -no-use-spirv-backend \
+// RUN:        --offload-arch=amdgcnspirv,gfx1030 %s 2>&1 \
 // RUN: | FileCheck -check-prefix=SPIRV-ONLY %s
 //      SPIRV-ONLY: 0: input, "[[INPUT:.+]]", hip, (device-hip, gfx1030)
 // SPIRV-ONLY-NEXT: 1: preprocessor, {0}, hip-cpp-output, (device-hip, gfx1030)
diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip 
b/clang/test/Driver/hip-toolchain-no-rdc.hip
index 975515bd0cb40..1b32f3e2eb88d 100644
--- a/clang/test/Driver/hip-toolchain-no-rdc.hip
+++ b/clang/test/Driver/hip-toolchain-no-rdc.hip
@@ -37,12 +37,12 @@
 // RUN: 2>&1 | FileCheck -check-prefixes=LKONLY %s
 
 // RUN: %clang -### --target=x86_64-linux-gnu --no-offload-new-driver \
-// RUN:   --offload-arch=amdgcnspirv --offload-arch=gfx900 \
+// RUN:   --offload-arch=amdgcnspirv --offload-arch=gfx900 
-no-use-spirv-backend \
 // RUN:   %s -nogpuinc -nogpulib \
 // RUN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV %s
 
 // RUN: %clang -### --target=x86_64-linux-gnu --offload-new-driver \
-// RUN:   --offload-arch=amdgcnspirv --offload-arch=gfx900 \
+// RUN:   --offload-arch=amdgcnspirv --offload-arch=gfx900 
-no-use-spirv-backend \
 // RUN:   %s -nogpuinc -nogpulib \
 // RUN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV-NEW %s
 
diff --git a/clang/test/Driver/spirv-amd-toolchain.c 
b/clang/test/Driver/spirv-amd-toolchain.c
index 4c7a673ef85fe..9420949d8361c 100644
--- a/clang/test/Driver/spirv-amd-toolchain.c
+++ b/clang/test/Driver/spirv-amd-toolchain.c
@@ -17,12 +17,14 @@
 // RUN: %clang -### -ccc-print-bindings -use-spirv-backend 
--target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=BINDINGS
 
-// RUN: %clang -### --target=spirv64-amd-amdhsa %s 2>&1 \
+// RUN: %clang -### -no-use-spirv-backend --target=spirv64-amd-amdhsa %s 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" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]"
 // INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" 
"--spirv-ext=+all,-SPV_KHR_untyped_pointers" "--spirv-allow-unknown-intrinsics" 
"--spirv-lower-const-expr" "--spirv-preserve-auxdata" 
"--spirv-debug-info-version=nonsemantic-shader-200" "[[LINKED_OUTPUT]]" "-o" 
"a.out"
 
+// RUN: %clang -### --target=spirv64-amd-amdhsa %s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=INVOCATION-SPIRV-BACKEND
 // RUN: %clang -### -use-spirv-backend --target=spirv64-amd-amdhsa %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=INVOCATION-SPIRV-BACKEND
 // INVOCATION-SPIRV-BACKEND: "-cc1" "-triple" "spirv64-amd-amdhsa" 
{{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c"

>From 5dff1e2b4293db2a5251f5f4d3ca1d93b77ef4f5 Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Tue, 19 May 2026 18:11:23 +0200
Subject: [PATCH 2/3] format

---
 clang/lib/Driver/Driver.cpp | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 8b64141593238..265a1c5133e33 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5100,10 +5100,9 @@ Driver::BuildOffloadingActions(Compilation &C, 
llvm::opt::DerivedArgList &Args,
       bool DefaultUseSPIRVBackend =
           OffloadTriple && OffloadTriple->isSPIRV() &&
           OffloadTriple->getVendor() == llvm::Triple::AMD;
-      bool UseSPIRVBackend =
-          Args.hasFlag(options::OPT_use_spirv_backend,
-                       options::OPT_no_use_spirv_backend,
-                       /*Default=*/DefaultUseSPIRVBackend);
+      bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
+                                          options::OPT_no_use_spirv_backend,
+                                          /*Default=*/DefaultUseSPIRVBackend);
 
       // Special handling for the HIP SPIR-V toolchains in device-only.
       // The translator path has a linking step, whereas the SPIR-V backend 
path
@@ -5359,13 +5358,11 @@ Action *Driver::ConstructPhaseAction(
     auto OffloadingToolChain = Input->getOffloadingToolChain();
     // Use SPIR-V backend by default for AMD HIP SPIR-V offload target.
     bool DefaultUseSPIRVBackend =
-        OffloadingToolChain &&
-        OffloadingToolChain->getTriple().isSPIRV() &&
+        OffloadingToolChain && OffloadingToolChain->getTriple().isSPIRV() &&
         OffloadingToolChain->getTriple().getVendor() == llvm::Triple::AMD;
-    bool UseSPIRVBackend =
-        Args.hasFlag(options::OPT_use_spirv_backend,
-                     options::OPT_no_use_spirv_backend,
-                     /*Default=*/DefaultUseSPIRVBackend);
+    bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
+                                        options::OPT_no_use_spirv_backend,
+                                        /*Default=*/DefaultUseSPIRVBackend);
     // For AMD SPIRV, if offloadDeviceOnly(), we call the SPIRV backend unless
     // LLVM bitcode was requested explicitly or RDC is set. If
     // !offloadDeviceOnly, we emit LLVM bitcode, and clang-linker-wrapper will

>From de6225318bcf20b8af8ef46be012829957707f5a Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <[email protected]>
Date: Tue, 19 May 2026 22:48:14 +0200
Subject: [PATCH 3/3] partually apply review request

---
 clang/lib/Driver/Driver.cpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 265a1c5133e33..90efda82fd165 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5096,13 +5096,13 @@ Driver::BuildOffloadingActions(Compilation &C, 
llvm::opt::DerivedArgList &Args,
           OffloadTriple && OffloadTriple->isSPIRV() &&
           (OffloadTriple->getOS() == llvm::Triple::OSType::AMDHSA ||
            OffloadTriple->getOS() == llvm::Triple::OSType::ChipStar);
-      // Use SPIR-V backend by default for AMD HIP SPIR-V offload target.
-      bool DefaultUseSPIRVBackend =
-          OffloadTriple && OffloadTriple->isSPIRV() &&
-          OffloadTriple->getVendor() == llvm::Triple::AMD;
       bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
                                           options::OPT_no_use_spirv_backend,
-                                          /*Default=*/DefaultUseSPIRVBackend);
+                                          /*Default=*/false);
+      if (OffloadTriple && OffloadTriple->isSPIRV() &&
+          OffloadTriple->getVendor() == llvm::Triple::AMD &&
+          !Args.hasArg(options::OPT_no_use_spirv_backend))
+        UseSPIRVBackend = true;
 
       // Special handling for the HIP SPIR-V toolchains in device-only.
       // The translator path has a linking step, whereas the SPIR-V backend 
path
@@ -5356,13 +5356,13 @@ Action *Driver::ConstructPhaseAction(
       return C.MakeAction<BackendJobAction>(Input, Output);
     }
     auto OffloadingToolChain = Input->getOffloadingToolChain();
-    // Use SPIR-V backend by default for AMD HIP SPIR-V offload target.
-    bool DefaultUseSPIRVBackend =
-        OffloadingToolChain && OffloadingToolChain->getTriple().isSPIRV() &&
-        OffloadingToolChain->getTriple().getVendor() == llvm::Triple::AMD;
     bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
                                         options::OPT_no_use_spirv_backend,
-                                        /*Default=*/DefaultUseSPIRVBackend);
+                                        /*Default=*/false);
+    if (OffloadingToolChain && OffloadingToolChain->getTriple().isSPIRV() &&
+        OffloadingToolChain->getTriple().getVendor() == llvm::Triple::AMD &&
+        !Args.hasArg(options::OPT_no_use_spirv_backend))
+      UseSPIRVBackend = true;
     // For AMD SPIRV, if offloadDeviceOnly(), we call the SPIRV backend unless
     // LLVM bitcode was requested explicitly or RDC is set. If
     // !offloadDeviceOnly, we emit LLVM bitcode, and clang-linker-wrapper will

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to