From ce1af26e6bf85f6f6a4f3091bf9c17c0f47e5f3a Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Mon, 10 Mar 2025 18:18:09 +0000 Subject: [PATCH 1/5] [flang] Use precompiled headers in Lower, Parser and Semantics Precompiling larger headers can save a lot of compile time across various compilation units. Selected compile time & memory improvements are as follows: flang/lib/Parser/Fortran-parsers.cpp: Elapsed (wall clock) time (h:mm:ss or m:ss): 0:47.31 -> 0:41.68 Maximum resident set size (kbytes): 2062140 -> 1745584 flang/lib/Lower/Bridge.cpp: Elapsed (wall clock) time (h:mm:ss or m:ss): 1:19.16 -> 0:45.86 Maximum resident set size (kbytes): 3849144 -> 2443476 flang/lib/Lower/PFTBuilder.cpp Elapsed (wall clock) time (h:mm:ss or m:ss): 1:29.24 -> 1:00.99 Maximum resident set size (kbytes): 4218368 -> 2923128 flang/lib/Lower/Allocatable.cpp Elapsed (wall clock) time (h:mm:ss or m:ss): 0:53.03 -> 0:22.50 Maximum resident set size (kbytes): 3092840 -> 2116908 flang/lib/Semantics/Semantics.cpp Elapsed (wall clock) time (h:mm:ss or m:ss): 1:18.75 -> 1:00.20 Maximum resident set size (kbytes): 3527744 -> 2545308 While the newly added precompiled headers are as follows: Parser: Elapsed (wall clock) time (h:mm:ss or m:ss): 0:09.62 Maximum resident set size (kbytes): 1034608 Lower: Elapsed (wall clock) time (h:mm:ss or m:ss): 0:41.33 Maximum resident set size (kbytes): 3615240 Semantics: Elapsed (wall clock) time (h:mm:ss or m:ss): 0:26.69 Maximum resident set size (kbytes): 2403776 Signed-off-by: Kajetan Puchalski --- flang/lib/Lower/CMakeLists.txt | 11 +++++++++++ flang/lib/Parser/CMakeLists.txt | 8 ++++++++ flang/lib/Semantics/CMakeLists.txt | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt index 0bd9a47cd040f..bc817ff8f1f3e 100644 --- a/flang/lib/Lower/CMakeLists.txt +++ b/flang/lib/Lower/CMakeLists.txt @@ -73,3 +73,14 @@ add_flang_library(FortranLower MLIRLLVMDialect MLIRSCFToControlFlow ) + +target_precompile_headers(FortranLower PRIVATE + [["flang/Lower/ConvertExpr.h"]] + [["flang/Lower/SymbolMap.h"]] + [["flang/Lower/AbstractConverter.h"]] + [["flang/Lower/IterationSpace.h"]] + [["flang/Lower/CallInterface.h"]] + [["flang/Lower/BoxAnalyzer.h"]] + [["flang/Lower/PFTBuilder.h"]] + [["flang/Lower/DirectivesCommon.h"]] +) diff --git a/flang/lib/Parser/CMakeLists.txt b/flang/lib/Parser/CMakeLists.txt index 76fe3d7ce6ba4..1855b8a841ba7 100644 --- a/flang/lib/Parser/CMakeLists.txt +++ b/flang/lib/Parser/CMakeLists.txt @@ -36,3 +36,11 @@ add_flang_library(FortranParser omp_gen acc_gen ) + +target_precompile_headers(FortranParser PRIVATE + [["flang/Parser/parsing.h"]] + [["flang/Parser/parse-tree.h"]] + [["flang/Parser/provenance.h"]] + [["flang/Parser/message.h"]] + [["flang/Parser/parse-tree-visitor.h"]] +) diff --git a/flang/lib/Semantics/CMakeLists.txt b/flang/lib/Semantics/CMakeLists.txt index 93bf0c7c5facd..bd8cc47365f06 100644 --- a/flang/lib/Semantics/CMakeLists.txt +++ b/flang/lib/Semantics/CMakeLists.txt @@ -64,3 +64,12 @@ add_flang_library(FortranSemantics FrontendOpenACC TargetParser ) + +target_precompile_headers(FortranSemantics PRIVATE + [["flang/Semantics/semantics.h"]] + [["flang/Semantics/type.h"]] + [["flang/Semantics/openmp-modifiers.h"]] + [["flang/Semantics/expression.h"]] + [["flang/Semantics/tools.h"]] + [["flang/Semantics/symbol.h"]] +) From 7e085b720167e2c43e942391abf25fd71df0e084 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Thu, 13 Mar 2025 16:46:59 +0000 Subject: [PATCH 2/5] [flang] Use precompiled headers in Evaluate flang/lib/Evaluate/check-expression.cpp: Elapsed (wall clock) time (h:mm:ss or m:ss): 1:11.91 -> 1:02.29 Maximum resident set size (kbytes): 2710788 -> 2414740 Similar improvements for other compilation units under Evaluate. cmake_pch.hxx.cxx compilation time: Elapsed (wall clock) time (h:mm:ss or m:ss): 0:13.93 Maximum resident set size (kbytes): 1492744 Signed-off-by: Kajetan Puchalski --- flang/lib/Evaluate/CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/flang/lib/Evaluate/CMakeLists.txt b/flang/lib/Evaluate/CMakeLists.txt index 7eb8ff934af46..24a1c9004bc3b 100644 --- a/flang/lib/Evaluate/CMakeLists.txt +++ b/flang/lib/Evaluate/CMakeLists.txt @@ -73,3 +73,17 @@ add_flang_library(FortranEvaluate acc_gen omp_gen ) + +target_precompile_headers(FortranEvaluate PRIVATE + [["flang/Evaluate/common.h"]] + [["flang/Evaluate/call.h"]] + [["flang/Evaluate/traverse.h"]] + [["flang/Evaluate/shape.h"]] + [["flang/Evaluate/characteristics.h"]] + [["flang/Evaluate/variable.h"]] + [["flang/Evaluate/real.h"]] + [["flang/Evaluate/type.h"]] + [["flang/Evaluate/integer.h"]] + [["flang/Evaluate/expression.h"]] + [["flang/Evaluate/tools.h"]] +) From cd8c8cce29451cc989d84a848c485bb0fcddac49 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Tue, 8 Apr 2025 14:39:10 +0000 Subject: [PATCH 3/5] [flang] Use precompiled headers in Frontend Reland of #130600 which was reverted on account of waiting for required ccache compatibility fixes. Signed-off-by: Kajetan Puchalski --- flang/lib/Frontend/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flang/lib/Frontend/CMakeLists.txt b/flang/lib/Frontend/CMakeLists.txt index 00befcb4785b3..96ba27ad418f7 100644 --- a/flang/lib/Frontend/CMakeLists.txt +++ b/flang/lib/Frontend/CMakeLists.txt @@ -74,3 +74,11 @@ add_flang_library(flangFrontend clangBasic clangDriver ) + +target_precompile_headers(flangFrontend PRIVATE + [["flang/Parser/parsing.h"]] + [["flang/Parser/parse-tree.h"]] + [["flang/Parser/dump-parse-tree.h"]] + [["flang/Lower/PFTBuilder.h"]] + [["flang/Lower/Bridge.h"]] +) From 6edd33b9011defa948358137913352a78cc9b1e8 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Thu, 24 Apr 2025 19:57:32 +0000 Subject: [PATCH 4/5] [CMake] Disable precompiled headers for ccache builds on Windows Signed-off-by: Kajetan Puchalski --- llvm/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index d47ac3ccffd05..9481ab3698e01 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -286,6 +286,9 @@ if(LLVM_CCACHE_BUILD) endif() set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM}) else() + # Until a way to reliably configure ccache on Windows is found, + # disable precompiled headers for Windows + ccache builds + set(CMAKE_DISABLE_PRECOMPILE_HEADERS "ON") if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros") message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.") From 451ecfe5896c9397b19803b65eadd07e6d496671 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Tue, 29 Apr 2025 16:46:08 +0000 Subject: [PATCH 5/5] [CMake] Warn when overriding CMAKE_DISABLE_PRECOMPILED_HEADERS Signed-off-by: Kajetan Puchalski --- llvm/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 9481ab3698e01..1c9c404a761a0 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -288,7 +288,11 @@ if(LLVM_CCACHE_BUILD) else() # Until a way to reliably configure ccache on Windows is found, # disable precompiled headers for Windows + ccache builds - set(CMAKE_DISABLE_PRECOMPILE_HEADERS "ON") + if(NOT CMAKE_DISABLE_PRECOMPILE_HEADERS) + message(WARNING "Using ccache with precompiled headers on Windows is currently not supported. + CMAKE_DISABLE_PRECOMPILE_HEADERS will be set to ON.") + set(CMAKE_DISABLE_PRECOMPILE_HEADERS "ON") + endif() if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros") message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.")