From 184949d3d2a3b6bf4c286755f65c370bac664f94 Mon Sep 17 00:00:00 2001 From: Martin Wehking Date: Tue, 1 Oct 2024 20:22:38 +0100 Subject: [PATCH] [SYCL][HIP] Add --only-needed flag to llvm-link for AMDGCN (#15558) Add the -only-needed flag for AMDGCN when linking against devicelib. Fixes several test cases that use kernel bundles. --- clang/lib/Driver/ToolChains/SYCL.cpp | 4 ++++ clang/test/Driver/sycl-device-lib-amdgcn.cpp | 7 +++++++ clang/test/Driver/sycl-device-lib-nvptx.cpp | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 7599c33e4c6bd..6938815da785d 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -579,6 +579,7 @@ const char *SYCL::Linker::constructLLVMLinkCommand( auto isSYCLDeviceLib = [&](const InputInfo &II) { const ToolChain *HostTC = C.getSingleOffloadToolChain(); const bool IsNVPTX = this->getToolChain().getTriple().isNVPTX(); + const bool IsAMDGCN = this->getToolChain().getTriple().isAMDGCN(); const bool IsFPGA = this->getToolChain().getTriple().isSPIR() && this->getToolChain().getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga; @@ -598,6 +599,9 @@ const char *SYCL::Linker::constructLLVMLinkCommand( // NativeCPU links against libclc (libspirv) if (IsSYCLNativeCPU && InputFilename.contains("libspirv")) return true; + // AMDGCN links against our libdevice (devicelib) + if (IsAMDGCN && InputFilename.starts_with("devicelib-")) + return true; // NVPTX links against our libclc (libspirv), our libdevice (devicelib), // and the CUDA libdevice if (IsNVPTX && (InputFilename.starts_with("devicelib-") || diff --git a/clang/test/Driver/sycl-device-lib-amdgcn.cpp b/clang/test/Driver/sycl-device-lib-amdgcn.cpp index 134e7835d11d7..f4ba914a09217 100644 --- a/clang/test/Driver/sycl-device-lib-amdgcn.cpp +++ b/clang/test/Driver/sycl-device-lib-amdgcn.cpp @@ -42,3 +42,10 @@ // CHK-ALL: [[DEVLIB:[0-9]+]]: input, "{{.*}}devicelib--amd.bc", ir, (device-sycl, gfx906) // CHK-ALL: {{[0-9]+}}: linker, {{{.*}}[[DEVLIB]]{{.*}}}, ir, (device-sycl, gfx906) +// Check that llvm-link uses the "-only-needed" flag. +// Not using the flag breaks kernel bundles. +// RUN: %clangxx -### -nogpulib --sysroot=%S/Inputs/SYCL \ +// RUN: -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx906 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-ONLY-NEEDED %s + +// CHK-ONLY-NEEDED: llvm-link"{{.*}}"-only-needed"{{.*}}"{{.*}}devicelib--amd.bc"{{.*}} diff --git a/clang/test/Driver/sycl-device-lib-nvptx.cpp b/clang/test/Driver/sycl-device-lib-nvptx.cpp index 78a6a7d2a9045..17edcc2051834 100644 --- a/clang/test/Driver/sycl-device-lib-nvptx.cpp +++ b/clang/test/Driver/sycl-device-lib-nvptx.cpp @@ -42,3 +42,9 @@ // CHK-ALL: [[DEVLIB:[0-9]+]]: input, "{{.*}}devicelib--cuda.bc", ir, (device-sycl, sm_50) // CHK-ALL: {{[0-9]+}}: linker, {{{.*}}[[DEVLIB]]{{.*}}}, ir, (device-sycl, sm_50) +// Check that llvm-link uses the "-only-needed" flag. +// Not using the flag breaks kernel bundles. +// RUN: %clangxx -### --sysroot=%S/Inputs/SYCL -fsycl -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK-ONLY-NEEDED %s + +// CHK-ONLY-NEEDED: llvm-link"{{.*}}"-only-needed"{{.*}}"{{.*}}devicelib--cuda.bc"{{.*}}