[PATCH] Fix PR48134

Richard Guenther rguenther@suse.de
Thu Mar 17 14:56:00 GMT 2011


This fixes PR48134, when propagating into debug-stmts we should fold
them, like we do elsewhere.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-03-17  Richard Guenther  <rguenther@suse.de>

	PR middle-end/48134
	* tree-ssa.c (insert_debug_temp_for_var_def): If we propagated
	a value make sure to fold the statement.

	* gcc.dg/pr48134.c: New testcase.

Index: gcc/tree-ssa.c
===================================================================
*** gcc/tree-ssa.c	(revision 171086)
--- gcc/tree-ssa.c	(working copy)
*************** insert_debug_temp_for_var_def (gimple_st
*** 455,467 ****
  	continue;
  
        if (value)
! 	FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
! 	  /* unshare_expr is not needed here.  vexpr is either a
! 	     SINGLE_RHS, that can be safely shared, some other RHS
! 	     that was unshared when we found it had a single debug
! 	     use, or a DEBUG_EXPR_DECL, that can be safely
! 	     shared.  */
! 	  SET_USE (use_p, value);
        else
  	gimple_debug_bind_reset_value (stmt);
  
--- 455,473 ----
  	continue;
  
        if (value)
! 	{
! 	  FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
! 	    /* unshare_expr is not needed here.  vexpr is either a
! 	       SINGLE_RHS, that can be safely shared, some other RHS
! 	       that was unshared when we found it had a single debug
! 	       use, or a DEBUG_EXPR_DECL, that can be safely
! 	       shared.  */
! 	    SET_USE (use_p, value);
! 	  /* If we didn't replace uses with a debug decl fold the
! 	     resulting expression.  Otherwise we end up with invalid IL.  */
! 	  if (TREE_CODE (value) != DEBUG_EXPR_DECL)
! 	    fold_stmt_inplace (stmt);
! 	}
        else
  	gimple_debug_bind_reset_value (stmt);
  
Index: gcc/testsuite/gcc.dg/pr48134.c
===================================================================
*** gcc/testsuite/gcc.dg/pr48134.c	(revision 0)
--- gcc/testsuite/gcc.dg/pr48134.c	(revision 0)
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fstack-check=specific -fno-tree-dse -fno-tree-fre -fno-tree-loop-optimize -g" } */
+ 
+ struct S
+ {
+   int w, z;
+ };
+ struct T
+ {
+   struct S s;
+ };
+ 
+ int i;
+ 
+ static inline struct S
+ bar (struct S x)
+ {
+   i++;
+   return x;
+ }
+ 
+ int
+ foo (struct T t, struct S s)
+ {
+   struct S *c = &s;
+   if (i)
+     c = &t.s;
+   t.s.w = 3;
+   s = bar (*c);
+   return t.s.w;
+ }



More information about the Gcc-patches mailing list