From cfee27a3e0ae904f1bcbebf7b2feba69028ad12f Mon Sep 17 00:00:00 2001 From: Gergely Meszaros Date: Tue, 24 Jun 2025 04:43:01 -0700 Subject: [PATCH 1/2] [SYCL][Driver] Improve SYCL libspirv linking test coverage (NFC) In the next commits I'd like to refactor and fix SYCL libspirv linking. This adds a few tests to cover the current behavior. Some of it is buggy, and not consistent between NVPTX and AMDGPU, it will be improved in the next commits. --- .../resource_dir/.gitkeep} | 0 ...signed_char.libspirv-amdgcn-amd-amdhsa.bc} | 0 ...igned_char.libspirv-nvptx64-nvidia-cuda.bc | 0 ...-signed_char.libspirv-amdgcn-amd-amdhsa.bc | 0 ...igned_char.libspirv-nvptx64-nvidia-cuda.bc | 0 clang/test/Driver/cuda-nvptx-target.cpp | 7 --- clang/test/Driver/sycl-libspirv-toolchain.cpp | 43 +++++++++++++++++++ clang/test/Driver/sycl-offload-nvptx.cpp | 8 ++-- 8 files changed, 47 insertions(+), 11 deletions(-) rename clang/test/Driver/Inputs/SYCL/lib/{nvidiacl/remangled-l32-signed_char.libspirv-nvptx64--nvidiacl.bc => clang/resource_dir/.gitkeep} (100%) rename clang/test/Driver/Inputs/SYCL/{lib/nvidiacl/remangled-l64-signed_char.libspirv-nvptx64--nvidiacl.bc => share/clc/remangled-l32-signed_char.libspirv-amdgcn-amd-amdhsa.bc} (100%) create mode 100644 clang/test/Driver/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc create mode 100644 clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-amdgcn-amd-amdhsa.bc create mode 100644 clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc delete mode 100644 clang/test/Driver/cuda-nvptx-target.cpp create mode 100644 clang/test/Driver/sycl-libspirv-toolchain.cpp diff --git a/clang/test/Driver/Inputs/SYCL/lib/nvidiacl/remangled-l32-signed_char.libspirv-nvptx64--nvidiacl.bc b/clang/test/Driver/Inputs/SYCL/lib/clang/resource_dir/.gitkeep similarity index 100% rename from clang/test/Driver/Inputs/SYCL/lib/nvidiacl/remangled-l32-signed_char.libspirv-nvptx64--nvidiacl.bc rename to clang/test/Driver/Inputs/SYCL/lib/clang/resource_dir/.gitkeep diff --git a/clang/test/Driver/Inputs/SYCL/lib/nvidiacl/remangled-l64-signed_char.libspirv-nvptx64--nvidiacl.bc b/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-amdgcn-amd-amdhsa.bc similarity index 100% rename from clang/test/Driver/Inputs/SYCL/lib/nvidiacl/remangled-l64-signed_char.libspirv-nvptx64--nvidiacl.bc rename to clang/test/Driver/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-amdgcn-amd-amdhsa.bc diff --git a/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc b/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-amdgcn-amd-amdhsa.bc b/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-amdgcn-amd-amdhsa.bc new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc b/clang/test/Driver/Inputs/SYCL/share/clc/remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/cuda-nvptx-target.cpp b/clang/test/Driver/cuda-nvptx-target.cpp deleted file mode 100644 index 1a19caf535502..0000000000000 --- a/clang/test/Driver/cuda-nvptx-target.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: %clang -### -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib -target x86_64-unknown-windows-msvc %s 2> %t.win.out -// RUN: FileCheck %s --check-prefixes=CHECK-WINDOWS --input-file %t.win.out -// CHECK-WINDOWS: remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc -// -// RUN: %clang -### -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib -target x86_64-unknown-linux-gnu %s 2> %t.lnx.out -// RUN: FileCheck %s --check-prefixes=CHECK-LINUX --input-file %t.lnx.out -// CHECK-LINUX: remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc diff --git a/clang/test/Driver/sycl-libspirv-toolchain.cpp b/clang/test/Driver/sycl-libspirv-toolchain.cpp new file mode 100644 index 0000000000000..f017f2e10b7cb --- /dev/null +++ b/clang/test/Driver/sycl-libspirv-toolchain.cpp @@ -0,0 +1,43 @@ +// RUN: %clang -### -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib -target x86_64-unknown-windows-msvc %s 2>&1 \ +// RUN: | FileCheck %s --check-prefixes=CHECK-WINDOWS +// CHECK-WINDOWS: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc" +// +// RUN: %clang -### -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib -target x86_64-unknown-linux-gnu %s 2>&1 \ +// RUN: | FileCheck %s --check-prefixes=CHECK-LINUX +// CHECK-LINUX: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc" +// +// AMDGCN wrongly uses 32-bit longs on Windows +// RUN: %clang -### -resource-dir %S/Inputs/SYCL/lib/clang/resource_dir -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib -target x86_64-unknown-windows-msvc %s 2>&1 \ +// RUN: | FileCheck %s --check-prefixes=CHECK-AMDGCN-WINDOWS +// CHECK-AMDGCN-WINDOWS: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l64-signed_char.libspirv-amdgcn-amd-amdhsa.bc" +// +// RUN: %clang -### -fsycl -fsycl-device-only -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s --check-prefixes=CHECK-DEVICE-ONLY +// CHECK-DEVICE-ONLY: "-cc1"{{.*}} "-fsycl-is-device" +// CHECK-DEVICE-ONLY-NOT: "-mlink-builtin-bitcode" "{{.*}}.libspirv-{{.*}}.bc" +// +// Only link libspirv in SYCL language mode, but `-fno-sycl-libspirv` does not result in a warning +// RUN: %clang -### -x cu -fno-sycl-libspirv -nocudainc -nocudalib %s 2>&1 | FileCheck %s --check-prefixes=CHECK-CUDA +// CHECK-CUDA-NOT: warning: argument unused during compilation: '-fno-sycl-libspirv' [-Wunused-command-line-argument] +// CHECK-CUDA: "-cc1"{{.*}} "-fcuda-is-device" +// CHECK-CUDA-NOT: "-mlink-builtin-bitcode" "{{.*}}.libspirv-{{.*}}.bc" +// +// The path to the remangled libspirv bitcode file is determined by the resource directory. +// RUN: %clang -### -ccc-install-dir %S/Inputs/SYCL/bin -resource-dir %S/Inputs/SYCL/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s -DINSTALL_DIR=%S/Inputs/SYCL/bin -DRESOURCE_DIR=%S/Inputs/SYCL/lib/clang/resource_dir --check-prefixes=CHECK-DIR +// CHECK-DIR: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "[[RESOURCE_DIR]]{{.*[\\/]}}remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc" +// +// The `-###` option disables file existence checks +// RUN: %clang -### -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-HHH-NOT-FOUND +// CHECK-HHH-NOT-FOUND: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "[[DIR]]{{.*[\\/]}}remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc" +// +// But not for AMDGCN :^) +// RUN: not %clang -### -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib %s 2>&1 \ +// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-AMDGCN-HHH-NOT-FOUND +// CHECK-AMDGCN-HHH-NOT-FOUND: error: cannot find 'remangled-{{.*}}.libspirv-amdgcn-amd-amdhsa.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv +// +// `-fdriver-only` has no such special handling, so it will not find the file +// RUN: not %clang -fdriver-only -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-DO-NOT-FOUND +// CHECK-DO-NOT-FOUND: error: cannot find 'remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv diff --git a/clang/test/Driver/sycl-offload-nvptx.cpp b/clang/test/Driver/sycl-offload-nvptx.cpp index c840abbf7f5d5..c8668965c1be0 100644 --- a/clang/test/Driver/sycl-offload-nvptx.cpp +++ b/clang/test/Driver/sycl-offload-nvptx.cpp @@ -38,7 +38,7 @@ // RUN: %clangxx -ccc-print-phases --sysroot=%S/Inputs/SYCL -std=c++11 \ // RUN: -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all \ // RUN: -fsycl-instrument-device-code -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ -// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/lib/nvidiacl \ +// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc \ // RUN: --cuda-path=%S/Inputs/CUDA_111/usr/local/cuda \ // RUN: | FileCheck -check-prefix=CHK-PHASES-NO-CC %s // @@ -57,7 +57,7 @@ // CHK-PHASES-NO-CC: 10: input, "{{.*}}libsycl-itt-user-wrappers.bc", ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 11: input, "{{.*}}libsycl-itt-compiler-wrappers.bc", ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 12: input, "{{.*}}libsycl-itt-stubs.bc", ir, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 13: input, "{{.*}}nvidiacl{{.*}}", ir, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 13: input, "{{.*}}libspirv-nvptx64{{.*}}", ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 14: input, "{{.*}}libdevice{{.*}}", ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 15: linker, {9, 10, 11, 12, 13, 14}, ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 16: sycl-post-link, {15}, ir, (device-sycl, sm_50) @@ -75,7 +75,7 @@ // RUN: %clangxx -ccc-print-phases --sysroot=%S/Inputs/SYCL -std=c++11 \ // RUN: -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all \ // RUN: -fsycl-instrument-device-code -fsycl-targets=nvptx64-nvidia-cuda \ -// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/lib/nvidiacl \ +// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/share/clc/remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc \ // RUN: --cuda-path=%S/Inputs/CUDA_111/usr/local/cuda \ // RUN: -Xsycl-target-backend "--cuda-gpu-arch=sm_35" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES %s @@ -95,7 +95,7 @@ // CHK-PHASES: 10: input, "{{.*}}libsycl-itt-user-wrappers.bc", ir, (device-sycl, sm_35) // CHK-PHASES: 11: input, "{{.*}}libsycl-itt-compiler-wrappers.bc", ir, (device-sycl, sm_35) // CHK-PHASES: 12: input, "{{.*}}libsycl-itt-stubs.bc", ir, (device-sycl, sm_35) -// CHK-PHASES: 13: input, "{{.*}}nvidiacl{{.*}}", ir, (device-sycl, sm_35) +// CHK-PHASES: 13: input, "{{.*}}libspirv-nvptx64{{.*}}", ir, (device-sycl, sm_35) // CHK-PHASES: 14: input, "{{.*}}libdevice{{.*}}", ir, (device-sycl, sm_35) // CHK-PHASES: 15: linker, {9, 10, 11, 12, 13, 14}, ir, (device-sycl, sm_35) // CHK-PHASES: 16: sycl-post-link, {15}, ir, (device-sycl, sm_35) From 8f4ea47980d54f38720146fffaeb84dd1583d35f Mon Sep 17 00:00:00 2001 From: Gergely Meszaros Date: Thu, 26 Jun 2025 08:44:04 -0700 Subject: [PATCH 2/2] Improve test - Hopefully fix windows failure - Add summary of the test --- clang/test/Driver/sycl-libspirv-toolchain.cpp | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/clang/test/Driver/sycl-libspirv-toolchain.cpp b/clang/test/Driver/sycl-libspirv-toolchain.cpp index f017f2e10b7cb..86aca07e0a3c1 100644 --- a/clang/test/Driver/sycl-libspirv-toolchain.cpp +++ b/clang/test/Driver/sycl-libspirv-toolchain.cpp @@ -1,3 +1,8 @@ +// Test the search logic for the libspirv bitcode library in the offloading toolchains that need it. + +// DEFINE: %{install_dir} = %/S/Inputs/SYCL/bin +// DEFINE: %{resource_dir} = %/S/Inputs/SYCL/lib/clang/resource_dir + // RUN: %clang -### -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib -target x86_64-unknown-windows-msvc %s 2>&1 \ // RUN: | FileCheck %s --check-prefixes=CHECK-WINDOWS // CHECK-WINDOWS: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l32-signed_char.libspirv-nvptx64-nvidia-cuda.bc" @@ -7,7 +12,7 @@ // CHECK-LINUX: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l64-signed_char.libspirv-nvptx64-nvidia-cuda.bc" // // AMDGCN wrongly uses 32-bit longs on Windows -// RUN: %clang -### -resource-dir %S/Inputs/SYCL/lib/clang/resource_dir -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib -target x86_64-unknown-windows-msvc %s 2>&1 \ +// RUN: %clang -### -resource-dir %{resource_dir} -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib -target x86_64-unknown-windows-msvc %s 2>&1 \ // RUN: | FileCheck %s --check-prefixes=CHECK-AMDGCN-WINDOWS // CHECK-AMDGCN-WINDOWS: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "{{.*[\\/]}}remangled-l64-signed_char.libspirv-amdgcn-amd-amdhsa.bc" // @@ -23,21 +28,22 @@ // CHECK-CUDA-NOT: "-mlink-builtin-bitcode" "{{.*}}.libspirv-{{.*}}.bc" // // The path to the remangled libspirv bitcode file is determined by the resource directory. -// RUN: %clang -### -ccc-install-dir %S/Inputs/SYCL/bin -resource-dir %S/Inputs/SYCL/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ -// RUN: | FileCheck %s -DINSTALL_DIR=%S/Inputs/SYCL/bin -DRESOURCE_DIR=%S/Inputs/SYCL/lib/clang/resource_dir --check-prefixes=CHECK-DIR +// RUN: %clang -### -ccc-install-dir %{install_dir} -resource-dir %{resource_dir} -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s -DINSTALL_DIR=%{install_dir} -DRESOURCE_DIR=%{resource_dir} --check-prefixes=CHECK-DIR // CHECK-DIR: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "[[RESOURCE_DIR]]{{.*[\\/]}}remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc" // // The `-###` option disables file existence checks -// RUN: %clang -### -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ -// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-HHH-NOT-FOUND -// CHECK-HHH-NOT-FOUND: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "[[DIR]]{{.*[\\/]}}remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc" +// DEFINE: %{nonexistent_dir} = %/S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir +// RUN: %clang -### -resource-dir %{nonexistent_dir} -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s -DDIR=%{nonexistent_dir} --check-prefixes=CHECK-HHH-NONEXISTENT +// CHECK-HHH-NONEXISTENT: "-cc1"{{.*}} "-fsycl-is-device"{{.*}} "-mlink-builtin-bitcode" "[[DIR]]{{.*[\\/]}}remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc" // // But not for AMDGCN :^) -// RUN: not %clang -### -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib %s 2>&1 \ -// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-AMDGCN-HHH-NOT-FOUND -// CHECK-AMDGCN-HHH-NOT-FOUND: error: cannot find 'remangled-{{.*}}.libspirv-amdgcn-amd-amdhsa.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv +// RUN: not %clang -### -resource-dir %{nonexistent_dir} -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 -nogpulib %s 2>&1 \ +// RUN: | FileCheck %s -DDIR=%{nonexistent_dir} --check-prefixes=CHECK-AMDGCN-HHH-NONEXISTENT +// CHECK-AMDGCN-HHH-NONEXISTENT: error: cannot find 'remangled-{{.*}}.libspirv-amdgcn-amd-amdhsa.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv // // `-fdriver-only` has no such special handling, so it will not find the file -// RUN: not %clang -fdriver-only -resource-dir %S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ -// RUN: | FileCheck %s -DDIR=%S/Inputs/SYCL/does_not_exist/lib/clang/resource_dir --check-prefixes=CHECK-DO-NOT-FOUND -// CHECK-DO-NOT-FOUND: error: cannot find 'remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv +// RUN: not %clang -fdriver-only -resource-dir %{nonexistent_dir} -fsycl -fsycl-targets=nvptx64-nvidia-cuda -nocudalib %s 2>&1 \ +// RUN: | FileCheck %s --check-prefixes=CHECK-DO-NONEXISTENT +// CHECK-DO-NONEXISTENT: error: cannot find 'remangled-{{.*}}.libspirv-nvptx64-nvidia-cuda.bc'; provide path to libspirv library via '-fsycl-libspirv-path', or pass '-fno-sycl-libspirv' to build without linking with libspirv