[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