[clang] [HIP][SPIR-V] Enable SPIR-V backend by default (PR #198338)
Dmitry Sidorov via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 15 06:20:23 PDT 2026
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 <Dmitry.Sidorov at amd.com>
Date: Sat, 16 May 2026 17:16:58 +0200
Subject: [PATCH 1/6] [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 <Dmitry.Sidorov at amd.com>
Date: Tue, 19 May 2026 18:11:23 +0200
Subject: [PATCH 2/6] 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 <Dmitry.Sidorov at amd.com>
Date: Tue, 19 May 2026 22:48:14 +0200
Subject: [PATCH 3/6] 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
>From 134455344a923f6aaf3fa2bf5177dcaa573c2871 Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <Dmitry.Sidorov at amd.com>
Date: Wed, 20 May 2026 15:55:59 +0200
Subject: [PATCH 4/6] drop triple check for amd hip
---
clang/lib/Driver/ToolChains/HIPAMD.cpp | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index ef8ade1c1bdba..204afee8af1f0 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -163,12 +163,9 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
const char *LinkedBCFilePath = HIP::getTempFile(C, LinkedBCFilePrefix, "bc");
InputInfo LinkedBCFile(&JA, LinkedBCFilePath, Output.getBaseInput());
- 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);
+ /*Default=*/true);
constructLLVMLinkCommand(C, JA, Inputs, LinkedBCFile, Args);
>From f81ad1abdbb4515262749ff0db834ec289cd2bcc Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <Dmitry.Sidorov at amd.com>
Date: Thu, 21 May 2026 18:39:55 +0200
Subject: [PATCH 5/6] finish applying
---
clang/lib/Driver/Driver.cpp | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 90efda82fd165..3c6ee06d4613e 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5098,11 +5098,7 @@ Driver::BuildOffloadingActions(Compilation &C, llvm::opt::DerivedArgList &Args,
OffloadTriple->getOS() == llvm::Triple::OSType::ChipStar);
bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
options::OPT_no_use_spirv_backend,
- /*Default=*/false);
- if (OffloadTriple && OffloadTriple->isSPIRV() &&
- OffloadTriple->getVendor() == llvm::Triple::AMD &&
- !Args.hasArg(options::OPT_no_use_spirv_backend))
- UseSPIRVBackend = true;
+ /*Default=*/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
@@ -5358,11 +5354,7 @@ Action *Driver::ConstructPhaseAction(
auto OffloadingToolChain = Input->getOffloadingToolChain();
bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
options::OPT_no_use_spirv_backend,
- /*Default=*/false);
- if (OffloadingToolChain && OffloadingToolChain->getTriple().isSPIRV() &&
- OffloadingToolChain->getTriple().getVendor() == llvm::Triple::AMD &&
- !Args.hasArg(options::OPT_no_use_spirv_backend))
- UseSPIRVBackend = true;
+ /*Default=*/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
>From 3e3203583696936d0756d1b50dd5c4f87fdc8136 Mon Sep 17 00:00:00 2001
From: Dmitry Sidorov <Dmitry.Sidorov at amd.com>
Date: Thu, 21 May 2026 18:42:40 +0200
Subject: [PATCH 6/6] revert redundant change
---
clang/lib/Driver/Driver.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index c0373cba50bed..ea56a5224f75f 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -5359,10 +5359,11 @@ Action *Driver::ConstructPhaseAction(
Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
return C.MakeAction<BackendJobAction>(Input, Output);
}
- auto OffloadingToolChain = Input->getOffloadingToolChain();
bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
options::OPT_no_use_spirv_backend,
/*Default=*/true);
+
+ auto OffloadingToolChain = Input->getOffloadingToolChain();
// 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
More information about the cfe-commits
mailing list