From b8d7724f811c9569c08fa09542b726ed600d9665 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 7 Nov 2025 12:57:52 +0100 Subject: [PATCH 1/5] [SYCL][SPIRV] Enable only required extensions for SPIRV Backend. --- clang/lib/Driver/ToolChains/Clang.cpp | 65 ++++++++++++++++++++---- clang/test/Driver/sycl-spirv-backend.cpp | 2 +- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9292f9df9a6ee..c4b34b2353968 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10446,16 +10446,61 @@ static void getSPIRVBackendOpts(const llvm::opt::ArgList &TCArgs, TCArgs.MakeArgString("--avoid-spirv-capabilities=Shader")); BackendArgs.push_back( TCArgs.MakeArgString("--translator-compatibility-mode")); - // TODO: A list of SPIR-V extensions that are supported by the SPIR-V backend - // is growing. Let's postpone the decision on which extensions to enable until - // - the list is stable, and - // - we decide on a mapping of user requested extensions into backend's ones. - // Meanwhile we enable all the SPIR-V backend extensions. - BackendArgs.push_back(TCArgs.MakeArgString("--spirv-ext=all")); - // TODO: - // - handle -Xspirv-translator option to avoid "argument unused during - // compilation" error - // - handle --spirv-ext=+ and --spirv-ext=- options + + // SPIR-V backend recently started to support extensions not supported by + // drivers (e.g. SPV_KHR_float_controls2). At the same time, SPIR-V backend + // doesn't support the syntax for disabling specific extensions (i.e. + // --spirv-ext=-). We need to come up with a list of SPIR-V + // extensions that are supported by the backend, but also by the driver. Below + // is the first approach for such a list. + // FIXME: A priori, we wouldn't expect SPV_INTEL_variable_length_array and + // SPV_EXT_relaxed_printf_string_address_space to be required, but without + // them, some SYCL E2E tests fail. Let's keep them until we figure out what's + // the problem. + std::string ExtArg("-spirv-ext="); + std::string DefaultExtArg = "+SPV_EXT_relaxed_printf_string_address_space" + ",+SPV_EXT_shader_atomic_float16_add" + ",+SPV_EXT_shader_atomic_float_add" + ",+SPV_EXT_shader_atomic_float_min_max"; + std::string IntelExtArg = ",+SPV_INTEL_2d_block_io" + ",+SPV_INTEL_arbitrary_precision_integers" + ",+SPV_INTEL_bfloat16_conversion" + ",+SPV_INTEL_bindless_images" + ",+SPV_INTEL_cache_controls" + ",+SPV_INTEL_float_controls2" + ",+SPV_INTEL_fp_max_error" + ",+SPV_INTEL_function_pointers" + ",+SPV_INTEL_inline_assembly" + ",+SPV_INTEL_joint_matrix" + ",+SPV_INTEL_long_composites" + ",+SPV_INTEL_subgroups" + ",+SPV_INTEL_tensor_float32_conversion" + ",+SPV_INTEL_variable_length_array"; + std::string KHRExtArg = ",+SPV_KHR_16bit_storage" + ",+SPV_KHR_cooperative_matrix" + ",+SPV_KHR_expect_assume" + ",+SPV_KHR_float_controls" + ",+SPV_KHR_linkonce_odr" + ",+SPV_KHR_no_integer_wrap_decoration" + ",+SPV_KHR_non_semantic_info" + ",+SPV_KHR_shader_clock" + ",+SPV_KHR_uniform_group_instructions"; + ExtArg = ExtArg + DefaultExtArg + IntelExtArg + KHRExtArg; + BackendArgs.push_back(TCArgs.MakeArgString(ExtArg)); + + // // TODO: A list of SPIR-V extensions that are supported by the SPIR-V + // backend + // // is growing. Let's postpone the decision on which extensions to enable + // until + // // - the list is stable, and + // // - we decide on a mapping of user requested extensions into backend's + // ones. + // // Meanwhile we enable all the SPIR-V backend extensions. + // BackendArgs.push_back(TCArgs.MakeArgString("--spirv-ext=all")); + // // TODO: + // // - handle -Xspirv-translator option to avoid "argument unused during + // // compilation" error + // // - handle --spirv-ext=+ and --spirv-ext=- options } // Utility function to gather all llvm-spirv options. diff --git a/clang/test/Driver/sycl-spirv-backend.cpp b/clang/test/Driver/sycl-spirv-backend.cpp index 7697c1055b3d2..f27128984cf2c 100644 --- a/clang/test/Driver/sycl-spirv-backend.cpp +++ b/clang/test/Driver/sycl-spirv-backend.cpp @@ -3,4 +3,4 @@ /// // RUN: %clangxx -fsycl -fsycl-use-spirv-backend-for-spirv-gen -### %s 2>&1 | FileCheck %s -// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "--spirv-ext= +// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "-spirv-ext=+SPV_EXT_arithmetic_fence,+SPV_EXT_relaxed_printf_string_address_space,+SPV_EXT_shader_atomic_float16_add,+SPV_EXT_shader_atomic_float_add,+SPV_EXT_shader_atomic_float_min_max,+SPV_INTEL_2d_block_io,+SPV_INTEL_arbitrary_precision_integers,+SPV_INTEL_bfloat16_conversion,+SPV_INTEL_bindless_images,+SPV_INTEL_cache_controls,+SPV_INTEL_float_controls2,+SPV_INTEL_fp_max_error,+SPV_INTEL_function_pointers,+SPV_INTEL_inline_assembly,+SPV_INTEL_joint_matrix,+SPV_INTEL_long_composites,+SPV_INTEL_subgroups,+SPV_INTEL_tensor_float32_conversion,+SPV_INTEL_variable_length_array,+SPV_KHR_16bit_storage,+SPV_KHR_cooperative_matrix,+SPV_KHR_expect_assume,+SPV_KHR_float_controls,+SPV_KHR_linkonce_odr,+SPV_KHR_no_integer_wrap_decoration,+SPV_KHR_non_semantic_info,+SPV_KHR_shader_clock,+SPV_KHR_uniform_group_instructions" From 40d4cd0f49bdf8611a7acd7a8b1f796dcda0f024 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 7 Nov 2025 13:01:55 +0100 Subject: [PATCH 2/5] Remove leftovers. --- clang/lib/Driver/ToolChains/Clang.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index c4b34b2353968..6541c411e9d40 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10488,15 +10488,6 @@ static void getSPIRVBackendOpts(const llvm::opt::ArgList &TCArgs, ExtArg = ExtArg + DefaultExtArg + IntelExtArg + KHRExtArg; BackendArgs.push_back(TCArgs.MakeArgString(ExtArg)); - // // TODO: A list of SPIR-V extensions that are supported by the SPIR-V - // backend - // // is growing. Let's postpone the decision on which extensions to enable - // until - // // - the list is stable, and - // // - we decide on a mapping of user requested extensions into backend's - // ones. - // // Meanwhile we enable all the SPIR-V backend extensions. - // BackendArgs.push_back(TCArgs.MakeArgString("--spirv-ext=all")); // // TODO: // // - handle -Xspirv-translator option to avoid "argument unused during // // compilation" error From 3cc24cdeaa45cdaa86c249fff3a89de06a6c5444 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 7 Nov 2025 14:11:18 +0100 Subject: [PATCH 3/5] Update test. --- clang/test/Driver/sycl-spirv-backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-spirv-backend.cpp b/clang/test/Driver/sycl-spirv-backend.cpp index f27128984cf2c..93ec7d04714ee 100644 --- a/clang/test/Driver/sycl-spirv-backend.cpp +++ b/clang/test/Driver/sycl-spirv-backend.cpp @@ -3,4 +3,4 @@ /// // RUN: %clangxx -fsycl -fsycl-use-spirv-backend-for-spirv-gen -### %s 2>&1 | FileCheck %s -// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "-spirv-ext=+SPV_EXT_arithmetic_fence,+SPV_EXT_relaxed_printf_string_address_space,+SPV_EXT_shader_atomic_float16_add,+SPV_EXT_shader_atomic_float_add,+SPV_EXT_shader_atomic_float_min_max,+SPV_INTEL_2d_block_io,+SPV_INTEL_arbitrary_precision_integers,+SPV_INTEL_bfloat16_conversion,+SPV_INTEL_bindless_images,+SPV_INTEL_cache_controls,+SPV_INTEL_float_controls2,+SPV_INTEL_fp_max_error,+SPV_INTEL_function_pointers,+SPV_INTEL_inline_assembly,+SPV_INTEL_joint_matrix,+SPV_INTEL_long_composites,+SPV_INTEL_subgroups,+SPV_INTEL_tensor_float32_conversion,+SPV_INTEL_variable_length_array,+SPV_KHR_16bit_storage,+SPV_KHR_cooperative_matrix,+SPV_KHR_expect_assume,+SPV_KHR_float_controls,+SPV_KHR_linkonce_odr,+SPV_KHR_no_integer_wrap_decoration,+SPV_KHR_non_semantic_info,+SPV_KHR_shader_clock,+SPV_KHR_uniform_group_instructions" +// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "-spirv-ext=+SPV_EXT_relaxed_printf_string_address_space,+SPV_EXT_shader_atomic_float16_add,+SPV_EXT_shader_atomic_float_add,+SPV_EXT_shader_atomic_float_min_max,+SPV_INTEL_2d_block_io,+SPV_INTEL_arbitrary_precision_integers,+SPV_INTEL_bfloat16_conversion,+SPV_INTEL_bindless_images,+SPV_INTEL_cache_controls,+SPV_INTEL_float_controls2,+SPV_INTEL_fp_max_error,+SPV_INTEL_function_pointers,+SPV_INTEL_inline_assembly,+SPV_INTEL_joint_matrix,+SPV_INTEL_long_composites,+SPV_INTEL_subgroups,+SPV_INTEL_tensor_float32_conversion,+SPV_INTEL_variable_length_array,+SPV_KHR_16bit_storage,+SPV_KHR_cooperative_matrix,+SPV_KHR_expect_assume,+SPV_KHR_float_controls,+SPV_KHR_linkonce_odr,+SPV_KHR_no_integer_wrap_decoration,+SPV_KHR_non_semantic_info,+SPV_KHR_shader_clock,+SPV_KHR_uniform_group_instructions" From 0efcbade80e1073a9ee4ed25d1a6cde50c0ba676 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 7 Nov 2025 16:44:25 +0100 Subject: [PATCH 4/5] Address code review. --- clang/lib/Driver/ToolChains/Clang.cpp | 8 +++---- clang/test/Driver/sycl-spirv-backend.cpp | 29 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6541c411e9d40..a55fd27d299ed 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10488,10 +10488,10 @@ static void getSPIRVBackendOpts(const llvm::opt::ArgList &TCArgs, ExtArg = ExtArg + DefaultExtArg + IntelExtArg + KHRExtArg; BackendArgs.push_back(TCArgs.MakeArgString(ExtArg)); - // // TODO: - // // - handle -Xspirv-translator option to avoid "argument unused during - // // compilation" error - // // - handle --spirv-ext=+ and --spirv-ext=- options + // TODO: + // - handle -Xspirv-translator option to avoid "argument unused during + // compilation" error + // - handle --spirv-ext=+ and --spirv-ext=- options } // Utility function to gather all llvm-spirv options. diff --git a/clang/test/Driver/sycl-spirv-backend.cpp b/clang/test/Driver/sycl-spirv-backend.cpp index 93ec7d04714ee..29a9945fef007 100644 --- a/clang/test/Driver/sycl-spirv-backend.cpp +++ b/clang/test/Driver/sycl-spirv-backend.cpp @@ -3,4 +3,31 @@ /// // RUN: %clangxx -fsycl -fsycl-use-spirv-backend-for-spirv-gen -### %s 2>&1 | FileCheck %s -// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "-spirv-ext=+SPV_EXT_relaxed_printf_string_address_space,+SPV_EXT_shader_atomic_float16_add,+SPV_EXT_shader_atomic_float_add,+SPV_EXT_shader_atomic_float_min_max,+SPV_INTEL_2d_block_io,+SPV_INTEL_arbitrary_precision_integers,+SPV_INTEL_bfloat16_conversion,+SPV_INTEL_bindless_images,+SPV_INTEL_cache_controls,+SPV_INTEL_float_controls2,+SPV_INTEL_fp_max_error,+SPV_INTEL_function_pointers,+SPV_INTEL_inline_assembly,+SPV_INTEL_joint_matrix,+SPV_INTEL_long_composites,+SPV_INTEL_subgroups,+SPV_INTEL_tensor_float32_conversion,+SPV_INTEL_variable_length_array,+SPV_KHR_16bit_storage,+SPV_KHR_cooperative_matrix,+SPV_KHR_expect_assume,+SPV_KHR_float_controls,+SPV_KHR_linkonce_odr,+SPV_KHR_no_integer_wrap_decoration,+SPV_KHR_non_semantic_info,+SPV_KHR_shader_clock,+SPV_KHR_uniform_group_instructions" +// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64{{[^-]*}}-unknown-unknown" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "-spirv-ext= +// CHECK-SAME: +SPV_EXT_relaxed_printf_string_address_space +// CHECK-SAME:,+SPV_EXT_shader_atomic_float16_add +// CHECK-SAME:,+SPV_EXT_shader_atomic_float_add +// CHECK-SAME:,+SPV_EXT_shader_atomic_float_min_max +// CHECK-SAME:,+SPV_INTEL_2d_block_io +// CHECK-SAME:,+SPV_INTEL_arbitrary_precision_integers +// CHECK-SAME:,+SPV_INTEL_bfloat16_conversion +// CHECK-SAME:,+SPV_INTEL_bindless_images +// CHECK-SAME:,+SPV_INTEL_cache_controls +// CHECK-SAME:,+SPV_INTEL_float_controls2 +// CHECK-SAME:,+SPV_INTEL_fp_max_error +// CHECK-SAME:,+SPV_INTEL_function_pointers +// CHECK-SAME:,+SPV_INTEL_inline_assembly +// CHECK-SAME:,+SPV_INTEL_joint_matrix +// CHECK-SAME:,+SPV_INTEL_long_composites +// CHECK-SAME:,+SPV_INTEL_subgroups +// CHECK-SAME:,+SPV_INTEL_tensor_float32_conversion +// CHECK-SAME:,+SPV_INTEL_variable_length_array +// CHECK-SAME:,+SPV_KHR_16bit_storage +// CHECK-SAME:,+SPV_KHR_cooperative_matrix +// CHECK-SAME:,+SPV_KHR_expect_assume +// CHECK-SAME:,+SPV_KHR_float_controls +// CHECK-SAME:,+SPV_KHR_linkonce_odr +// CHECK-SAME:,+SPV_KHR_no_integer_wrap_decoration +// CHECK-SAME:,+SPV_KHR_non_semantic_info +// CHECK-SAME:,+SPV_KHR_shader_clock +// CHECK-SAME:,+SPV_KHR_uniform_group_instructions" From 907868d23325e1997876e9efdb171f64730c3003 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 7 Nov 2025 16:53:15 +0100 Subject: [PATCH 5/5] Update comment. --- clang/lib/Driver/ToolChains/Clang.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a55fd27d299ed..2cd8d46f97989 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10453,9 +10453,9 @@ static void getSPIRVBackendOpts(const llvm::opt::ArgList &TCArgs, // --spirv-ext=-). We need to come up with a list of SPIR-V // extensions that are supported by the backend, but also by the driver. Below // is the first approach for such a list. - // FIXME: A priori, we wouldn't expect SPV_INTEL_variable_length_array and + // FIXME: A priori, we wouldn't expect // SPV_EXT_relaxed_printf_string_address_space to be required, but without - // them, some SYCL E2E tests fail. Let's keep them until we figure out what's + // it, some SYCL E2E tests fail. Let's keep it until we figure out what's // the problem. std::string ExtArg("-spirv-ext="); std::string DefaultExtArg = "+SPV_EXT_relaxed_printf_string_address_space"