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  <rguent...@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;
+ }

Reply via email to