As reported by Richard in int a; int foo() { int tmp = a; int tmp2 = a; int tmp3; int res; a = 0; tmp3 = tmp2; res = tmp - tmp2 + 1; return res; } results in wrong-debug with -O2 -g. Having # DEBUG tmp3 => a after a = 0 is wrong certainly already at gimple levels, while # DEBUG tmp1 => a and # DEBUG tmp2 => a could be in theory handled only at the var-tracking level, but even there var-tracking fails to notice that the a = 0 store can clobber the memory (i.e. that the VALUE should be clobbered, and in theory e.g. most calls should be considered to clobber non-stack MEMs etc., as usually) and add notes that tmp1/tmp2 don't have known values anymore.
Confirmed.
The patch that introduces debug temps fixes this bug. http://gcc.gnu.org/ml/gcc-patches/2009-10/msg00112.html
Subject: Bug 41447 Author: aoliva Date: Mon Oct 12 18:58:38 2009 New Revision: 152681 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=152681 Log: gcc/ChangeLog: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * tree.def (DEBUG_EXPR_DECL): New. * rtl.def (DEBUG_EXPR): New. * gengtype.c (adjust_field_rtx_def): Handle it. * tree-ssa.c (propagate_var_def_into_debug_stmts): Rename to... (insert_debug_temp_for_var_def): ... this. Drop support for moving. Take iterator for def stmt; insert debug stmt before it. Scan early for use count and kind in debug stmts. (propagate_defs_into_debug_stmts): Rename to... (insert_debug_temps_for_defs): ... this. Likewise. * tree.h (DEBUG_TEMP_UID): New. * tree.c (next_debug_decl_uid): New. (make_node_stat): Count debug decls separately. (copy_node_stat): Likewise. * cfgexpand.c (expand_debug_expr): Handle DEBUG_EXPR_DECL. * var-tracking.c (dv_is_decl_p): Recognize it. (VALUE_RECURSED_INTO): Apply to DEBUG_EXPRs too. (track_expr_p): Track expanded DEBUG_EXPR_DECLs. (vt_expand_loc_callback): Expand DEBUG_EXPRs. (emit_note_insn_var_location): Don't emit notes for DEBUG_EXPR_DECLs. * cselib.c (rtx_equal_for_cselib_p): Handle DEBUG_EXPR. (cselib_hash_rtx): Likewise. (cselib_expand_value_rtx_1): Use callback for DEBUG_EXPR. * tree-ssa-operands.c (get_expr_operands): Skip DEBUG_EXPR_DECLs in debug bind stmts. * emit-rtl.c (verify_rtx_sharing): Handle DEBUG_EXPR and VALUE. (copy_rtx_if_shared_1, reset_used_flags, set_used_flags): Likewise. * rtl.c (copy_rtx): Likewise. (rtx_equal_p_cb, rtx_equal_p): Handle DEBUG_EXPR. * print-rtl.c (print_rtx): Likewise. * sched-vis.c (print_value): Likewise. (print_insn): Handle DEBUG_EXPR_DECL. * tree-dump.c (dequeue_and_dump): Likewise. * tree-pretty-print.c (dump_decl_name, dump_generic_node): Likewise. * gimple-iterator (gsi_replace): Check for same lhs. (gsi_remove): Insert debug temps. * tree-ssa-loop-im.c (rewrite_reciprocal): Replace with same lhs. (move_computations_stmt): Drop explicit propagation into debug stmts. (rewrite_bittest): Likewise. Use gsi_remove for propagation. * tree-ssa-reassoc.c (rewrite_expr_tree, linearize_expr): Likewise. * tree-ssa-sink.c (statement_sink_location): Likewise. * tree-ssa-forwprop (forward_propagate_addr_expr): Likewise. * tree-ssanames.c (release_ssa_name): Adjust for rename. * tree-flow.h: Likewise. * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Don't mark debug temps without values. (eliminate_unnecessary_stmts): Don't discard just-inserted debug stmts. gcc/testsuite/ChangeLog: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * gcc.dg/guality/pr41447-1.c: New. * gcc.dg/debug/pr41264-1.c: New. * gcc.dg/debug/pr41343-1.c: New. Added: trunk/gcc/testsuite/gcc.dg/debug/pr41264-1.c trunk/gcc/testsuite/gcc.dg/debug/pr41343-1.c trunk/gcc/testsuite/gcc.dg/guality/pr41447-1.c Modified: trunk/gcc/ChangeLog trunk/gcc/cfgexpand.c trunk/gcc/cselib.c trunk/gcc/emit-rtl.c trunk/gcc/gengtype.c trunk/gcc/gimple-iterator.c trunk/gcc/print-rtl.c trunk/gcc/rtl.c trunk/gcc/rtl.def trunk/gcc/sched-vis.c trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-dump.c trunk/gcc/tree-flow.h trunk/gcc/tree-pretty-print.c trunk/gcc/tree-ssa-dce.c trunk/gcc/tree-ssa-forwprop.c trunk/gcc/tree-ssa-loop-im.c trunk/gcc/tree-ssa-operands.c trunk/gcc/tree-ssa-reassoc.c trunk/gcc/tree-ssa-sink.c trunk/gcc/tree-ssa.c trunk/gcc/tree-ssanames.c trunk/gcc/tree.c trunk/gcc/tree.def trunk/gcc/tree.h trunk/gcc/var-tracking.c
There's nothing stopping optimizers from moving assignments to memory across debug stmts, but with debug temps we don't move debug stmts across memory assignments any more, so this testcase is fixed.
Subject: Bug 41447 Author: aoliva Date: Wed Oct 14 05:01:24 2009 New Revision: 152749 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=152749 Log: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * tree.c (tree_node_structure_for_code): DEBUG_EXPR_DECL uses decl with rtl. (tree_code_size): Likewise. Modified: trunk/gcc/ChangeLog trunk/gcc/tree.c