Index: gcc/gcc/tree-ssa-uncprop.c |
diff --git a/gcc/gcc/tree-ssa-uncprop.c b/gcc/gcc/tree-ssa-uncprop.c |
index ceaa40d9c110611559ed993bc4f154c83ec01c49..a26a2aed369b0825a2c19b3b66ad63a79c9dec53 100644 |
--- a/gcc/gcc/tree-ssa-uncprop.c |
+++ b/gcc/gcc/tree-ssa-uncprop.c |
@@ -1,5 +1,6 @@ |
/* Routines for discovering and unpropagating edge equivalences. |
- Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc. |
+ Copyright (C) 2005, 2007, 2008, 2010 |
+ Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -53,7 +54,7 @@ struct edge_equivalency |
in the CFG. |
When complete, each edge that creates an equivalency will have an |
- EDGE_EQUIVALENCY structure hanging off the edge's AUX field. |
+ EDGE_EQUIVALENCY structure hanging off the edge's AUX field. |
The caller is responsible for freeing the AUX fields. */ |
static void |
@@ -157,7 +158,7 @@ associate_equivalences_with_edges (void) |
equivalency->rhs = op1; |
if (code == EQ_EXPR) |
true_edge->aux = equivalency; |
- else |
+ else |
false_edge->aux = equivalency; |
} |
@@ -177,7 +178,7 @@ associate_equivalences_with_edges (void) |
&& !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond)) |
{ |
int i, n_labels = gimple_switch_num_labels (stmt); |
- tree *info = XCNEWVEC (tree, n_basic_blocks); |
+ tree *info = XCNEWVEC (tree, last_basic_block); |
/* Walk over the case label vector. Record blocks |
which are reached by a single case label which represents |
@@ -289,9 +290,9 @@ struct equiv_hash_elt |
VEC(tree,heap) *equivalences; |
}; |
-static void uncprop_initialize_block (struct dom_walk_data *, basic_block); |
-static void uncprop_finalize_block (struct dom_walk_data *, basic_block); |
-static void uncprop_into_successor_phis (struct dom_walk_data *, basic_block); |
+static void uncprop_enter_block (struct dom_walk_data *, basic_block); |
+static void uncprop_leave_block (struct dom_walk_data *, basic_block); |
+static void uncprop_into_successor_phis (basic_block); |
/* Hashing and equality routines for the hash table. */ |
@@ -358,7 +359,7 @@ record_equiv (tree value, tree equivalence) |
free (equiv_hash_elt); |
equiv_hash_elt = (struct equiv_hash_elt *) *slot; |
- |
+ |
VEC_safe_push (tree, heap, equiv_hash_elt->equivalences, equivalence); |
} |
@@ -381,18 +382,12 @@ tree_ssa_uncprop (void) |
calculate_dominance_info (CDI_DOMINATORS); |
/* Setup callbacks for the generic dominator tree walker. */ |
- walk_data.walk_stmts_backward = false; |
walk_data.dom_direction = CDI_DOMINATORS; |
walk_data.initialize_block_local_data = NULL; |
- walk_data.before_dom_children_before_stmts = uncprop_initialize_block; |
- walk_data.before_dom_children_walk_stmts = NULL; |
- walk_data.before_dom_children_after_stmts = uncprop_into_successor_phis; |
- walk_data.after_dom_children_before_stmts = NULL; |
- walk_data.after_dom_children_walk_stmts = NULL; |
- walk_data.after_dom_children_after_stmts = uncprop_finalize_block; |
+ walk_data.before_dom_children = uncprop_enter_block; |
+ walk_data.after_dom_children = uncprop_leave_block; |
walk_data.global_data = NULL; |
walk_data.block_local_data_size = 0; |
- walk_data.interesting_blocks = NULL; |
/* Now initialize the dominator walker. */ |
init_walk_dominator_tree (&walk_data); |
@@ -432,8 +427,8 @@ tree_ssa_uncprop (void) |
the dominator tree. */ |
static void |
-uncprop_finalize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
- basic_block bb ATTRIBUTE_UNUSED) |
+uncprop_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
+ basic_block bb ATTRIBUTE_UNUSED) |
{ |
/* Pop the topmost value off the equiv stack. */ |
tree value = VEC_pop (tree, equiv_stack); |
@@ -447,8 +442,7 @@ uncprop_finalize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
/* Unpropagate values from PHI nodes in successor blocks of BB. */ |
static void |
-uncprop_into_successor_phis (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
- basic_block bb) |
+uncprop_into_successor_phis (basic_block bb) |
{ |
edge e; |
edge_iterator ei; |
@@ -463,7 +457,7 @@ uncprop_into_successor_phis (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
/* If there are no PHI nodes in this destination, then there is |
no sense in recording any equivalences. */ |
- if (!phis) |
+ if (gimple_seq_empty_p (phis)) |
continue; |
/* Record any equivalency associated with E. */ |
@@ -476,7 +470,6 @@ uncprop_into_successor_phis (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
/* Walk over the PHI nodes, unpropagating values. */ |
for (gsi = gsi_start (phis) ; !gsi_end_p (gsi); gsi_next (&gsi)) |
{ |
- /* Sigh. We'll have more efficient access to this one day. */ |
gimple phi = gsi_stmt (gsi); |
tree arg = PHI_ARG_DEF (phi, e->dest_idx); |
struct equiv_hash_elt equiv_hash_elt; |
@@ -556,8 +549,8 @@ single_incoming_edge_ignoring_loop_edges (basic_block bb) |
} |
static void |
-uncprop_initialize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
- basic_block bb) |
+uncprop_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
+ basic_block bb) |
{ |
basic_block parent; |
edge e; |
@@ -583,6 +576,8 @@ uncprop_initialize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, |
if (!recorded) |
VEC_safe_push (tree, heap, equiv_stack, NULL_TREE); |
+ |
+ uncprop_into_successor_phis (bb); |
} |
static bool |
@@ -591,7 +586,7 @@ gate_uncprop (void) |
return flag_tree_dom != 0; |
} |
-struct gimple_opt_pass pass_uncprop = |
+struct gimple_opt_pass pass_uncprop = |
{ |
{ |
GIMPLE_PASS, |