diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-cfgcleanup.c | 15 |
2 files changed, 18 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c7fcc0..f666191 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-05-21 Jakub Jelinek <jakub@redhat.com> + + PR debug/44205 + * tree-cfgcleanup.c (tree_forwarder_block_p): Return false if + at -O0 goto_locus of any of the incoming edges differs from + goto_locus of outgoing edge, or gimple_location of any of the + labels differs. + 2009-09-14 Vladimir Makarov <vmakarov@redhat.com> * ira.c (ira_non_ordered_class_hard_regs): Define. diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 723bfc1..db7fb00 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -267,6 +267,7 @@ static bool tree_forwarder_block_p (basic_block bb, bool phi_wanted) { gimple_stmt_iterator gsi; + location_t locus; /* BB must have a single outgoing edge. */ if (single_succ_p (bb) != 1 @@ -285,6 +286,8 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted) gcc_assert (bb != ENTRY_BLOCK_PTR); #endif + locus = single_succ_edge (bb)->goto_locus; + /* There should not be an edge coming from entry, or an EH edge. */ { edge_iterator ei; @@ -293,6 +296,10 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted) FOR_EACH_EDGE (e, ei, bb->preds) if (e->src == ENTRY_BLOCK_PTR || (e->flags & EDGE_EH)) return false; + /* If goto_locus of any of the edges differs, prevent removing + the forwarder block for -O0. */ + else if (optimize == 0 && e->goto_locus != locus) + return false; } /* Now walk through the statements backward. We can ignore labels, @@ -306,6 +313,8 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted) case GIMPLE_LABEL: if (DECL_NONLOCAL (gimple_label_label (stmt))) return false; + if (optimize == 0 && gimple_location (stmt) != locus) + return false; break; /* ??? For now, hope there's a corresponding debug @@ -608,11 +617,7 @@ cleanup_tree_cfg_bb (basic_block bb) retval = cleanup_control_flow_bb (bb); - /* Forwarder blocks can carry line number information which is - useful when debugging, so we only clean them up when - optimizing. */ - if (optimize > 0 - && tree_forwarder_block_p (bb, false) + if (tree_forwarder_block_p (bb, false) && remove_forwarder_block (bb)) return true; |