From 3e70551af1f55b710bf91a5981e15e21f5b9476c Mon Sep 17 00:00:00 2001 From: Martin Wehking Date: Mon, 30 Sep 2024 17:37:59 +0100 Subject: [PATCH 1/4] Add --only-needed flag to llvm-link for AMDGCN 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 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 7599c33e4c6bd..57387910d04bf 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,8 @@ const char *SYCL::Linker::constructLLVMLinkCommand( // NativeCPU links against libclc (libspirv) if (IsSYCLNativeCPU && InputFilename.contains("libspirv")) return true; + 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-") || From 9f0aa304d92227ce3696cd44008339a3f5707bfd Mon Sep 17 00:00:00 2001 From: Martin Wehking Date: Mon, 30 Sep 2024 17:50:20 +0100 Subject: [PATCH 2/4] Add comment --- clang/lib/Driver/ToolChains/SYCL.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 57387910d04bf..6938815da785d 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -599,6 +599,7 @@ 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), From 01a7cec51b36eccde269af58cea1cce556ddf2b9 Mon Sep 17 00:00:00 2001 From: Martin Wehking Date: Tue, 1 Oct 2024 11:42:04 +0100 Subject: [PATCH 3/4] Add check for -only-needed flag --- clang/test/Driver/sycl-device-lib-amdgcn.cpp | 7 +++++++ clang/test/Driver/sycl-device-lib-nvptx.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/clang/test/Driver/sycl-device-lib-amdgcn.cpp b/clang/test/Driver/sycl-device-lib-amdgcn.cpp index 134e7835d11d7..bf40785a35d9c 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 -### -std=c++11 -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..6057dcd471c9c 100644 --- a/clang/test/Driver/sycl-device-lib-nvptx.cpp +++ b/clang/test/Driver/sycl-device-lib-nvptx.cpp @@ -42,3 +42,10 @@ // 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 -### -std=c++11 --sysroot=%S/Inputs/SYCL \ +// RUN: -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"{{.*}} From 29c4d432633a1b12ad0f3d526d42b7a3135e48e3 Mon Sep 17 00:00:00 2001 From: Martin Wehking Date: Tue, 1 Oct 2024 19:47:57 +0100 Subject: [PATCH 4/4] Remove superfluous flag --- clang/test/Driver/sycl-device-lib-amdgcn.cpp | 2 +- clang/test/Driver/sycl-device-lib-nvptx.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/test/Driver/sycl-device-lib-amdgcn.cpp b/clang/test/Driver/sycl-device-lib-amdgcn.cpp index bf40785a35d9c..f4ba914a09217 100644 --- a/clang/test/Driver/sycl-device-lib-amdgcn.cpp +++ b/clang/test/Driver/sycl-device-lib-amdgcn.cpp @@ -44,7 +44,7 @@ // Check that llvm-link uses the "-only-needed" flag. // Not using the flag breaks kernel bundles. -// RUN: %clangxx -### -std=c++11 -nogpulib --sysroot=%S/Inputs/SYCL \ +// 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 diff --git a/clang/test/Driver/sycl-device-lib-nvptx.cpp b/clang/test/Driver/sycl-device-lib-nvptx.cpp index 6057dcd471c9c..17edcc2051834 100644 --- a/clang/test/Driver/sycl-device-lib-nvptx.cpp +++ b/clang/test/Driver/sycl-device-lib-nvptx.cpp @@ -44,8 +44,7 @@ // Check that llvm-link uses the "-only-needed" flag. // Not using the flag breaks kernel bundles. -// RUN: %clangxx -### -std=c++11 --sysroot=%S/Inputs/SYCL \ -// RUN: -fsycl -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ +// 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"{{.*}}