On 11/07/2025 02:21, Alexandre Oliva wrote:
> 
> When a function call uses up all argument registers, and needs IP for
> the static chain, there isn't any call-clobbered register 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.
> 
> Regstrapped on armv7a-linux-gnu with the caveats above.  Ok to install?
> 
> 
> for  gcc/ChangeLog
> 
>       PR target/119430
>       * gcc/config/arm.cc (arm_function_ok_for_sibcall): Disable
>       sibcalls for long-calls that use all call-clobbered
>       general-purpose registers, including the static chain.

I just noticed that this never got reviewed.  Sorry about that.

I tweaked the comment above this section and fixed the commit message before 
pushing it

Thanks for the patch.

R.

> ---
>  gcc/config/arm/arm.cc |    9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> index bde06f3fa8664..8956b8a645f2c 100644
> --- a/gcc/config/arm/arm.cc
> +++ b/gcc/config/arm/arm.cc
> @@ -7946,9 +7946,12 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>       function arguments, then we can only use IP.  But IP may be needed in 
> the
>       epilogue (for PAC validation), or for passing the static chain.  We have
>       to disable the tail call if nothing is available.  */
> -  if (!decl
> -      && ((CALL_EXPR_BY_DESCRIPTOR (exp) && !flag_trampolines)
> -       || arm_current_function_pac_enabled_p()))
> +  if ((!decl
> +       && ((CALL_EXPR_BY_DESCRIPTOR (exp) && !flag_trampolines)
> +        || arm_current_function_pac_enabled_p ()))
> +      || (decl && arm_is_long_call_p (decl)
> +       && (CALL_EXPR_STATIC_CHAIN (exp)
> +           || arm_current_function_pac_enabled_p ())))
>      {
>        tree fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
>        CUMULATIVE_ARGS cum;
> 
> 

Reply via email to