diff mbox series

gimple-fold: Remove incorrect folding of debug stmts [PR103691]

Message ID 20220105092533.GQ2646553@tucnak
State New
Headers show
Series gimple-fold: Remove incorrect folding of debug stmts [PR103691] | expand

Commit Message

Jakub Jelinek Jan. 5, 2022, 9:25 a.m. UTC
Hi!

For ADDR_EXPR gimple_debug_bind_get_value fold_stmt_1 uses
maybe_canonicalize_mem_ref_addr earlier and I think that should
resolve the concerns raised in PR52329.  But folding ADDR_EXPR
operand using maybe_fold_reference and then taking address of that
looks like an invalid transformation, it can transform
  # DEBUG D.4293 => &a[0]
into
  # DEBUG D.4293 => &2.0e+0
etc., all we want to allow are the lhs folding of the operand which
maybe_fold_reference no longer does since r12-21-g0bf8cd9d5e8ac.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2022-01-05  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/103691
	* gimple-fold.c (fold_stmt_1): Don't call maybe_fold_reference
	for DEBUG stmts with ADDR_EXPR gimple_debug_bind_get_value,
	it can do unwanted rhs folding like &a[0] into &2.0 etc.

	* gfortran.dg/pr103691.f90: New test.


	Jakub

Comments

Richard Biener Jan. 5, 2022, 9:39 a.m. UTC | #1
On Wed, 5 Jan 2022, Jakub Jelinek wrote:

> Hi!
> 
> For ADDR_EXPR gimple_debug_bind_get_value fold_stmt_1 uses
> maybe_canonicalize_mem_ref_addr earlier and I think that should
> resolve the concerns raised in PR52329.  But folding ADDR_EXPR
> operand using maybe_fold_reference and then taking address of that
> looks like an invalid transformation, it can transform
>   # DEBUG D.4293 => &a[0]
> into
>   # DEBUG D.4293 => &2.0e+0
> etc., all we want to allow are the lhs folding of the operand which
> maybe_fold_reference no longer does since r12-21-g0bf8cd9d5e8ac.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2022-01-05  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR fortran/103691
> 	* gimple-fold.c (fold_stmt_1): Don't call maybe_fold_reference
> 	for DEBUG stmts with ADDR_EXPR gimple_debug_bind_get_value,
> 	it can do unwanted rhs folding like &a[0] into &2.0 etc.
> 
> 	* gfortran.dg/pr103691.f90: New test.
> 
> --- gcc/gimple-fold.c.jj	2022-01-03 10:40:42.872140874 +0100
> +++ gcc/gimple-fold.c	2022-01-04 13:29:17.571321684 +0100
> @@ -6283,8 +6283,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi,
>        if (gimple_debug_bind_p (stmt))
>  	{
>  	  tree val = gimple_debug_bind_get_value (stmt);
> -	  if (val
> -	      && REFERENCE_CLASS_P (val))
> +	  if (val && REFERENCE_CLASS_P (val))
>  	    {
>  	      tree tem = maybe_fold_reference (val);
>  	      if (tem)
> @@ -6292,18 +6291,6 @@ fold_stmt_1 (gimple_stmt_iterator *gsi,
>  		  gimple_debug_bind_set_value (stmt, tem);
>  		  changed = true;
>  		}
> -	    }
> -	  else if (val
> -		   && TREE_CODE (val) == ADDR_EXPR)
> -	    {
> -	      tree ref = TREE_OPERAND (val, 0);
> -	      tree tem = maybe_fold_reference (ref);
> -	      if (tem)
> -		{
> -		  tem = build_fold_addr_expr_with_type (tem, TREE_TYPE (val));
> -		  gimple_debug_bind_set_value (stmt, tem);
> -		  changed = true;
> -		}
>  	    }
>  	}
>        break;
> --- gcc/testsuite/gfortran.dg/pr103691.f90.jj	2022-01-04 13:31:23.564557726 +0100
> +++ gcc/testsuite/gfortran.dg/pr103691.f90	2022-01-04 13:31:08.053774883 +0100
> @@ -0,0 +1,9 @@
> +! PR fortran/103691
> +! { dg-do compile }
> +! { dg-options "-O2 -g" }
> +
> +program pr103691
> +  real, parameter :: a(0) = 2.0
> +  real, allocatable :: b(:)
> +  allocate (b, mold=a)
> +end
> 
> 	Jakub
> 
>
diff mbox series

Patch

--- gcc/gimple-fold.c.jj	2022-01-03 10:40:42.872140874 +0100
+++ gcc/gimple-fold.c	2022-01-04 13:29:17.571321684 +0100
@@ -6283,8 +6283,7 @@  fold_stmt_1 (gimple_stmt_iterator *gsi,
       if (gimple_debug_bind_p (stmt))
 	{
 	  tree val = gimple_debug_bind_get_value (stmt);
-	  if (val
-	      && REFERENCE_CLASS_P (val))
+	  if (val && REFERENCE_CLASS_P (val))
 	    {
 	      tree tem = maybe_fold_reference (val);
 	      if (tem)
@@ -6292,18 +6291,6 @@  fold_stmt_1 (gimple_stmt_iterator *gsi,
 		  gimple_debug_bind_set_value (stmt, tem);
 		  changed = true;
 		}
-	    }
-	  else if (val
-		   && TREE_CODE (val) == ADDR_EXPR)
-	    {
-	      tree ref = TREE_OPERAND (val, 0);
-	      tree tem = maybe_fold_reference (ref);
-	      if (tem)
-		{
-		  tem = build_fold_addr_expr_with_type (tem, TREE_TYPE (val));
-		  gimple_debug_bind_set_value (stmt, tem);
-		  changed = true;
-		}
 	    }
 	}
       break;
--- gcc/testsuite/gfortran.dg/pr103691.f90.jj	2022-01-04 13:31:23.564557726 +0100
+++ gcc/testsuite/gfortran.dg/pr103691.f90	2022-01-04 13:31:08.053774883 +0100
@@ -0,0 +1,9 @@ 
+! PR fortran/103691
+! { dg-do compile }
+! { dg-options "-O2 -g" }
+
+program pr103691
+  real, parameter :: a(0) = 2.0
+  real, allocatable :: b(:)
+  allocate (b, mold=a)
+end