aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/dce.c11
-rw-r--r--gcc/valtrack.c3
-rw-r--r--gcc/valtrack.h7
4 files changed, 26 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4ad17e712bd..a27c0df5b5e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2012-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ 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 <crowl@google.com>
* sbitmap.h (sbitmap_copy): Rename bitmap_copy.
diff --git a/gcc/dce.c b/gcc/dce.c
index 4c088a48fa4..efc26222e7e 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 8cc326900ed..c1de41c74e7 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 44f2d213e65..a925e27a509 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);