[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov updated https://github.com/llvm/llvm-project/pull/79942 >From 63904124dc6c6cd9b855046fac3ad1a5e72d60b7 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 19 Jul 2023 20:30:29 -0700 Subject: [PATCH 1/4] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 --- clang/CMakeLists.txt | 12 - clang/cmake/caches/CSSPGO.cmake| 3 ++ clang/utils/perf-training/CMakeLists.txt | 32 - clang/utils/perf-training/lit.cfg | 6 +++ clang/utils/perf-training/lit.site.cfg.in | 1 + clang/utils/perf-training/perf-helper.py | 55 ++ llvm/CMakeLists.txt| 3 ++ llvm/cmake/modules/HandleLLVMOptions.cmake | 26 +- 8 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 clang/cmake/caches/CSSPGO.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 61df987da7139..b8da611ad4506 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -18,8 +18,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PGO_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + add_custom_target(clear-profraw COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/ profraw +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} perf.data COMMENT "Clearing old profraw data") if(NOT LLVM_PROFDATA) @@ -30,9 +55,12 @@ 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} ${CMAKE_BINARY_DIR}/profiles/ + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helpe
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov updated https://github.com/llvm/llvm-project/pull/79942 >From 63904124dc6c6cd9b855046fac3ad1a5e72d60b7 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 19 Jul 2023 20:30:29 -0700 Subject: [PATCH 1/3] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 --- clang/CMakeLists.txt | 12 - clang/cmake/caches/CSSPGO.cmake| 3 ++ clang/utils/perf-training/CMakeLists.txt | 32 - clang/utils/perf-training/lit.cfg | 6 +++ clang/utils/perf-training/lit.site.cfg.in | 1 + clang/utils/perf-training/perf-helper.py | 55 ++ llvm/CMakeLists.txt| 3 ++ llvm/cmake/modules/HandleLLVMOptions.cmake | 26 +- 8 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 clang/cmake/caches/CSSPGO.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 61df987da7139..b8da611ad4506 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -18,8 +18,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PGO_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + add_custom_target(clear-profraw COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/profiles/ profraw +COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} perf.data COMMENT "Clearing old profraw data") if(NOT LLVM_PROFDATA) @@ -30,9 +55,12 @@ 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} ${CMAKE_BINARY_DIR}/profiles/ + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helpe
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov updated https://github.com/llvm/llvm-project/pull/79942 >From 90686f2cd5e210f9ca974c10f8c1224a825c1315 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 19 Jul 2023 20:30:29 -0700 Subject: [PATCH 1/3] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 --- clang/CMakeLists.txt | 12 - clang/cmake/caches/CSSPGO.cmake| 3 ++ clang/utils/perf-training/CMakeLists.txt | 32 - clang/utils/perf-training/lit.cfg | 6 +++ clang/utils/perf-training/lit.site.cfg.in | 1 + clang/utils/perf-training/perf-helper.py | 54 ++ llvm/CMakeLists.txt| 3 ++ llvm/cmake/modules/HandleLLVMOptions.cmake | 26 ++- 8 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 clang/cmake/caches/CSSPGO.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 601f40902fa34..489a097cd49c8 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -14,8 +14,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PERF_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + 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} perf.data COMMENT "Clearing old profraw data") if(NOT LLVM_PROFDATA) @@ -26,9 +51,12 @@ 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_D
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
aaupov wrote: Linking the preprint of the paper accepted to CGO'24 which has a CSSPGO performance comparison with AutoFDO and Instr PGO (Fig. 6): https://htyu.github.io/paper/Revamping_Sampling_based_PGO_with_Context_sensitivity_and_Pseudo_instrumentation_preprint.pdf https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
aaupov wrote: > Do you have benchmarks on how well this performs relative to standard IRPGO > (or on top of it)? Couple of things to untangle here: 1. In general, CSSPGO is meant as a more practical alternative for IRPGO thanks to i) the use of sampled profile, ii) context-sensitivity. However, IRPGO is still expected to provide better performance in all cases where it's applicable thanks to accurate profile information. 2. Due to that, I don't think it makes sense to apply CSSPGO on top of IRPGO, and CMake automation would not permit mixing the two (both implemented as LLVM_BUILD_INSTRUMENTED exclusive options). 3. [CSSPGO RFC](https://lists.llvm.org/pipermail/llvm-dev/2020-August/144101.html) has direct perf comparison of early implementation of CSSPGO vs IRPGO on Spec06: https://github.com/llvm/llvm-project/assets/876514/a921e324-6b5d-4660-9928-0fb0c994649a";> 4. With CMake stuff implemented in this diff, it's expected that the amount of profile information collected would be miniscule (in-tree perf-training only has a single hello world source file) and inadequate for getting much perf boost with CSSPGO (it even prints the warning that it needs 6985000.0x more profile). 5. But I'll kick out a perf run anyway to see what's the starting point. If it's zero, I'll try building different targets (in-tree or from LLVM Test Suite) to identify a viable profiling workload, but it's outside of scope of this diff. https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
boomanaiden154 wrote: Do you have benchmarks on how well this performs relative to standard IRPGO (or on top of it)? https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov updated https://github.com/llvm/llvm-project/pull/79942 >From 90686f2cd5e210f9ca974c10f8c1224a825c1315 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 19 Jul 2023 20:30:29 -0700 Subject: [PATCH 1/2] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 --- clang/CMakeLists.txt | 12 - clang/cmake/caches/CSSPGO.cmake| 3 ++ clang/utils/perf-training/CMakeLists.txt | 32 - clang/utils/perf-training/lit.cfg | 6 +++ clang/utils/perf-training/lit.site.cfg.in | 1 + clang/utils/perf-training/perf-helper.py | 54 ++ llvm/CMakeLists.txt| 3 ++ llvm/cmake/modules/HandleLLVMOptions.cmake | 26 ++- 8 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 clang/cmake/caches/CSSPGO.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 601f40902fa34..489a097cd49c8 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -14,8 +14,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PERF_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + 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} perf.data COMMENT "Clearing old profraw data") if(NOT LLVM_PROFDATA) @@ -26,9 +51,12 @@ 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_D
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov edited https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov edited https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
github-actions[bot] wrote: :warning: Python code formatter, darker found issues in your code. :warning: You can test this locally with the following command: ``bash darker --check --diff -r c34aa784f8867517315d8ef32a8038ee9dbb7165...90686f2cd5e210f9ca974c10f8c1224a825c1315 clang/utils/perf-training/perf-helper.py `` View the diff from darker here. ``diff --- perf-helper.py 2024-01-30 04:13:23.00 + +++ perf-helper.py 2024-01-30 04:20:47.870019 + @@ -42,11 +42,11 @@ def merge(args): parser = argparse.ArgumentParser( prog="perf-helper merge", -description="Merges all profraw files from path into output" +description="Merges all profraw files from path into output", ) parser.add_argument("profdata", help="Path to llvm-profdata tool") parser.add_argument("output", help="Output filename") parser.add_argument("path", help="Folder containing input profraw files") parser.add_argument("--sample", action="store_true", help="Sample profile") @@ -74,21 +74,18 @@ def perf(args): parser = argparse.ArgumentParser( prog="perf-helper perf", -description="perf wrapper for BOLT/CSSPGO profile collection" +description="perf wrapper for BOLT/CSSPGO profile collection", ) parser.add_argument( "--lbr", action="store_true", help="Use perf with branch stacks" ) -parser.add_argument( -"--call-graph", action="store_true", help="Collect call graph" -) -parser.add_argument( -"--event", help="PMU event name, defaults to cycles:u", -default="cycles:u" +parser.add_argument("--call-graph", action="store_true", help="Collect call graph") +parser.add_argument( +"--event", help="PMU event name, defaults to cycles:u", default="cycles:u" ) parser.add_argument("cmd", nargs=argparse.REMAINDER, help="") opts = parser.parse_args(args) cmd = opts.cmd[1:] @@ -139,22 +136,23 @@ return 0 def perf2prof(args): parser = argparse.ArgumentParser( -prog="perf-helper perf2prof", -description="perf to CSSPGO prof conversion wrapper", -) +prog="perf-helper perf2prof", +description="perf to CSSPGO prof conversion wrapper", +) parser.add_argument("profgen", help="Path to llvm-profgen binary") parser.add_argument("binary", help="Input binary") parser.add_argument("path", help="Path containing perf.data files") opts = parser.parse_args(args) profgen_args = [opts.profgen, f"--binary={opts.binary}"] for filename in findFilesWithExtension(opts.path, "perf.data"): -subprocess.check_call(profgen_args + [f"--perfdata={filename}", - f"--output={filename}.profraw"]) +subprocess.check_call( +profgen_args + [f"--perfdata={filename}", f"--output={filename}.profraw"] +) return 0 def dtrace(args): parser = argparse.ArgumentParser( `` https://github.com/llvm/llvm-project/pull/79942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Amir Ayupov (aaupov) Changes Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 Test Plan: Added CSSPGO.cmake with same use as PGO.cmake, e.g. for bootstrapped ThinLTO+CSSPGO: ``` cmake -B csspgo -S /path/to/llvm-project/llvm \ -DLLVM_ENABLE_LLD=ON -DBOOTSTRAP_LLVM_ENABLE_LLD=ON \ -DBOOTSTRAP_BOOTSTRAP_LLVM_ENABLE_LLD=ON \ -DPGO_INSTRUMENT_LTO=Thin \ -GNinja -C/path/to/llvm-project/clang/cmake/caches/CSSPGO.cmake ninja stage2 ``` --- Full diff: https://github.com/llvm/llvm-project/pull/79942.diff 8 Files Affected: - (modified) clang/CMakeLists.txt (+11-1) - (added) clang/cmake/caches/CSSPGO.cmake (+3) - (modified) clang/utils/perf-training/CMakeLists.txt (+30-2) - (modified) clang/utils/perf-training/lit.cfg (+6) - (modified) clang/utils/perf-training/lit.site.cfg.in (+1) - (modified) clang/utils/perf-training/perf-helper.py (+44-10) - (modified) llvm/CMakeLists.txt (+3) - (modified) llvm/cmake/modules/HandleLLVMOptions.cmake (+25-1) ``diff diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 601f40902fa34..489a097cd49c8 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -14,8 +14,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PERF_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + 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} perf.data COMMENT "Clearing old profraw data") if(NOT LLVM_PROFDATA) @@ -26,9 +51,12 @@ 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 "${P
[llvm] [clang] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED (PR #79942)
https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/79942 Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 Test Plan: Added CSSPGO.cmake with same use as PGO.cmake, e.g. for bootstrapped ThinLTO+CSSPGO: ``` cmake -B csspgo -S /path/to/llvm-project/llvm \ -DLLVM_ENABLE_LLD=ON -DBOOTSTRAP_LLVM_ENABLE_LLD=ON \ -DBOOTSTRAP_BOOTSTRAP_LLVM_ENABLE_LLD=ON \ -DPGO_INSTRUMENT_LTO=Thin \ -GNinja -C/path/to/llvm-project/clang/cmake/caches/CSSPGO.cmake ninja stage2 ``` >From 90686f2cd5e210f9ca974c10f8c1224a825c1315 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 19 Jul 2023 20:30:29 -0700 Subject: [PATCH] [Clang][CMake] Add CSSPGO support to LLVM_BUILD_INSTRUMENTED Build on Clang-BOLT infrastructure to collect sample profiles for CSSPGO. Add clang/cmake/caches/CSSPGO.cmake to automate CSSPGO Clang build. Differential Revision: https://reviews.llvm.org/D155419 --- clang/CMakeLists.txt | 12 - clang/cmake/caches/CSSPGO.cmake| 3 ++ clang/utils/perf-training/CMakeLists.txt | 32 - clang/utils/perf-training/lit.cfg | 6 +++ clang/utils/perf-training/lit.site.cfg.in | 1 + clang/utils/perf-training/perf-helper.py | 54 ++ llvm/CMakeLists.txt| 3 ++ llvm/cmake/modules/HandleLLVMOptions.cmake | 26 ++- 8 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 clang/cmake/caches/CSSPGO.cmake diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 47fc2e4886cfc..5d16442ac7bc3 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -741,11 +741,21 @@ if (CLANG_ENABLE_BOOTSTRAP) if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps llvm-profdata) set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) +string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) +if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + add_dependencies(clang-bootstrap-deps llvm-profgen) + list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen) +endif() endif() if(LLVM_BUILD_INSTRUMENTED) +string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED) add_dependencies(clang-bootstrap-deps generate-profdata) -set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") + set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +else() + set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) +endif() # Use the current tools for LTO instead of the instrumented ones list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH CMAKE_CXX_COMPILER diff --git a/clang/cmake/caches/CSSPGO.cmake b/clang/cmake/caches/CSSPGO.cmake new file mode 100644 index 0..34159068d5ea3 --- /dev/null +++ b/clang/cmake/caches/CSSPGO.cmake @@ -0,0 +1,3 @@ +set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") +set(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED "CSSPGO" CACHE STRING "") +include(${CMAKE_CURRENT_LIST_DIR}/PGO.cmake) diff --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt index 601f40902fa34..489a097cd49c8 100644 --- a/clang/utils/perf-training/CMakeLists.txt +++ b/clang/utils/perf-training/CMakeLists.txt @@ -14,8 +14,33 @@ if(LLVM_BUILD_INSTRUMENTED) DEPENDS clang clear-profraw ${CLANG_PERF_TRAINING_DEPS} ) + add_custom_target(generate-profdata-deps) + string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED) + if (uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO") +set(PROFDATA_SAMPLE "--sample") +if(NOT LLVM_PROFGEN) + find_program(LLVM_PROFGEN llvm-profgen) +endif() + +if(NOT LLVM_PROFGEN) + message(STATUS "To enable converting CSSPGO samples LLVM_PROFGEN has to point to llvm-profgen") +endif() + +# Convert perf profiles into profraw +add_custom_target(convert-perf-profraw + COMMAND "${Python3_EXECUTABLE}" + ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py perf2prof ${LLVM_PROFGEN} + $ ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Converting perf profiles into profraw" + DEPENDS generate-profraw) +add_dependencies(generate-profdata-deps convert-perf-profraw) + else() +add_dependencies(generate-profdata-deps generate-profraw) + endif() + 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} perf.data COMMENT "Clearing old p