diff --git a/CMakeLists.txt b/CMakeLists.txt index 21b997134b..b0e41612c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,12 +337,25 @@ if(TEST_SUITE_COLLECT_STATS) list(APPEND CFLAGS -save-stats=obj) list(APPEND CXXFLAGS -save-stats=obj) # Collect stats for LTO step too. - if (${CMAKE_C_FLAGS} MATCHES ".*-flto.*" AND - ${CMAKE_CXX_FLAGS} MATCHES ".*-flto.*") + if ((${CMAKE_C_FLAGS} MATCHES ".*-flto.*" AND + ${CMAKE_CXX_FLAGS} MATCHES ".*-flto.*") OR + CMAKE_INTERPROCEDURAL_OPTIMIZATION) list(APPEND LDFLAGS -save-stats=obj) endif() endif() +# When CMAKE_INTERPROCEDURAL_OPTIMIZATION is set, CMake implicitly uses +# -flto=thin on Clang, but -flto=auto on GCC. Append -flto=auto on Clang so they +# are equivalent. This needs to be done in CFLAGS/CXXFLAGS/LDFLAGS so it appears +# after -flto=thin and overrides it. +# https://gitlab.kitware.com/cmake/cmake/-/blob/b65b7687cc541265f894567174a4c0ee65ea03d6/Modules/Compiler/Clang.cmake#L78-82 +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_INTERPROCEDURAL_OPTIMIZATION + AND NOT TEST_SUITE_THIN_LTO) + list(APPEND CFLAGS -flto=auto) + list(APPEND CXXFLAGS -flto=auto) + list(APPEND LDFLAGS -flto=auto) +endif() + # Detect and include subdirectories # This allows to: Place additional test-suites into the toplevel test-suite # directory where they will be picked up automatically. Alternatively you may diff --git a/cmake/caches/OfastLTO.cmake b/cmake/caches/OfastLTO.cmake index c24eb394a4..644e9ddd17 100644 --- a/cmake/caches/OfastLTO.cmake +++ b/cmake/caches/OfastLTO.cmake @@ -1,4 +1,5 @@ -set(OPTFLAGS "${OPTFLAGS} -Ofast -flto") +set(OPTFLAGS "${OPTFLAGS} -Ofast") set(CMAKE_C_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_CXX_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON CACHE BOOL "") diff --git a/cmake/caches/OsLTO.cmake b/cmake/caches/OsLTO.cmake index 469c3f34a2..5c5d6c42f4 100644 --- a/cmake/caches/OsLTO.cmake +++ b/cmake/caches/OsLTO.cmake @@ -1,5 +1,6 @@ -set(OPTFLAGS "${OPTFLAGS} -Os -flto") +set(OPTFLAGS "${OPTFLAGS} -Os") set(CMAKE_C_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_CXX_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON CACHE BOOL "") diff --git a/cmake/caches/ReleaseLTO.cmake b/cmake/caches/ReleaseLTO.cmake index 0adf468cba..676b33ae38 100644 --- a/cmake/caches/ReleaseLTO.cmake +++ b/cmake/caches/ReleaseLTO.cmake @@ -1,5 +1,5 @@ # Aggressive settings to produce fast code. -set(OPTFLAGS "${OPTFLAGS} -O3 -fomit-frame-pointer -flto -DNDEBUG") +set(OPTFLAGS "${OPTFLAGS} -O3 -fomit-frame-pointer -DNDEBUG") if(APPLE) set(OPTFLAGS "${OPTFLAGS} -mdynamic-no-pic") endif() @@ -7,3 +7,4 @@ endif() set(CMAKE_C_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_CXX_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON CACHE BOOL "") diff --git a/cmake/caches/ReleaseThinLTO.cmake b/cmake/caches/ReleaseThinLTO.cmake index f8dc62f2e2..3f7ff52269 100644 --- a/cmake/caches/ReleaseThinLTO.cmake +++ b/cmake/caches/ReleaseThinLTO.cmake @@ -1,4 +1,4 @@ -set(OPTFLAGS "${OPTFLAGS} -O3 -fomit-frame-pointer -flto=thin -DNDEBUG") +set(OPTFLAGS "${OPTFLAGS} -O3 -fomit-frame-pointer -DNDEBUG") if(APPLE) set(OPTFLAGS "${OPTFLAGS} -mdynamic-no-pic") endif() @@ -6,3 +6,5 @@ endif() set(CMAKE_C_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_CXX_FLAGS_RELEASE "${OPTFLAGS}" CACHE STRING "") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON CACHE BOOL "") +set(TEST_SUITE_THIN_LTO ON CACHE BOOL "")