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/4] [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/4] 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/4] 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}

>From a8d7ec942a470410d0ab4d0ed728c9f2db27b965 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju...@intel.com>
Date: Thu, 21 Aug 2025 11:00:51 +0200
Subject: [PATCH 4/4] check arg ARCH_SUFFIX FILES

---
 libclc/cmake/modules/AddLibclc.cmake | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libclc/cmake/modules/AddLibclc.cmake 
b/libclc/cmake/modules/AddLibclc.cmake
index cc4f460319a06..5cc202ddbaa8c 100644
--- a/libclc/cmake/modules/AddLibclc.cmake
+++ b/libclc/cmake/modules/AddLibclc.cmake
@@ -138,6 +138,10 @@ endfunction()
 function(create_compile_targets compile_tgts)
   cmake_parse_arguments( ARG "" "ARCH_SUFFIX" "FILES" ${ARGN} )
 
+  if( NOT ARG_ARCH_SUFFIX OR NOT ARG_FILES )
+    message( FATAL_ERROR "Must provide ARCH_SUFFIX, and FILES" )
+  endif()
+
   set( tgts )
   foreach( file IN LISTS ARG_FILES )
     cmake_path( GET file STEM stem )

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to