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