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 11/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 08:22:35 -0500 (EST)
- Subject: [patch] O(1) PHI argument look-up - Part 11/n
Hi,
Attached is a patch to part 11 of my O(1) PHI argument look-up patch.
Now that the infrastructure is in, we can take advantage of it to
clean/spped up various part of tree optimizers.
phi_translate has a linear look-up of a PHI argument. Since a PHI
array and the corresponding edge vector are lined up, this look-up is
the same as a linear look-up of an edge.
The patch uses find_edge instead, hoping to find an edge quickly even
in presence of a large number of incoming edges to the basic block
that PHI belongs to.
Since VAL is a write-only variable, the patch removes that.
Tested on i686-pc-linux-gnu. OK to apply?
Kazu Hirata
2004-11-24 Kazu Hirata <kazu@cs.umass.edu>
* tree-ssa-pre.c (phi_translate): Use find_edge to find the
index of a PHI argument.
Index: tree-ssa-pre.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-pre.c,v
retrieving revision 2.54
diff -u -d -p -r2.54 tree-ssa-pre.c
--- tree-ssa-pre.c 22 Nov 2004 12:23:58 -0000 2.54
+++ tree-ssa-pre.c 23 Nov 2004 14:59:30 -0000
@@ -922,22 +922,21 @@ phi_translate (tree expr, value_set_t se
case tcc_exceptional:
{
tree phi = NULL;
- int i;
+ edge e;
gcc_assert (TREE_CODE (expr) == SSA_NAME);
if (TREE_CODE (SSA_NAME_DEF_STMT (expr)) == PHI_NODE)
phi = SSA_NAME_DEF_STMT (expr);
else
return expr;
- for (i = 0; i < PHI_NUM_ARGS (phi); i++)
- if (PHI_ARG_EDGE (phi, i)->src == pred)
- {
- tree val;
- if (is_undefined_value (PHI_ARG_DEF (phi, i)))
- return NULL;
- val = vn_lookup_or_add (PHI_ARG_DEF (phi, i), NULL);
- return PHI_ARG_DEF (phi, i);
- }
+ e = find_edge (pred, bb_for_stmt (phi));
+ if (e)
+ {
+ if (is_undefined_value (PHI_ARG_DEF (phi, e->dest_idx)))
+ return NULL;
+ vn_lookup_or_add (PHI_ARG_DEF (phi, e->dest_idx), NULL);
+ return PHI_ARG_DEF (phi, e->dest_idx);
+ }
}
return expr;