[PATCH] Fix ipa-split if there are extra PHIs on the return_bb (PR tree-optimization/46130)

Richard Guenther richard.guenther@gmail.com
Thu Jan 20 10:31:00 GMT 2011


On Wed, Jan 19, 2011 at 9:02 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> ipa-split fixes the (single) virtual operand PHI and at most one normal PHI
> - if it returns a gimple value from the *.part.* function.  If there are
> other PHIs, it will ICE because nothing fixes them up (we'd need function
> with multiple return values for them).  Generally this should happen only
> if DCE didn't do a good job.  In whole x86_64-linux and i686-linux
> bootstraps/regtests this triggered just on the added testcases.
>
> Bootstrapped/regtested on those 2 targets, ok for trunk?

Ok.

Thanks,
Richard.

> 2011-01-19  Jakub Jelinek  <jakub@redhat.com>
>
>        PR tree-optimization/46130
>        * ipa-split.c (consider_split): If return_bb contains non-virtual
>        PHIs other than for retval or if split_function would not adjust it,
>        refuse to split.
>
>        * gcc.dg/pr46130-1.c: New test.
>        * gcc.dg/pr46130-2.c: New test.
>
> --- gcc/ipa-split.c.jj  2011-01-19 15:29:25.000000000 +0100
> +++ gcc/ipa-split.c     2011-01-19 18:17:34.000000000 +0100
> @@ -411,9 +411,6 @@ consider_split (struct split_point *curr
>                 "  Refused: split part has non-ssa uses\n");
>       return;
>     }
> -  if (dump_file && (dump_flags & TDF_DETAILS))
> -    fprintf (dump_file, "  Accepted!\n");
> -
>   /* See if retval used by return bb is computed by header or split part.
>      When it is computed by split part, we need to produce return statement
>      in the split part and add code to header to pass it around.
> @@ -451,6 +448,30 @@ consider_split (struct split_point *curr
>   else
>     current->split_part_set_retval = true;
>
> +  /* split_function fixes up at most one PHI non-virtual PHI node in return_bb,
> +     for the return value.  If there are other PHIs, give up.  */
> +  if (return_bb != EXIT_BLOCK_PTR)
> +    {
> +      gimple_stmt_iterator psi;
> +
> +      for (psi = gsi_start_phis (return_bb); !gsi_end_p (psi); gsi_next (&psi))
> +       if (is_gimple_reg (gimple_phi_result (gsi_stmt (psi)))
> +           && !(retval
> +                && current->split_part_set_retval
> +                && TREE_CODE (retval) == SSA_NAME
> +                && !DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))
> +                && SSA_NAME_DEF_STMT (retval) == gsi_stmt (psi)))
> +         {
> +           if (dump_file && (dump_flags & TDF_DETAILS))
> +             fprintf (dump_file,
> +                      "  Refused: return bb has extra PHIs\n");
> +           return;
> +         }
> +    }
> +
> +  if (dump_file && (dump_flags & TDF_DETAILS))
> +    fprintf (dump_file, "  Accepted!\n");
> +
>   /* At the moment chose split point with lowest frequency and that leaves
>      out smallest size of header.
>      In future we might re-consider this heuristics.  */
> --- gcc/testsuite/gcc.dg/pr46130-1.c.jj 2011-01-19 18:24:13.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr46130-1.c    2011-01-19 18:32:07.000000000 +0100
> @@ -0,0 +1,23 @@
> +/* PR tree-optimization/46130 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-tree-dce" } */
> +
> +#include <stdarg.h>
> +
> +static void
> +foo (va_list ap)
> +{
> +  va_arg (ap, char *)[0];
> +}
> +
> +void
> +bar (va_list ap)
> +{
> +  foo (ap);
> +}
> +
> +void
> +baz (va_list ap)
> +{
> +  foo (ap);
> +}
> --- gcc/testsuite/gcc.dg/pr46130-2.c.jj 2011-01-19 18:24:10.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr46130-2.c    2011-01-19 18:24:05.000000000 +0100
> @@ -0,0 +1,32 @@
> +/* PR tree-optimization/46130 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-tree-dce" } */
> +
> +extern int bar (int);
> +
> +static int foo (int x)
> +{
> +  int z, w;
> +  if (x <= 1024)
> +    {
> +      z = 16;
> +      w = 17;
> +    }
> +  else
> +    {
> +      bar (bar (bar (bar (bar (bar (bar (bar (bar (16)))))))));
> +      if (x > 131072)
> +       w = 19;
> +      else
> +       w = 21;
> +      z = 32;
> +    }
> +  w = w + 121;
> +  return z;
> +}
> +
> +int
> +baz (int x)
> +{
> +  return foo (x + 6) + foo (x + 15) + foo (x + 24);
> +}
>
>        Jakub
>



More information about the Gcc-patches mailing list