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
