[backport from gcc-4.7/trunk ] gcc/ 2011-03-17 Richard Guenther 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/testsuite/ 2011-03-17 Richard Guenther PR middle-end/48134 * gcc.dg/pr48134.c: New testcase. --- gcc-4.6-20110318/gcc/testsuite/gcc.dg/pr48134.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.6-20110318/gcc/testsuite/gcc.dg/pr48134.c 2011-03-21 15:33:36.000000000 +0100 @@ -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; +} --- gcc-4.6-20110318/gcc/tree-ssa.c.~1~ 2011-02-15 19:36:31.000000000 +0100 +++ gcc-4.6-20110318/gcc/tree-ssa.c 2011-03-21 15:33:36.000000000 +0100 @@ -455,13 +455,19 @@ insert_debug_temp_for_var_def (gimple_st 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); + { + 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);