Hi! As discussed in the PR, in 4.7 we regressed some GDB testcases, because previously unused addressable vars were first previously optimized into non-addressable and only afterwards removed (which results in correct debug stmts covering those assignments), but after some recent changes it is CDDCE that removes them before they are update_address_taken optimized.
In the PR I've offered a patch to schedule another update_address_taken pass before first cddce, but Michael is right that perhaps some other DCE pass could have similar issue. So this patch instead, if the DCEd var stores have addressable lhs, but with is_gimple_reg_type types, we add debug stmts even for them. Such variables aren't target_for_debug_bind though, which breaks var-tracking. So, the patch if all occurrences of the var are optimized away, just clears TREE_ADDRESSABLE bit like update_address_taken would, and, if that didn't happen until expansion, just ignores those debug stmts so that var-tracking isn't upset by seing non-tracked vars in debug insns. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2011-12-01 Jakub Jelinek <ja...@redhat.com> PR debug/50317 * tree-ssa-dce.c (remove_dead_stmt): Add a debug stmt when removing as unnecessary a store to a variable with gimple reg type. * tree-ssa-live.c (remove_unused_locals): Clear TREE_ADDRESSABLE bit on local unreferenced variables. * cfgexpand.c (expand_gimple_basic_block): Don't emit DEBUG_INSNs for !target_for_debug_bind variables. --- gcc/tree-ssa-live.c.jj 2011-11-28 15:41:46.376749700 +0100 +++ gcc/tree-ssa-live.c 2011-12-01 12:04:12.920595572 +0100 @@ -1,5 +1,5 @@ /* Liveness for SSA trees. - Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 + Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Andrew MacLeod <amacl...@redhat.com> @@ -814,7 +814,15 @@ remove_unused_locals (void) bitmap_set_bit (global_unused_vars, DECL_UID (var)); } else - continue; + { + /* For unreferenced local vars drop TREE_ADDRESSABLE + bit in case it is referenced from debug stmts. */ + if (DECL_CONTEXT (var) == current_function_decl + && TREE_ADDRESSABLE (var) + && is_gimple_reg_type (TREE_TYPE (var))) + TREE_ADDRESSABLE (var) = 0; + continue; + } } else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var) --- gcc/tree-ssa-dce.c.jj 2011-11-28 15:41:46.376749700 +0100 +++ gcc/tree-ssa-dce.c 2011-12-01 12:04:12.920595572 +0100 @@ -1215,6 +1215,26 @@ remove_dead_stmt (gimple_stmt_iterator * ei_next (&ei); } + /* If this is a store into a variable that is being optimized away, + add a debug bind stmt if possible. */ + if (MAY_HAVE_DEBUG_STMTS + && gimple_assign_single_p (stmt) + && is_gimple_val (gimple_assign_rhs1 (stmt))) + { + tree lhs = gimple_assign_lhs (stmt); + if ((TREE_CODE (lhs) == VAR_DECL || TREE_CODE (lhs) == PARM_DECL) + && !DECL_IGNORED_P (lhs) + && is_gimple_reg_type (TREE_TYPE (lhs)) + && !is_global_var (lhs) + && !DECL_HAS_VALUE_EXPR_P (lhs)) + { + tree rhs = gimple_assign_rhs1 (stmt); + gimple note + = gimple_build_debug_bind (lhs, unshare_expr (rhs), stmt); + gsi_insert_after (i, note, GSI_SAME_STMT); + } + } + unlink_stmt_vdef (stmt); gsi_remove (i, true); release_defs (stmt); --- gcc/cfgexpand.c.jj 2011-12-01 11:44:56.156345109 +0100 +++ gcc/cfgexpand.c 2011-12-01 12:37:57.764791257 +0100 @@ -3903,6 +3903,11 @@ expand_gimple_basic_block (basic_block b rtx val; enum machine_mode mode; + if (TREE_CODE (var) != DEBUG_EXPR_DECL + && TREE_CODE (var) != LABEL_DECL + && !target_for_debug_bind (var)) + goto delink_debug_stmt; + if (gimple_debug_bind_has_value_p (stmt)) value = gimple_debug_bind_get_value (stmt); else @@ -3932,6 +3937,7 @@ expand_gimple_basic_block (basic_block b PAT_VAR_LOCATION_LOC (val) = (rtx)value; } + delink_debug_stmt: /* In order not to generate too many debug temporaries, we delink all uses of debug statements we already expanded. Therefore debug statements between definition and real Jakub