[PATCH] Fix execute_update_addresses_taken for loop closed SSA form (PR tree-optimization/48739)

Richard Guenther richard.guenther@gmail.com
Sat Aug 20 11:07:00 GMT 2011


On Fri, Aug 19, 2011 at 9:07 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> If some variable is optimized from TREE_ADDRESSABLE into a gimple var
> during execute_update_addresses_taken while in loop closed SSA form,
> it might not be rewritten into loop closed SSA form, thus either fail
> verification, or following loop passes might miscompile something.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk/4.6?

Ok.

Thanks,
Richard.

> 2011-08-19  Jakub Jelinek  <jakub@redhat.com>
>
>        PR tree-optimization/48739
>        * tree-ssa.c: Include cfgloop.h.
>        (execute_update_addresses_taken): When updating ssa, if in
>        loop closed SSA form, call rewrite_into_loop_closed_ssa instead of
>        update_ssa.
>        * Makefile.in (tree-ssa.o): Depend on $(CFGLOOP_H).
>
>        * gcc.dg/pr48739-1.c: New test.
>        * gcc.dg/pr48739-2.c: New test.
>
> --- gcc/tree-ssa.c.jj   2011-08-18 08:36:00.000000000 +0200
> +++ gcc/tree-ssa.c      2011-08-19 18:51:18.000000000 +0200
> @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.
>  #include "tree-dump.h"
>  #include "tree-pass.h"
>  #include "diagnostic-core.h"
> +#include "cfgloop.h"
>
>  /* Pointer map of variable mappings, keyed by edge.  */
>  static struct pointer_map_t *edge_var_maps;
> @@ -2208,7 +2209,10 @@ execute_update_addresses_taken (void)
>          }
>
>       /* Update SSA form here, we are called as non-pass as well.  */
> -      update_ssa (TODO_update_ssa);
> +      if (number_of_loops () > 1 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
> +       rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
> +      else
> +       update_ssa (TODO_update_ssa);
>     }
>
>   BITMAP_FREE (not_reg_needs);
> --- gcc/Makefile.in.jj  2011-08-18 08:36:01.000000000 +0200
> +++ gcc/Makefile.in     2011-08-19 18:55:17.000000000 +0200
> @@ -2405,7 +2405,7 @@ tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $
>    $(TREE_DUMP_H) langhooks.h $(TREE_PASS_H) $(BASIC_BLOCK_H) $(BITMAP_H) \
>    $(FLAGS_H) $(GGC_H) $(HASHTAB_H) pointer-set.h \
>    $(GIMPLE_H) $(TREE_INLINE_H) $(TARGET_H) tree-pretty-print.h \
> -   gimple-pretty-print.h
> +   gimple-pretty-print.h $(CFGLOOP_H)
>  tree-into-ssa.o : tree-into-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
>    $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
>    $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
> --- gcc/testsuite/gcc.dg/pr48739-1.c.jj 2011-08-19 18:53:43.000000000 +0200
> +++ gcc/testsuite/gcc.dg/pr48739-1.c    2011-08-19 18:53:26.000000000 +0200
> @@ -0,0 +1,27 @@
> +/* PR tree-optimization/48739 */
> +/* { dg-do compile } */
> +/* { dg-require-effective-target pthread } */
> +/* { dg-options "-O1 -ftree-parallelize-loops=2 -fno-tree-dominator-opts" } */
> +
> +extern int g;
> +extern void bar (void);
> +
> +int
> +foo (int x)
> +{
> +  int a, b, *c = (int *) 0;
> +  for (a = 0; a < 10; ++a)
> +    {
> +      bar ();
> +      for (b = 0; b < 5; ++b)
> +       {
> +         x = 0;
> +         c = &x;
> +         g = 1;
> +       }
> +    }
> +  *c = x;
> +  for (x = 0; x != 10; x++)
> +    ;
> +  return g;
> +}
> --- gcc/testsuite/gcc.dg/pr48739-2.c.jj 2011-08-19 18:53:43.000000000 +0200
> +++ gcc/testsuite/gcc.dg/pr48739-2.c    2011-08-19 18:54:00.000000000 +0200
> @@ -0,0 +1,27 @@
> +/* PR tree-optimization/48739 */
> +/* { dg-do compile } */
> +/* { dg-require-effective-target pthread } */
> +/* { dg-options "-O1 -ftree-parallelize-loops=2 -fno-tree-dominator-opts" } */
> +
> +extern int g, v[10];
> +extern void bar (void);
> +
> +int
> +foo (int x)
> +{
> +  int a, b, *c = (int *) 0;
> +  for (a = 0; a < 10; ++a)
> +    {
> +      bar ();
> +      for (b = 0; b < 5; ++b)
> +       {
> +         x = 0;
> +         c = &x;
> +         g = 1;
> +       }
> +    }
> +  *c = x;
> +  for (x = 0; x != 10; x++)
> +    v[x] = x;
> +  return g;
> +}
>
>        Jakub
>



More information about the Gcc-patches mailing list