From d68c732473a12f2fba495baebd7094b25bdfdce7 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Wed, 30 Apr 2025 11:46:57 +0100 Subject: [PATCH] [flang] Use precompiled headers in Frontend, Lower, Parser, Semantics and Evaluate (#131137) Precompiling larger headers can save a lot of compile time across various compilation units. For the time being, disable precompiled headers for ccache builds on Windows due to issues with reliably passing the appropriate options to ccache. 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/Evaluate/CMakeLists.txt | 14 ++++++++++++++ flang/lib/Frontend/CMakeLists.txt | 8 ++++++++ flang/lib/Lower/CMakeLists.txt | 11 +++++++++++ flang/lib/Parser/CMakeLists.txt | 8 ++++++++ flang/lib/Semantics/CMakeLists.txt | 9 +++++++++ llvm/CMakeLists.txt | 7 +++++++ 6 files changed, 57 insertions(+) diff --git a/flang/lib/Evaluate/CMakeLists.txt b/flang/lib/Evaluate/CMakeLists.txt index 7eb8ff934af4..24a1c9004bc3 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"]] +) diff --git a/flang/lib/Frontend/CMakeLists.txt b/flang/lib/Frontend/CMakeLists.txt index 00befcb4785b..96ba27ad418f 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"]] +) diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt index 0bd9a47cd040..bc817ff8f1f3 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 76fe3d7ce6ba..1855b8a841ba 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 93bf0c7c5fac..bd8cc47365f0 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"]] +) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index fb5e282ce24d..dd9040400530 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -306,6 +306,13 @@ 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 + 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.")