diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7162f3498cf..ba9c7c9f3b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2013-08-21 Jeff Law + * tree-flow.h (register_jump_thread): Pass vector of edges + instead of each important edge. + * tree-ssa-threadedge.c (thread_across_edge): Build the jump + thread path into a vector and pass that to register_jump_thread. + * tree-ssa-threadupdate.c (register_jump_thread): Conver the + passed in edge vector to the current 3-edge form. + Revert: 2013-08-20 Alexey Makhalov diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index caa8d7457fb..01e65621092 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -750,7 +750,7 @@ bool may_be_nonaddressable_p (tree expr); /* In tree-ssa-threadupdate.c. */ extern bool thread_through_all_blocks (bool); -extern void register_jump_thread (edge, edge, edge); +extern void register_jump_thread (vec); /* In gimplify.c */ tree force_gimple_operand_1 (tree, gimple_seq *, gimple_predicate, tree); diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c index 357b6712a75..320dec52afd 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 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 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); } diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index 0e4cbc98ced..e84542c93ff 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -1264,8 +1264,19 @@ thread_through_all_blocks (bool may_peel_loop_headers) after fixing the SSA graph. */ void -register_jump_thread (edge e, edge e2, edge e3) +register_jump_thread (vec path) { + /* Convert PATH into 3 edge representation we've been using. This + is temporary until we convert this file to use a path representation + throughout. */ + edge e = path[0]; + edge e2 = path[1]; + + if (path.length () <= 2) + e3 = NULL; + else + e3 = path[path.length () - 1]; + /* This can occur if we're jumping to a constant address or or something similar. Just get out now. */ if (e2 == NULL)