[clang] 52751a0 - [AMDGPU][SPIR-V] Fix treating SPIR-V input as the wrong LLVM-IR (#202986)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 12 07:59:25 PDT 2026
Author: Joseph Huber
Date: 2026-06-12T09:59:21-05:00
New Revision: 52751a0fda17f0dac1c441aee6617ab1b1434f4d
URL: https://github.com/llvm/llvm-project/commit/52751a0fda17f0dac1c441aee6617ab1b1434f4d
DIFF: https://github.com/llvm/llvm-project/commit/52751a0fda17f0dac1c441aee6617ab1b1434f4d.diff
LOG: [AMDGPU][SPIR-V] Fix treating SPIR-V input as the wrong LLVM-IR (#202986)
Summary:
This hack is intended for non-RDC AMDGCN.
Added:
Modified:
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Driver/hip-toolchain-no-rdc.hip
Removed:
################################################################################
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index b6bab8f58a160..04f9ddc568768 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5385,22 +5385,20 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-emit-llvm-uselists");
if (IsUsingLTO) {
+ const Arg *LTOArg = Args.getLastArg(options::OPT_foffload_lto,
+ options::OPT_foffload_lto_EQ);
if (IsDeviceOffloadAction && !JA.isDeviceOffloading(Action::OFK_OpenMP) &&
!Args.hasFlag(options::OPT_offload_new_driver,
options::OPT_no_offload_new_driver,
C.getActiveOffloadKinds() != Action::OFK_None) &&
- !Triple.isAMDGPU()) {
+ !Triple.isAMDGPU() && !Triple.isSPIRV()) {
D.Diag(diag::err_drv_unsupported_opt_for_target)
- << Args.getLastArg(options::OPT_foffload_lto,
- options::OPT_foffload_lto_EQ)
- ->getAsString(Args)
+ << (LTOArg ? LTOArg->getAsString(Args) : "-foffload-lto")
<< Triple.getTriple();
} else if (Triple.isNVPTX() && !IsRDCMode &&
JA.isDeviceOffloading(Action::OFK_Cuda)) {
D.Diag(diag::err_drv_unsupported_opt_for_language_mode)
- << Args.getLastArg(options::OPT_foffload_lto,
- options::OPT_foffload_lto_EQ)
- ->getAsString(Args)
+ << (LTOArg ? LTOArg->getAsString(Args) : "-foffload-lto")
<< "-fno-gpu-rdc";
} else {
assert(LTOMode == LTOK_Full || LTOMode == LTOK_Thin);
@@ -9576,6 +9574,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,
@@ -9639,10 +9638,13 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
for (Arg *A : ToolChainArgs) {
if (A->getOption().matches(OPT_Zlinker_input))
LinkerArgs.emplace_back(A->getValue());
- else if (ShouldForward(CompilerOptions, A, *TC))
+ else if (ShouldForward(CompilerOptions, A, *TC)) {
+ A->claim();
A->render(Args, CompilerArgs);
- else if (ShouldForward(LinkerOptions, A, *TC))
+ } else if (ShouldForward(LinkerOptions, A, *TC)) {
+ A->claim();
A->render(Args, LinkerArgs);
+ }
}
// If the user explicitly requested it via `--offload-arch` we should
@@ -9713,7 +9715,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
options::OPT_fprofile_instr_generate_EQ);
if (!Args.hasArg(options::OPT_foffload_lto_EQ,
options::OPT_fno_offload_lto) &&
- !UsesProfileGenerate)
+ !UsesProfileGenerate && !TC->getTriple().isSPIRV())
CmdArgs.push_back("--no-lto");
}
}
diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip b/clang/test/Driver/hip-toolchain-no-rdc.hip
index 591342df3839c..69bb3a47e38b3 100644
--- a/clang/test/Driver/hip-toolchain-no-rdc.hip
+++ b/clang/test/Driver/hip-toolchain-no-rdc.hip
@@ -36,17 +36,24 @@
// RUN: %t/a.o %t/b.o \
// RUN: 2>&1 | FileCheck -check-prefixes=LKONLY %s
-// FIXME: AMDGCNSPIRV + no-offload-new-driver crashes (separate bug).
-// UN: %clang -### --target=x86_64-linux-gnu --no-offload-new-driver \
-// UN: --offload-arch=amdgcnspirv --offload-arch=gfx900 \
-// UN: %s -nogpuinc -nogpulib -fno-lto \
-// UN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV %s
+// RUN: %clang -### --target=x86_64-linux-gnu --no-offload-new-driver \
+// RUN: --offload-arch=amdgcnspirv --offload-arch=gfx900 \
+// 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: %s -nogpuinc -nogpulib \
// RUN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV-NEW %s
+// SPIR-V requires the LTO pipeline; --no-lto must not be passed.
+// RUN: %clang -### --target=x86_64-linux-gnu -fno-gpu-rdc \
+// RUN: --offload-arch=amdgcnspirv -nogpuinc -nogpulib \
+// RUN: %s 2>&1 | FileCheck -check-prefixes=SPIRV-NO-LTO %s
+// SPIRV-NO-LTO: {{".*clang-linker-wrapper}}
+// SPIRV-NO-LTO-NOT: "--no-lto"
+// SPIRV-NO-LTO-SAME: "--emit-fatbin-only"
+
// Profile generation needs LTO, so the linker wrapper must not get --no-lto.
// RUN: %clang -### --target=x86_64-linux-gnu -fno-gpu-rdc -fprofile-generate \
// RUN: -x hip --cuda-gpu-arch=gfx900 -nogpuinc -nogpulib --offload-new-driver \
@@ -223,11 +230,11 @@
// Check mixed AMDGCNSPIRV and concrete GPU arch.
//
-// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" {{.*}}"-fembed-bitcode=marker" "-disable-llvm-passes" {{.*}} "-o" "[[AMDGCNSPV_BC:.*bc]]"
+// AMDGCNSPIRV: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-emit-llvm-bc" {{.*}}"-flto=full"{{.*}} "-fembed-bitcode=marker" "-disable-llvm-passes" {{.*}} "-o" "[[AMDGCNSPV_BC:.*bc]]"
// AMDGCNSPIRV: {{".*llvm-link.*"}} "-o" "[[AMDGCNSPV_TMP:.*bc]]" "[[AMDGCNSPV_BC]]"
// AMDGCNSPIRV: {{".*llvm-spirv.*"}} "--spirv-max-version=1.6" "--spirv-ext=+all" {{.*}} "[[AMDGCNSPV_TMP]]" {{.*}}"-o" "[[AMDGCNSPV_CO:.*out]]"
-// AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-obj" {{.*}}"-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_OBJ:.*o]]"
-// AMDGCNSPIRV: {{".*lld.*"}} {{.*}}"-plugin-opt=mcpu=gfx900" {{.*}} "-o" "[[GFX900_CO:.*out]]" {{.*}}"[[GFX900_OBJ]]"
+// AMDGCNSPIRV: "-cc1" "-triple" "amdgcn-amd-amdhsa" {{.*}}"-emit-llvm-bc" {{.*}}"-flto=full"{{.*}} "-target-cpu" "gfx900"{{.*}} "-o" "[[GFX900_BC:.*bc]]"
+// AMDGCNSPIRV: {{".*lld.*"}} {{.*}}"-plugin-opt=mcpu=gfx900" {{.*}} "-o" "[[GFX900_CO:.*out]]" {{.*}}"[[GFX900_BC]]"
// AMDGCNSPIRV: {{".*clang-offload-bundler.*"}} "-type=o"
// AMDGCNSPIRV-SAME: "-targets={{.*}}hip-spirv64-amd-amdhsa--amdgcnspirv,hip-amdgcn-amd-amdhsa--gfx900"
// AMDGCNSPIRV-SAME: "-input=[[AMDGCNSPV_CO]]" "-input=[[GFX900_CO]]"
More information about the cfe-commits
mailing list