@@ -1,5 +1,5 @@
/* SSA Jump Threading
- Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by Jeff Law <law@redhat.com>
@@ -641,18 +641,62 @@ thread_around_empty_block (edge taken_ed
we don't lose the bindings as we redirect the edges. */
if (MAY_HAVE_DEBUG_STMTS)
{
+ struct pointer_set_t *vars = NULL;
+
gsi = gsi_after_labels (bb);
for (gimple_stmt_iterator si = gsi_last_bb (taken_edge->src);
!gsi_end_p (si); gsi_prev (&si))
{
+ tree var;
+
stmt = gsi_stmt (si);
if (!is_gimple_debug (stmt))
continue;
+ var = NULL_TREE;
+ if (gimple_debug_bind_p (stmt))
+ var = gimple_debug_bind_get_var (stmt);
+ else if (gimple_debug_source_bind_p (stmt))
+ var = gimple_debug_source_bind_get_var (stmt);
+
+ /* Don't insert debug stmts for vars which will be immediately
+ overridden by debug stmts at the start of bb (either preexisting
+ or from earlier thread_around_empty_block attempt), without
+ any intervening real stmts. */
+ if (var != NULL_TREE
+ && !gsi_end_p (gsi)
+ && is_gimple_debug (gsi_stmt (gsi)))
+ {
+ if (vars == NULL)
+ {
+ gimple_stmt_iterator gsi2;
+ vars = pointer_set_create ();
+ for (gsi2 = gsi; !gsi_end_p (gsi2); gsi_next (&gsi2))
+ {
+ gimple stmt2 = gsi_stmt (gsi2);
+ tree var2;
+ if (!is_gimple_debug (stmt2))
+ break;
+ if (gimple_debug_bind_p (stmt2))
+ var2 = gimple_debug_bind_get_var (stmt2);
+ else if (gimple_debug_source_bind_p (stmt2))
+ var2 = gimple_debug_source_bind_get_var (stmt2);
+ else
+ continue;
+ pointer_set_insert (vars, var2);
+ }
+ }
+ if (pointer_set_insert (vars, var))
+ continue;
+ }
+
stmt = gimple_copy (stmt);
/* ??? Should we drop the location of the copy? */
gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
}
+
+ if (vars != NULL)
+ pointer_set_destroy (vars);
}
/* This block must have more than one successor. */