From 20955e6c2a24ec27a28e442336d70870ca830242 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Apr 2026 19:13:25 +0200 Subject: [PATCH] gh-148535: Don't use gcc -fprofile-update=atomic flag on i686 (#148554) The -fprofile-update=atomic flag was added to fix a random GCC internal error on PGO build (gh-145801) caused by corruption of profile data (.gcda files). The problem is that it makes the PGO build way slower (up to 47x slower) on i686. Since the GCC internal error was not seen on i686 so far, don't use -fprofile-update=atomic on i686. (cherry picked from commit 2faceeec5c0fb06498a9654d429180ac4610c65a) --- ...-04-14-15-20-29.gh-issue-148535.JjKiaa.rst | 6 ++ configure | 57 ++++++++++++++++++- configure.ac | 30 ++++++++-- 3 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2026-04-14-15-20-29.gh-issue-148535.JjKiaa.rst diff --git a/Misc/NEWS.d/next/Build/2026-04-14-15-20-29.gh-issue-148535.JjKiaa.rst b/Misc/NEWS.d/next/Build/2026-04-14-15-20-29.gh-issue-148535.JjKiaa.rst new file mode 100644 index 00000000000000..39f37acb14e098 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-04-14-15-20-29.gh-issue-148535.JjKiaa.rst @@ -0,0 +1,6 @@ +No longer use the ``gcc -fprofile-update=atomic`` flag on i686. The flag has +been added to fix a random GCC internal error on PGO build (:gh:`145801`) +caused by corruption of profile data (.gcda files). The problem is that it +makes the PGO build way slower (up to 47x slower) on i686. Since the GCC +internal error was not seen on i686 so far, don't use +``-fprofile-update=atomic`` on i686 anymore. Patch by Victor Stinner. diff --git a/configure b/configure index 9ddb712b5344d4..05ce5e13e83236 100755 --- a/configure +++ b/configure @@ -8990,7 +8990,55 @@ case "$CC_BASENAME" in fi ;; *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fprofile-update=atomic" >&5 + # Check for 32-bit x86 ISA + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for i686" >&5 +printf %s "checking for i686... " >&6; } +if test ${ac_cv_i686+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #ifdef __i386__ + # error "i386" + #endif + +int +main (void) +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_i686=no +else $as_nop + ac_cv_i686=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_i686" >&5 +printf "%s\n" "$ac_cv_i686" >&6; } + + PGO_PROF_GEN_FLAG="-fprofile-generate" + + # Use -fprofile-update=atomic to fix a random GCC internal error on PGO + # build (gh-145801) caused by corruption of profile data (.gcda files). + # + # gh-148535: On i686, using -fprofile-update=atomic makes the PGO build + # way slower (up to 47x slower). So far, the GCC internal error on PGO + # build was not seen on i686, so don't use this flag on i686. + if test "x$ac_cv_i686" = xno +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fprofile-update=atomic" >&5 printf %s "checking whether C compiler accepts -fprofile-update=atomic... " >&6; } if test ${ax_cv_check_cflags___fprofile_update_atomic+y} then : @@ -9023,9 +9071,12 @@ fi printf "%s\n" "$ax_cv_check_cflags___fprofile_update_atomic" >&6; } if test "x$ax_cv_check_cflags___fprofile_update_atomic" = xyes then : - PGO_PROF_GEN_FLAG="-fprofile-generate -fprofile-update=atomic" + PGO_PROF_GEN_FLAG="$PGO_PROF_GEN_FLAG -fprofile-update=atomic" else $as_nop - PGO_PROF_GEN_FLAG="-fprofile-generate" + : +fi + + fi PGO_PROF_USE_FLAG="-fprofile-use -fprofile-correction" diff --git a/configure.ac b/configure.ac index d9acfce793e533..50fe837e99658f 100644 --- a/configure.ac +++ b/configure.ac @@ -2137,10 +2137,32 @@ case "$CC_BASENAME" in fi ;; *) - AX_CHECK_COMPILE_FLAG( - [-fprofile-update=atomic], - [PGO_PROF_GEN_FLAG="-fprofile-generate -fprofile-update=atomic"], - [PGO_PROF_GEN_FLAG="-fprofile-generate"]) + # Check for 32-bit x86 ISA + AC_CACHE_CHECK([for i686], [ac_cv_i686], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + #ifdef __i386__ + # error "i386" + #endif + ], []) + ],[ac_cv_i686=no],[ac_cv_i686=yes]) + ]) + + PGO_PROF_GEN_FLAG="-fprofile-generate" + + # Use -fprofile-update=atomic to fix a random GCC internal error on PGO + # build (gh-145801) caused by corruption of profile data (.gcda files). + # + # gh-148535: On i686, using -fprofile-update=atomic makes the PGO build + # way slower (up to 47x slower). So far, the GCC internal error on PGO + # build was not seen on i686, so don't use this flag on i686. + AS_VAR_IF([ac_cv_i686], [no], [ + AX_CHECK_COMPILE_FLAG( + [-fprofile-update=atomic], + [PGO_PROF_GEN_FLAG="$PGO_PROF_GEN_FLAG -fprofile-update=atomic"], + []) + ]) + PGO_PROF_USE_FLAG="-fprofile-use -fprofile-correction" LLVM_PROF_MERGER="true" LLVM_PROF_FILE=""