diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 13 | ||||
-rw-r--r-- | gcc/tree-flow.h | 1 | ||||
-rw-r--r-- | gcc/tree-phinodes.c | 15 |
4 files changed, 26 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ee1a5d..d9cd221 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2004-11-09 Kazu Hirata <kazu@cs.umass.edu> + * tree-phinodes.c (phi_reverse): New. + * tree-cfg.c (tree_make_forwarder_block, tree_duplicate_bb): + Use it. + * tree-flow.h: Add a prototype for phi_reverse. + +2004-11-09 Kazu Hirata <kazu@cs.umass.edu> + * tree-ssa-loop-ivopts.c: Fix a comment typo. 2004-11-09 James A. Morrison <phython@gcc.gnu.org> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 8dfaffb..8da78c8 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3655,7 +3655,7 @@ tree_make_forwarder_block (edge fallthru) edge e; edge_iterator ei; basic_block dummy, bb; - tree phi, new_phi, var, prev, next; + tree phi, new_phi, var; dummy = fallthru->src; bb = fallthru->dest; @@ -3675,14 +3675,7 @@ tree_make_forwarder_block (edge fallthru) } /* Ensure that the PHI node chain is in the same order. */ - prev = NULL; - for (phi = phi_nodes (bb); phi; phi = next) - { - next = PHI_CHAIN (phi); - PHI_CHAIN (phi) = prev; - prev = phi; - } - set_phi_nodes (bb, prev); + set_phi_nodes (bb, phi_reverse (phi_nodes (bb))); /* Add the arguments we have stored on edges. */ FOR_EACH_EDGE (e, ei, bb->preds) @@ -4281,7 +4274,7 @@ tree_duplicate_bb (basic_block bb) mark_for_rewrite (PHI_RESULT (phi)); create_phi_node (PHI_RESULT (phi), new_bb); } - set_phi_nodes (new_bb, nreverse (phi_nodes (new_bb))); + set_phi_nodes (new_bb, phi_reverse (phi_nodes (new_bb))); bsi_tgt = bsi_start (new_bb); for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 829eff8..354f02c 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -516,6 +516,7 @@ extern void remove_phi_arg (tree, basic_block); extern void remove_phi_arg_num (tree, int); extern void remove_phi_node (tree, tree, basic_block); extern void remove_all_phi_nodes_for (bitmap); +extern tree phi_reverse (tree); extern void dump_dfa_stats (FILE *); extern void debug_dfa_stats (void); extern void debug_referenced_vars (void); diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c index 0d621b5..a38a572 100644 --- a/gcc/tree-phinodes.c +++ b/gcc/tree-phinodes.c @@ -491,6 +491,21 @@ remove_all_phi_nodes_for (bitmap vars) } } +/* Reverse the order of PHI nodes in the chain PHI. + Return the new head of the chain (old last PHI node). */ + +tree +phi_reverse (tree phi) +{ + tree prev = NULL_TREE, next; + for (; phi; phi = next) + { + next = PHI_CHAIN (phi); + PHI_CHAIN (phi) = prev; + prev = phi; + } + return prev; +} #include "gt-tree-phinodes.h" |