On Fri, 21 Mar 2025, Jakub Jelinek wrote:

> Hi!
> 
> The just posted inliner patch can regress musttail calls if we perform
> function splitting and then inline the outlined body back into the original
> (or inline both the small function and outlined large body into something
> else).
> If there are any musttail calls, I think we need to call the outlined
> body using a musttail call, so that the inliner will preserve musttail
> attributes in the body.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2025-03-20  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR ipa/119376
>       * ipa-split.cc (split_function): Call gimple_call_set_must_tail
>       on the call to outlined partition if has_musttail and
>       !add_tsan_func_exit.
> 
>       * g++.dg/opt/musttail1.C: New test.
> 
> --- gcc/ipa-split.cc.jj       2025-01-02 11:23:02.827707968 +0100
> +++ gcc/ipa-split.cc  2025-03-20 13:54:57.541594191 +0100
> @@ -1473,6 +1473,8 @@ split_function (basic_block return_bb, c
>       args_to_pass[i] = arg;
>        }
>    call = gimple_build_call_vec (node->decl, args_to_pass);
> +  if (cur_node->get_fun ()->has_musttail && !add_tsan_func_exit)
> +    gimple_call_set_must_tail (call, true);
>    gimple_set_block (call, DECL_INITIAL (current_function_decl));
>    args_to_pass.release ();
>  
> --- gcc/testsuite/g++.dg/opt/musttail1.C.jj   2025-03-20 15:07:38.236255098 
> +0100
> +++ gcc/testsuite/g++.dg/opt/musttail1.C      2025-03-20 15:08:48.625280661 
> +0100
> @@ -0,0 +1,35 @@
> +// PR ipa/119376
> +// { dg-do compile { target musttail } }
> +// { dg-options "-O2 -fdump-tree-optimized" }
> +// { dg-final { scan-tree-dump-times "  \[^\n\r]* = foo \\\(\[^\n\r]*\\\); 
> \\\[tail call\\\] \\\[must tail call\\\]" 2 "optimized" } }
> +// { dg-final { scan-tree-dump-times "  \[^\n\r]* = foo \\\(\[^\n\r]*\\\); 
> \\\[tail call\\\]" 3 "optimized" } }
> +
> +int foo (int x);
> +typedef int (*F) (int);
> +int v;
> +
> +inline int
> +bar (int x)
> +{
> +  if (__builtin_expect (x == 42, 1))
> +    return 1;
> +  [[gnu::musttail]] return foo (x + v * (x | v) * (x & v) * (x - v) * (x + v 
> * v));
> +}
> +
> +int
> +baz (int x)
> +{
> +  [[gnu::musttail]] return bar (x);
> +}
> +
> +int
> +qux (int x)
> +{
> +  return bar (x + 1);
> +}
> +
> +F
> +corge ()
> +{
> +  return &bar;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to