https://github.com/wenju-he updated https://github.com/llvm/llvm-project/pull/154479
>From 75b5f46b2858b399482082eabd1388167aaa58e4 Mon Sep 17 00:00:00 2001 From: Wenju He <wenju...@intel.com> Date: Wed, 20 Aug 2025 07:57:54 +0200 Subject: [PATCH 1/3] [libclc] Only create a target per each compile command for cmake MSVC generator libclc sequential build issue addressed in commit 0c21d6b4c8ad is specific to cmake MSVC generator. Therefore, this PR avoids creating a large number of targets when a non-MSVC generator is used, such as the Ninja generator, which is used in pre-merge CI on Windows in llvm-project and our downstream repos. --- libclc/cmake/modules/AddLibclc.cmake | 64 +++++++++++++++++++--------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index 89d5e1dd6f164..5b6b33e10a022 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -1,8 +1,6 @@ # Compiles an OpenCL C - or assembles an LL file - to bytecode # # Arguments: -# * TARGET <string> -# Custom target to create # * TRIPLE <string> # Target triple for which to compile the bytecode file. # * INPUT <string> @@ -19,7 +17,7 @@ function(compile_to_bc) cmake_parse_arguments(ARG "" - "TARGET;TRIPLE;INPUT;OUTPUT" + "TRIPLE;INPUT;OUTPUT" "EXTRA_OPTS;DEPENDENCIES" ${ARGN} ) @@ -65,12 +63,6 @@ function(compile_to_bc) ${ARG_DEPENDENCIES} DEPFILE ${ARG_OUTPUT}.d ) - # FIXME: The target is added to ensure the parallel build of source files. - # However, this may result in a large number of targets. - # Starting with CMake 3.27, DEPENDS_EXPLICIT_ONLY can be used with - # add_custom_command to enable parallel build. - # Refer to https://gitlab.kitware.com/cmake/cmake/-/issues/17097 for details. - add_custom_target( ${ARG_TARGET} DEPENDS ${ARG_OUTPUT}${TMP_SUFFIX} ) if( ${FILE_EXT} STREQUAL ".ll" ) add_custom_command( @@ -132,6 +124,33 @@ function(link_bc) ) endfunction() +# Create a custom target for each bitcode file, which is the output of a custom +# command. This is required for parallel compilation of the custom commands that +# generate the bitcode files when using the CMake MSVC generator on Windows. +# +# Arguments: +# * compile_tgts +# Output list of compile targets +# * ARCH_SUFFIX <string> +# libclc architecture/triple suffix +# * FILES <string> ... +# List of bitcode files +function(create_compile_targets compile_tgts) + cmake_parse_arguments( ARG "" "ARCH_SUFFIX" "FILES" ${ARGN} ) + + set( tgts ) + foreach( file IN LISTS ARG_FILES ) + cmake_path( GET file STEM stem ) + cmake_path( GET file PARENT_PATH parent_path ) + cmake_path( GET parent_path STEM parent_path_stem ) + set( tgt compile-${ARG_ARCH_SUFFIX}-${parent_path_stem}-${stem} ) + add_custom_target( ${tgt} DEPENDS ${file} ) + list( APPEND tgts ${tgt} ) + endforeach() + + set( compile_tgts ${tgts} PARENT_SCOPE ) +endfunction() + # Decomposes and returns variables based on a libclc triple and architecture # combination. Returns data via one or more optional output variables. # @@ -275,7 +294,6 @@ function(add_libclc_builtin_set) set( bytecode_files ) set( bytecode_ir_files ) - set( compile_tgts ) foreach( file IN LISTS ARG_GEN_FILES ARG_LIB_FILES ) # We need to take each file and produce an absolute input file, as well # as a unique architecture-specific output file. We deal with a mix of @@ -305,9 +323,6 @@ function(add_libclc_builtin_set) get_filename_component( file_dir ${file} DIRECTORY ) - string( REPLACE "/" "-" replaced ${file} ) - set( tgt compile_tgt-${ARG_ARCH_SUFFIX}${replaced}) - set( file_specific_compile_options ) get_source_file_property( compile_opts ${file} COMPILE_OPTIONS) if( compile_opts ) @@ -315,7 +330,6 @@ function(add_libclc_builtin_set) endif() compile_to_bc( - TARGET ${tgt} TRIPLE ${ARG_TRIPLE} INPUT ${input_file} OUTPUT ${output_file} @@ -324,7 +338,6 @@ function(add_libclc_builtin_set) -I${CMAKE_CURRENT_SOURCE_DIR}/${file_dir} DEPENDENCIES ${input_file_dep} ) - list( APPEND compile_tgts ${tgt} ) # Collect all files originating in LLVM IR separately get_filename_component( file_ext ${file} EXT ) @@ -335,6 +348,21 @@ function(add_libclc_builtin_set) endif() endforeach() + set( builtins_comp_lib_tgt builtins.comp.${ARG_ARCH_SUFFIX} ) + if ( NOT CMAKE_GENERATOR MATCHES "Visual Studio" ) + create_compile_targets( compile_tgts + ARCH_SUFFIX ${ARG_ARCH_SUFFIX} + FILES ${bytecode_files} + ) + add_custom_target( ${builtins_comp_lib_tgt} DEPENDS ${bytecode_ir_files} ) + add_dependencies( ${builtins_comp_lib_tgt} ${compile_tgts} ) + else() + add_custom_target( ${builtins_comp_lib_tgt} + DEPENDS ${bytecode_files} ${bytecode_ir_files} + ) + endif() + set_target_properties( ${builtins_comp_lib_tgt} PROPERTIES FOLDER "libclc/Device IR/Comp" ) + # Prepend all LLVM IR files to the list so they are linked into the final # bytecode modules first. This helps to suppress unnecessary warnings # regarding different data layouts while linking. Any LLVM IR files without a @@ -342,12 +370,6 @@ function(add_libclc_builtin_set) # process comes across. list( PREPEND bytecode_files ${bytecode_ir_files} ) - set( builtins_comp_lib_tgt builtins.comp.${ARG_ARCH_SUFFIX} ) - add_custom_target( ${builtins_comp_lib_tgt} - DEPENDS ${bytecode_files} ${compile_tgts} - ) - set_target_properties( ${builtins_comp_lib_tgt} PROPERTIES FOLDER "libclc/Device IR/Comp" ) - if( NOT bytecode_files ) message(FATAL_ERROR "Cannot create an empty builtins library") endif() >From c8d6ecc1a01f9249510ef6db9cd1b62c4e4530ea Mon Sep 17 00:00:00 2001 From: Wenju He <wenju...@intel.com> Date: Wed, 20 Aug 2025 08:24:09 +0200 Subject: [PATCH 2/3] remove NOT --- libclc/cmake/modules/AddLibclc.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index 5b6b33e10a022..6ef8f135367d9 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -349,7 +349,7 @@ function(add_libclc_builtin_set) endforeach() set( builtins_comp_lib_tgt builtins.comp.${ARG_ARCH_SUFFIX} ) - if ( NOT CMAKE_GENERATOR MATCHES "Visual Studio" ) + if ( CMAKE_GENERATOR MATCHES "Visual Studio" ) create_compile_targets( compile_tgts ARCH_SUFFIX ${ARG_ARCH_SUFFIX} FILES ${bytecode_files} >From 82c9792d38a27af0dcd789887d69fd66d7451fa0 Mon Sep 17 00:00:00 2001 From: Wenju He <wenju...@intel.com> Date: Thu, 21 Aug 2025 03:05:25 +0200 Subject: [PATCH 3/3] add comment before calling create_compile_targets --- libclc/cmake/modules/AddLibclc.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake index 6ef8f135367d9..cc4f460319a06 100644 --- a/libclc/cmake/modules/AddLibclc.cmake +++ b/libclc/cmake/modules/AddLibclc.cmake @@ -350,6 +350,7 @@ function(add_libclc_builtin_set) set( builtins_comp_lib_tgt builtins.comp.${ARG_ARCH_SUFFIX} ) if ( CMAKE_GENERATOR MATCHES "Visual Studio" ) + # Don't put commands in one custom target to avoid serialized compilation. create_compile_targets( compile_tgts ARCH_SUFFIX ${ARG_ARCH_SUFFIX} FILES ${bytecode_files} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits