diff mbox

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

Message ID 20110819190706.GI2687@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Aug. 19, 2011, 7:07 p.m. UTC
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  <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.


	Jakub

Comments

Richard Biener Aug. 20, 2011, 7:24 a.m. UTC | #1
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
>
diff mbox

Patch

--- 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;
+}