diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index 9fab15abe6404..d67ce982d78ac 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -31,6 +31,26 @@ set(LLVM_LINK_COMPONENTS TransformUtils ) +# Workaround for MSVC ARM64 performance regression: +# https://developercommunity.visualstudio.com/t/Compiling-a-specific-code-for-ARM64-with/10444970 +# Since /O1 and /O2 represent a set of optimizations, +# our goal is to disable the /Og flag while retaining the other optimizations from the /O1|/O2 set +if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES Clang + AND MSVC_VERSION VERSION_GREATER_EQUAL 1932 + AND CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64") + + string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) + string(REGEX MATCHALL "/[Oo][12]" opt_flags "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}") + if (opt_flags) + if(opt_flags MATCHES "1$") + set(opt_flags "/Od;/Os;/Oy;/Ob2;/GF;/Gy") + elseif (opt_flags MATCHES "2$") + set(opt_flags "/Od;/Oi;/Ot;/Oy;/Ob2;/GF;/Gy") + endif() + set_source_files_properties(CGBuiltin.cpp PROPERTIES COMPILE_OPTIONS "${opt_flags}") + endif() +endif() + add_clang_library(clangCodeGen ABIInfo.cpp ABIInfoImpl.cpp diff --git a/clang/lib/Tooling/Inclusions/Stdlib/CMakeLists.txt b/clang/lib/Tooling/Inclusions/Stdlib/CMakeLists.txt index 0f52c3590ac9a..ed323ab3528b1 100644 --- a/clang/lib/Tooling/Inclusions/Stdlib/CMakeLists.txt +++ b/clang/lib/Tooling/Inclusions/Stdlib/CMakeLists.txt @@ -1,3 +1,23 @@ +# Workaround for MSVC ARM64 performance regression: +# https://developercommunity.visualstudio.com/t/Compiling-a-specific-code-for-ARM64-with/10444970 +# Since /O1 and /O2 represent a set of optimizations, +# our goal is to disable the /Og flag while retaining the other optimizations from the /O1|/O2 set +if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES Clang + AND MSVC_VERSION VERSION_GREATER_EQUAL 1932 + AND CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64") + + string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) + string(REGEX MATCHALL "/[Oo][12]" opt_flags "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}") + if (opt_flags) + if(opt_flags MATCHES "1$") + set(opt_flags "/Od;/Os;/Oy;/Ob2;/GF;/Gy") + elseif (opt_flags MATCHES "2$") + set(opt_flags "/Od;/Oi;/Ot;/Oy;/Ob2;/GF;/Gy") + endif() + set_source_files_properties(StandardLibrary.cpp PROPERTIES COMPILE_OPTIONS "${opt_flags}") + endif() +endif() + add_clang_library(clangToolingInclusionsStdlib StandardLibrary.cpp