This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] O(1) PHI argument look-up - Part 14/n
- From: Kazu Hirata <kazu at cs dot umass dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 24 Nov 2004 12:41:10 -0500 (EST)
- Subject: [patch] O(1) PHI argument look-up - Part 14/n
Hi,
Attached is part 14 of my O(1) PHI argument look-up patch.
eliminate_build has code that's basically like this:
if (PHI_ARG_EDGE (phi, i) == g->e)
Ti = PHI_ARG_DEF (phi, i);
else
Ti = PHI_ARG_DEF (phi, phi_arg_from_edge (phi, g->e));
If the condition in the "if" statement is true, we have
i == g->e->dest_idx. phi_arg_from_edge (phi, g->e) in the else arm is
the same as g->e->dest_idx, so the "if" statement above is equivalent
to
if (PHI_ARG_EDGE (phi, i) == g->e)
Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
else
Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
Now the then and else arms of the "if" statement are identical, so I
can just fold the "if" statement to
Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
Since the only use of I is in this "if" statement, eliminate_build
does not need to take I as an argument any more. In turn, the only
use of I in eliminate_phi, which is the only caller of
eliminate_build, is to pass it to eliminate_build, eliminate_phi does
not need to take I, either.
Tested on i686-pc-linux-gnu. OK to apply?
Kazu Hirata
2004-11-24 Kazu Hirata <kazu@cs.umass.edu>
* tree-outof-ssa.c (eliminate_build): Use g->e->dest_idx
instead to find the PHI argument. Do not take I as an
argument.
(eliminate_phi): Adjust the call to eliminate_build. Do not
take I as an argument.
(rewrite_trees): Adjust the call to eliminate_phi.
Index: tree-outof-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-outof-ssa.c,v
retrieving revision 2.33
diff -u -d -p -r2.33 tree-outof-ssa.c
--- tree-outof-ssa.c 22 Nov 2004 12:23:58 -0000 2.33
+++ tree-outof-ssa.c 24 Nov 2004 15:54:08 -0000
@@ -115,12 +115,12 @@ static inline void elim_graph_add_edge (
static inline int elim_graph_remove_succ_edge (elim_graph, int);
static inline void eliminate_name (elim_graph, tree);
-static void eliminate_build (elim_graph, basic_block, int);
+static void eliminate_build (elim_graph, basic_block);
static void elim_forward (elim_graph, int);
static int elim_unvisited_predecessor (elim_graph, int);
static void elim_backward (elim_graph, int);
static void elim_create (elim_graph, int);
-static void eliminate_phi (edge, int, elim_graph);
+static void eliminate_phi (edge, elim_graph);
static tree_live_info_p coalesce_ssa_name (var_map, int);
static void assign_vars (var_map);
static bool replace_use_variable (var_map, use_operand_p, tree *);
@@ -338,10 +338,11 @@ eliminate_name (elim_graph g, tree T)
}
-/* Build elimination graph G for basic block BB on incoming PHI edge I. */
+/* Build elimination graph G for basic block BB on incoming PHI edge
+ G->e. */
static void
-eliminate_build (elim_graph g, basic_block B, int i)
+eliminate_build (elim_graph g, basic_block B)
{
tree phi;
tree T0, Ti;
@@ -357,17 +358,7 @@ eliminate_build (elim_graph g, basic_blo
if (T0 == NULL_TREE)
continue;
- if (PHI_ARG_EDGE (phi, i) == g->e)
- Ti = PHI_ARG_DEF (phi, i);
- else
- {
- /* On rare occasions, a PHI node may not have the arguments
- in the same order as all of the other PHI nodes. If they don't
- match, find the appropriate index here. */
- pi = phi_arg_from_edge (phi, g->e);
- gcc_assert (pi != -1);
- Ti = PHI_ARG_DEF (phi, pi);
- }
+ Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
/* If this argument is a constant, or a SSA_NAME which is being
left in SSA form, just queue a copy to be emitted on this
@@ -482,17 +473,15 @@ elim_create (elim_graph g, int T)
}
-/* Eliminate all the phi nodes on edge E in graph G. I is the usual PHI
- index that edge E's values are found on. */
+/* Eliminate all the phi nodes on edge E in graph G. */
static void
-eliminate_phi (edge e, int i, elim_graph g)
+eliminate_phi (edge e, elim_graph g)
{
int num_nodes = 0;
int x;
basic_block B = e->dest;
- gcc_assert (i != -1);
gcc_assert (VARRAY_ACTIVE_SIZE (g->const_copies) == 0);
/* Abnormal edges already have everything coalesced, or the coalescer
@@ -503,7 +492,7 @@ eliminate_phi (edge e, int i, elim_graph
num_nodes = num_var_partitions (g->map);
g->e = e;
- eliminate_build (g, B, i);
+ eliminate_build (g, B);
if (elim_graph_size (g) != 0)
{
@@ -1929,7 +1918,7 @@ rewrite_trees (var_map map, tree *values
{
edge_iterator ei;
FOR_EACH_EDGE (e, ei, bb->preds)
- eliminate_phi (e, phi_arg_from_edge (phi, e), g);
+ eliminate_phi (e, g);
}
}