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? 2011-08-19 Jakub Jelinek <ja...@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