On Fri, 4 Apr 2025, Jakub Jelinek wrote:

> Hi!
> 
> As the first two testcases show, even with pointers IPA-VRP can optimize
> return values from functions if they have singleton ranges into just the
> exact value, so we need to virtually undo that for tail calls similarly
> to integers and floats.  The third test just adds check that it works
> even with floats (which it does).
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2025-04-04  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/119614
>       * tree-tailcall.cc (find_tail_calls): Handle also pointer types in the
>       IPA-VRP workaround.
> 
>       * c-c++-common/pr119614-1.c: New test.
>       * c-c++-common/pr119614-2.c: New test.
>       * c-c++-common/pr119614-3.c: New test.
> 
> --- gcc/tree-tailcall.cc.jj   2025-04-02 20:02:24.303939759 +0200
> +++ gcc/tree-tailcall.cc      2025-04-03 22:10:57.018048523 +0200
> @@ -1036,7 +1036,9 @@ find_tail_calls (basic_block bb, struct
>         && TREE_CONSTANT (ret_var))
>       if (tree type = gimple_range_type (call))
>         if (tree callee = gimple_call_fndecl (call))
> -         if ((INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type))
> +         if ((INTEGRAL_TYPE_P (type)
> +              || SCALAR_FLOAT_TYPE_P (type)
> +              || POINTER_TYPE_P (type))
>               && useless_type_conversion_p (TREE_TYPE (TREE_TYPE (callee)),
>                                             type)
>               && useless_type_conversion_p (TREE_TYPE (ret_var), type)
> --- gcc/testsuite/c-c++-common/pr119614-1.c.jj        2025-04-03 
> 22:22:09.060828085 +0200
> +++ gcc/testsuite/c-c++-common/pr119614-1.c   2025-04-03 22:21:26.201416120 
> +0200
> @@ -0,0 +1,28 @@
> +/* PR tree-optimization/119614 */
> +/* { dg-do compile { target musttail } } */
> +/* { dg-options "-O2" } */
> +
> +volatile int v;
> +
> +[[gnu::noinline]] const char *
> +foo (int x)
> +{
> +  v += x;
> +  return 0;
> +}
> +
> +const char *
> +bar (int x)
> +{
> +  if (x == 42)
> +    [[gnu::musttail]] return foo (42);
> +  [[gnu::musttail]] return foo (32);
> +}
> +
> +const char *
> +baz (int x)
> +{
> +  if (x == 5)
> +    return foo (42);
> +  return foo (32);
> +}
> --- gcc/testsuite/c-c++-common/pr119614-2.c.jj        2025-04-03 
> 22:22:12.584779742 +0200
> +++ gcc/testsuite/c-c++-common/pr119614-2.c   2025-04-03 22:21:42.035198879 
> +0200
> @@ -0,0 +1,28 @@
> +/* PR tree-optimization/119614 */
> +/* { dg-do compile { target musttail } } */
> +/* { dg-options "-O2" } */
> +
> +volatile int v;
> +
> +[[gnu::noinline]] const char *
> +foo (int x)
> +{
> +  v += x;
> +  return (const char *) -42;
> +}
> +
> +const char *
> +bar (int x)
> +{
> +  if (x == 42)
> +    [[gnu::musttail]] return foo (42);
> +  [[gnu::musttail]] return foo (32);
> +}
> +
> +const char *
> +baz (int x)
> +{
> +  if (x == 5)
> +    return foo (42);
> +  return foo (32);
> +}
> --- gcc/testsuite/c-c++-common/pr119614-3.c.jj        2025-04-03 
> 22:22:17.302715007 +0200
> +++ gcc/testsuite/c-c++-common/pr119614-3.c   2025-04-03 22:21:51.423070078 
> +0200
> @@ -0,0 +1,28 @@
> +/* PR tree-optimization/119614 */
> +/* { dg-do compile { target musttail } } */
> +/* { dg-options "-O2" } */
> +
> +volatile int v;
> +
> +[[gnu::noinline]] double
> +foo (int x)
> +{
> +  v += x;
> +  return 0.5;
> +}
> +
> +double
> +bar (int x)
> +{
> +  if (x == 42)
> +    [[gnu::musttail]] return foo (42);
> +  [[gnu::musttail]] return foo (32);
> +}
> +
> +double
> +baz (int x)
> +{
> +  if (x == 5)
> +    return foo (42);
> +  return foo (32);
> +}
> 
>       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