https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119430
--- Comment #22 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Richard Earnshaw <[email protected]>: https://gcc.gnu.org/g:f5166f5badb190eec5d3707fe25ad33febf1969e commit r16-6650-gf5166f5badb190eec5d3707fe25ad33febf1969e Author: Alexandre Oliva <[email protected]> Date: Thu Jul 10 22:21:31 2025 -0300 arm: prevent impossible tail- long-calls with static chain [PR119430] When a function call uses up all argument registers, and needs IP for the static chain, there aren't any call-clobbered registers left for reload to assign as the sibcall target, when -mlong-calls is enabled. Use the same logic that does the job for indirect calls to prevent tail calls in this case. With this change, it is possible to bootstrap armv7a-linux-gnu with both -O3 and lto, but only with both -mlong-calls and -ffunction-sections. Without -mlong-calls, linker veneer thunks may clobber the static chain register set up by callers in one lto unit, preventing them from reaching the callee in a separate lto unit. -ffunction-sections is required for -mlong-calls to be effective, because both caller and callee are in the same section, and that disables long-calls when !flag_reorder_blocks_and_partition. gcc/ChangeLog PR target/119430 * config/arm/arm.cc (arm_function_ok_for_sibcall): Disable sibcalls for long-calls that use all call-clobbered general-purpose registers, including the static chain.
