Skip to content

Commit

Permalink
[CMake][PGO] Use check-clang target to generate profdata for PGO builds
Browse files Browse the repository at this point in the history
When doing a multi-stage PGO build of clang, run the check-clang and
check-llvm targets using the instrumented clang and use that profile
data for building the final stage2 clang.  This is what is recommended
by our official documentation: https://llvm.org/docs/HowToBuildWithPGO.html#building-clang-with-pgo

I benchmarked this change by compiling the SemaChecking.cpp file from
clang.  Using check-clang/check-llvm to generate the profile data gives a 25% speedup
in the PGO+LTO stage2 clang when compared to the stage1 clang (no-LTO).

Prior to this change, I was only seeing ~5% speedup when comparing the
stage2 and stage1 builds.
  • Loading branch information
tstellar committed Jan 8, 2024
1 parent b41c8bb commit df8296d
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 10 deletions.
6 changes: 3 additions & 3 deletions clang/utils/perf-training/CMakeLists.txt
Expand Up @@ -15,7 +15,7 @@ if(LLVM_BUILD_INSTRUMENTED)
)

add_custom_target(clear-profraw
COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} profraw
COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/ profraw
COMMENT "Clearing old profraw data")

if(NOT LLVM_PROFDATA)
Expand All @@ -26,9 +26,9 @@ if(LLVM_BUILD_INSTRUMENTED)
message(STATUS "To enable merging PGO data LLVM_PROFDATA has to point to llvm-profdata")
else()
add_custom_target(generate-profdata
COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge ${LLVM_PROFDATA} ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata ${CMAKE_CURRENT_BINARY_DIR}
COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge ${LLVM_PROFDATA} ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/
COMMENT "Merging profdata"
DEPENDS generate-profraw)
DEPENDS generate-profraw check-clang check-llvm)
endif()
endif()

Expand Down
16 changes: 9 additions & 7 deletions clang/utils/perf-training/perf-helper.py
Expand Up @@ -30,26 +30,28 @@ def findFilesWithExtension(path, extension):


def clean(args):
if len(args) != 2:
if len(args) < 2:
print(
"Usage: %s clean <path> <extension>\n" % __file__
"Usage: %s clean <paths> <extension>\n" % __file__
+ "\tRemoves all files with extension from <path>."
)
return 1
for filename in findFilesWithExtension(args[0], args[1]):
os.remove(filename)
for path in args[1:-1]:
for filename in findFilesWithExtension(path, args[-1]):
os.remove(filename)
return 0


def merge(args):
if len(args) != 3:
if len(args) < 3:
print(
"Usage: %s merge <llvm-profdata> <output> <path>\n" % __file__
"Usage: %s merge <llvm-profdata> <output> <paths>\n" % __file__
+ "\tMerges all profraw files from path into output."
)
return 1
cmd = [args[0], "merge", "-o", args[1]]
cmd.extend(findFilesWithExtension(args[2], "profraw"))
for i in range(2, len(args)):
cmd.extend(findFilesWithExtension(args[i], "profraw"))
subprocess.check_call(cmd)
return 0

Expand Down

0 comments on commit df8296d

Please sign in to comment.