diff mbox

Fix up execute_update_addresses_taken for debug stmts (PR tree-optimization/49000)

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

Commit Message

Jakub Jelinek May 18, 2011, 6:14 a.m. UTC
Hi!

When an addressable var is optimized into non-addressable, we didn't
clean up MEM_REFs containing ADDR_EXPR of such VARs in debug stmts.  This
got later on folded into the var itself and caused ssa verification errors.
Fixed by trying to rewrite it and if it fails, resetting.

Bootstrapped/regtested on x86_64-linux and i686-linux, no change in cc1plus
.debug_info/.debug_loc, implicitptr.c testcase still works too.
Ok for trunk/4.6?

2011-05-18  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/49000
	* tree-ssa.c (execute_update_addresses_taken): Call
	maybe_rewrite_mem_ref_base on debug stmt value.  If it couldn't
	be rewritten and decl has been marked for renaming, reset
	the debug stmt.

	* gcc.dg/pr49000.c: New test.


	Jakub

Comments

Richard Biener May 18, 2011, 9 a.m. UTC | #1
On Wed, May 18, 2011 at 8:14 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> When an addressable var is optimized into non-addressable, we didn't
> clean up MEM_REFs containing ADDR_EXPR of such VARs in debug stmts.  This
> got later on folded into the var itself and caused ssa verification errors.
> Fixed by trying to rewrite it and if it fails, resetting.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, no change in cc1plus
> .debug_info/.debug_loc, implicitptr.c testcase still works too.
> Ok for trunk/4.6?

Ok.

Thanks,
Richard.

> 2011-05-18  Jakub Jelinek  <jakub@redhat.com>
>
>        PR tree-optimization/49000
>        * tree-ssa.c (execute_update_addresses_taken): Call
>        maybe_rewrite_mem_ref_base on debug stmt value.  If it couldn't
>        be rewritten and decl has been marked for renaming, reset
>        the debug stmt.
>
>        * gcc.dg/pr49000.c: New test.
>
> --- gcc/tree-ssa.c.jj   2011-05-11 19:39:04.000000000 +0200
> +++ gcc/tree-ssa.c      2011-05-17 18:20:10.000000000 +0200
> @@ -2230,6 +2230,17 @@ execute_update_addresses_taken (void)
>                  }
>              }
>
> +           else if (gimple_debug_bind_p (stmt)
> +                    && gimple_debug_bind_has_value_p (stmt))
> +             {
> +               tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
> +               tree decl;
> +               maybe_rewrite_mem_ref_base (valuep);
> +               decl = non_rewritable_mem_ref_base (*valuep);
> +               if (decl && symbol_marked_for_renaming (decl))
> +                 gimple_debug_bind_reset_value (stmt);
> +             }
> +
>            if (gimple_references_memory_p (stmt)
>                || is_gimple_debug (stmt))
>              update_stmt (stmt);
> --- gcc/testsuite/gcc.dg/pr49000.c.jj   2011-05-17 18:30:10.000000000 +0200
> +++ gcc/testsuite/gcc.dg/pr49000.c      2011-05-17 18:23:16.000000000 +0200
> @@ -0,0 +1,29 @@
> +/* PR tree-optimization/49000 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +
> +static
> +foo (int x, int y)
> +{
> +  return x * y;
> +}
> +
> +static int
> +bar (int *z)
> +{
> +  return *z;
> +}
> +
> +void
> +baz (void)
> +{
> +  int a = 42;
> +  int *b = &a;
> +  foo (bar (&a), 3);
> +}
> +
> +void
> +test (void)
> +{
> +  baz ();
> +}
>
>        Jakub
>
diff mbox

Patch

--- gcc/tree-ssa.c.jj	2011-05-11 19:39:04.000000000 +0200
+++ gcc/tree-ssa.c	2011-05-17 18:20:10.000000000 +0200
@@ -2230,6 +2230,17 @@  execute_update_addresses_taken (void)
 		  }
 	      }
 
+	    else if (gimple_debug_bind_p (stmt)
+		     && gimple_debug_bind_has_value_p (stmt))
+	      {
+		tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
+		tree decl;
+		maybe_rewrite_mem_ref_base (valuep);
+		decl = non_rewritable_mem_ref_base (*valuep);
+		if (decl && symbol_marked_for_renaming (decl))
+		  gimple_debug_bind_reset_value (stmt);
+	      }
+
 	    if (gimple_references_memory_p (stmt)
 		|| is_gimple_debug (stmt))
 	      update_stmt (stmt);
--- gcc/testsuite/gcc.dg/pr49000.c.jj	2011-05-17 18:30:10.000000000 +0200
+++ gcc/testsuite/gcc.dg/pr49000.c	2011-05-17 18:23:16.000000000 +0200
@@ -0,0 +1,29 @@ 
+/* PR tree-optimization/49000 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+static
+foo (int x, int y)
+{
+  return x * y;
+}
+
+static int
+bar (int *z)
+{
+  return *z;
+}
+
+void
+baz (void)
+{
+  int a = 42;
+  int *b = &a;
+  foo (bar (&a), 3);
+}
+
+void
+test (void)
+{
+  baz ();
+}