From: jakub Date: Tue, 30 Oct 2012 08:08:01 +0000 (+0000) Subject: PR debug/54953 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6baa953c746526d19b2aef27e2a19ec5fdc87209;p=thirdparty%2Fgcc.git PR debug/54953 * valtrack.h (DEBUG_TEMP_AFTER_WITH_REG_FORCE): New. * valtrack.c (dead_debug_insert_temp): Use emit_debug_insn_after even for where == DEBUG_TEMP_AFTER_WITH_REG_FORCE. * dce.c (word_dce_process_block, dce_process_block): Pass DEBUG_TEMP_AFTER_WITH_REG_FORCE if insn is needed and therefore not going to be eliminated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192978 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ad17e712bd7..a27c0df5b5e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-10-30 Jakub Jelinek + + PR debug/54953 + * valtrack.h (DEBUG_TEMP_AFTER_WITH_REG_FORCE): New. + * valtrack.c (dead_debug_insert_temp): Use emit_debug_insn_after + even for where == DEBUG_TEMP_AFTER_WITH_REG_FORCE. + * dce.c (word_dce_process_block, dce_process_block): Pass + DEBUG_TEMP_AFTER_WITH_REG_FORCE if insn is needed and therefore + not going to be eliminated. + 2012-10-29 Lawrence Crowl * sbitmap.h (sbitmap_copy): Rename bitmap_copy. diff --git a/gcc/dce.c b/gcc/dce.c index 4c088a48fa49..efc26222e7e9 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -1,5 +1,5 @@ /* RTL dead code elimination. - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -880,7 +880,10 @@ word_dce_process_block (basic_block bb, bool redo_out, for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++) dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn, - DEBUG_TEMP_BEFORE_WITH_VALUE); + marked_insn_p (insn) + && !control_flow_insn_p (insn) + ? DEBUG_TEMP_AFTER_WITH_REG_FORCE + : DEBUG_TEMP_BEFORE_WITH_VALUE); } if (dump_file) @@ -981,7 +984,9 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au, if (debug.used && !bitmap_empty_p (debug.used)) for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++) dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn, - DEBUG_TEMP_BEFORE_WITH_VALUE); + needed && !control_flow_insn_p (insn) + ? DEBUG_TEMP_AFTER_WITH_REG_FORCE + : DEBUG_TEMP_BEFORE_WITH_VALUE); } dead_debug_local_finish (&debug, NULL); diff --git a/gcc/valtrack.c b/gcc/valtrack.c index 8cc326900ed6..c1de41c74e74 100644 --- a/gcc/valtrack.c +++ b/gcc/valtrack.c @@ -684,7 +684,8 @@ dead_debug_insert_temp (struct dead_debug_local *debug, unsigned int uregno, DEBUG_EXPR_TREE_DECL (dval), breg, VAR_INIT_STATUS_INITIALIZED); - if (where == DEBUG_TEMP_AFTER_WITH_REG) + if (where == DEBUG_TEMP_AFTER_WITH_REG + || where == DEBUG_TEMP_AFTER_WITH_REG_FORCE) bind = emit_debug_insn_after (bind, insn); else bind = emit_debug_insn_before (bind, insn); diff --git a/gcc/valtrack.h b/gcc/valtrack.h index 44f2d213e65f..a925e27a509a 100644 --- a/gcc/valtrack.h +++ b/gcc/valtrack.h @@ -131,7 +131,12 @@ enum debug_temp_where /* Bind a newly-created debug temporary to a REG for UREGNO, and insert the debug insn after INSN. REG is expected to be set at INSN. */ - DEBUG_TEMP_AFTER_WITH_REG = 1 + DEBUG_TEMP_AFTER_WITH_REG = 1, + /* Like DEBUG_TEMP_AFTER_WITH_REG, but force addition of a debug + temporary even if there is just a single debug use. This is used + on regs that are becoming REG_DEAD on INSN and so uses of the + reg later on are invalid. */ + DEBUG_TEMP_AFTER_WITH_REG_FORCE = 2 }; extern void dead_debug_global_init (struct dead_debug_global *, bitmap);