Commit b06cda0c187 for php.net

commit b06cda0c187200a81c038139e243c8afe1763579
Author: Marc <m@pyc.ac>
Date:   Wed Sep 16 13:56:41 2026 +0200

    perf: fix LTO build with gcc (hybrid VM) (#23602)

diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 41da8344bf1..6353ea2ec7a 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -331,6 +331,24 @@ AS_VAR_IF([php_cv_have_global_register_vars], [yes],
 ])
 AC_MSG_CHECKING([whether to enable global register variables support])
 AC_MSG_RESULT([$ZEND_GCC_GLOBAL_REGS])
+
+dnl GCC doesn't propagate -ffixed-* from LTO objects. Reserve the VM registers
+dnl before LTO code gen to avoid "global register variable follows a function definition"
+AS_VAR_IF([ZEND_GCC_GLOBAL_REGS], [yes], [
+  zend_lto=no
+  for zend_flag in $CC $CFLAGS $LDFLAGS; do
+    AS_CASE([$zend_flag], [-flto|-flto=*], [zend_lto=yes], [-fno-lto], [zend_lto=no])
+  done
+  AS_VAR_IF([zend_lto], [yes], [
+    AS_CASE([$host_cpu],
+      [x86_64*|amd64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-r14 -ffixed-r15"])],
+      [x86*|amd*|i?86*|pentium], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-esi -ffixed-edi"])],
+      [aarch64*|arm64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-x27 -ffixed-x28"])],
+      [ppc64*|powerpc64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-r14 -ffixed-r15"])],
+      [riscv64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-x18 -ffixed-x19"])],
+      [AC_MSG_ERROR([Cannot reserve VM registers for LTO, disable LTO or use --disable-gcc-global-regs])])
+  ])
+])
 ])

 dnl
diff --git a/build/ltmain.sh b/build/ltmain.sh
index 3e6a3db3a5a..c299766165b 100755
--- a/build/ltmain.sh
+++ b/build/ltmain.sh
@@ -7705,6 +7705,7 @@ func_mode_link ()
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
       # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -ffixed-*, -fno-lto  GCC LTO register reservations and cancellation
       # -specs=*             GCC specs files
       # -stdlib=*            select c++ std lib with clang
       # -fdiagnostics-color* simply affects output
@@ -7725,6 +7726,7 @@ func_mode_link ()
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
       -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \
+      -ffixed-*|-fno-lto| \
       -stdlib=*|-rtlib=*|--unwindlib=*| \
       -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \
       -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \