diff options
Diffstat (limited to 'gcc/tree-ssa-threadedge.c')
-rw-r--r-- | gcc/tree-ssa-threadedge.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c index 357b671..320dec5 100644 --- a/gcc/tree-ssa-threadedge.c +++ b/gcc/tree-ssa-threadedge.c @@ -937,10 +937,15 @@ thread_across_edge (gimple dummy_cond, } remove_temporary_equivalences (stack); - if (!taken_edge) - return; - propagate_threaded_block_debug_into (taken_edge->dest, e->dest); - register_jump_thread (e, taken_edge, NULL); + if (taken_edge) + { + vec<edge> path = vNULL; + propagate_threaded_block_debug_into (taken_edge->dest, e->dest); + path.safe_push (e); + path.safe_push (taken_edge); + register_jump_thread (path); + path.release (); + } return; } } @@ -969,9 +974,12 @@ thread_across_edge (gimple dummy_cond, bitmap_clear (visited); bitmap_set_bit (visited, taken_edge->dest->index); bitmap_set_bit (visited, e->dest->index); + vec<edge> path = vNULL; /* Record whether or not we were able to thread through a successor of E->dest. */ + path.safe_push (e); + path.safe_push (taken_edge); found = false; e3 = taken_edge; do @@ -988,6 +996,7 @@ thread_across_edge (gimple dummy_cond, if (e2) { + path.safe_push (e2); e3 = e2; found = true; } @@ -1008,10 +1017,11 @@ thread_across_edge (gimple dummy_cond, { propagate_threaded_block_debug_into (e3->dest, taken_edge->dest); - register_jump_thread (e, taken_edge, e3); + register_jump_thread (path); } } + path.release(); } BITMAP_FREE (visited); } |