aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2004-11-27 17:26:17 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2004-11-27 17:26:17 +0000
commitcdef8bc6d1ad756c5b7508168a95351270347b45 (patch)
treea81bbbb8510ca92a7b1d6e2ce2d7db16c619315c /gcc
parent31f16dff98752d15c0f430b8e1e1daa7b682a8f0 (diff)
downloadgcc-cdef8bc6d1ad756c5b7508168a95351270347b45.zip
gcc-cdef8bc6d1ad756c5b7508168a95351270347b45.tar.gz
gcc-cdef8bc6d1ad756c5b7508168a95351270347b45.tar.bz2
tree.c (operand_equal_for_phi_arg_p): New.
* tree.c (operand_equal_for_phi_arg_p): New. * tree.h: Add a prototype for operand_equal_for_phi_arg_p. * tree-cfg.c, tree-ssa-dom.c, tree-ssa-phiopt.c, tree-ssa.c: Replace operand_equal_p with operand_for_phi_arg_p appropriately. From-SVN: r91385
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-cfg.c2
-rw-r--r--gcc/tree-ssa-dom.c4
-rw-r--r--gcc/tree-ssa-phiopt.c8
-rw-r--r--gcc/tree-ssa.c2
-rw-r--r--gcc/tree.c16
-rw-r--r--gcc/tree.h1
7 files changed, 33 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c249c02..95ae7a7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2004-11-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree.c (operand_equal_for_phi_arg_p): New.
+ * tree.h: Add a prototype for operand_equal_for_phi_arg_p.
+ * tree-cfg.c, tree-ssa-dom.c, tree-ssa-phiopt.c, tree-ssa.c:
+ Replace operand_equal_p with operand_for_phi_arg_p
+ appropriately.
+
2004-11-27 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR pch/14940
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index bcf3d3e..37a6920 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -2278,7 +2278,7 @@ phi_alternatives_equal (basic_block dest, edge e1, edge e2)
val1 = PHI_ARG_DEF (phi, n1);
val2 = PHI_ARG_DEF (phi, n2);
- if (!operand_equal_p (val1, val2, 0))
+ if (!operand_equal_for_phi_arg_p (val1, val2))
return false;
}
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 5af8489..a2d1459 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1180,7 +1180,7 @@ record_equivalences_from_phis (basic_block bb)
if (TREE_CODE (t) == SSA_NAME || is_gimple_min_invariant (t))
{
/* Ignore alternatives which are the same as our LHS. */
- if (operand_equal_p (lhs, t, 0))
+ if (operand_equal_for_phi_arg_p (lhs, t))
continue;
/* If we have not processed an alternative yet, then set
@@ -1190,7 +1190,7 @@ record_equivalences_from_phis (basic_block bb)
/* If we have processed an alternative (stored in RHS), then
see if it is equal to this one. If it isn't, then stop
the search. */
- else if (! operand_equal_p (rhs, t, 0))
+ else if (! operand_equal_for_phi_arg_p (rhs, t))
break;
}
else
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 3c241e4..b6cfa7a 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -450,10 +450,10 @@ value_replacement (basic_block bb, tree phi, tree arg0, tree arg1)
We now need to verify that the two arguments in the PHI node match
the two arguments to the equality comparison. */
- if ((operand_equal_p (arg0, TREE_OPERAND (cond, 0), 0)
- && operand_equal_p (arg1, TREE_OPERAND (cond, 1), 0))
- || (operand_equal_p (arg1, TREE_OPERAND (cond, 0), 0)
- && operand_equal_p (arg0, TREE_OPERAND (cond, 1), 0)))
+ if ((operand_equal_for_phi_arg_p (arg0, TREE_OPERAND (cond, 0))
+ && operand_equal_for_phi_arg_p (arg1, TREE_OPERAND (cond, 1)))
+ || (operand_equal_for_phi_arg_p (arg1, TREE_OPERAND (cond, 0))
+ && operand_equal_for_phi_arg_p (arg0, TREE_OPERAND (cond, 1))))
{
edge e;
tree arg;
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 4aa8b26..adb6a51 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1138,7 +1138,7 @@ check_phi_redundancy (tree phi, tree *eq_to)
}
if (val
- && !operand_equal_p (val, def, 0))
+ && !operand_equal_for_phi_arg_p (val, def))
return;
val = def;
diff --git a/gcc/tree.c b/gcc/tree.c
index 9fb3628..961dfb8 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -6150,4 +6150,20 @@ lower_bound_in_type (tree outer, tree inner)
build_int_cst_wide (inner, lo, hi));
}
+/* Return nonzero if two operands that are suitable for PHI nodes are
+ necessarily equal. Specifically, both ARG0 and ARG1 must be either
+ SSA_NAME or invariant. Note that this is strictly an optimization.
+ That is, callers of this function can directly call operand_equal_p
+ and get the same result, only slower. */
+
+int
+operand_equal_for_phi_arg_p (tree arg0, tree arg1)
+{
+ if (arg0 == arg1)
+ return 1;
+ if (TREE_CODE (arg0) == SSA_NAME || TREE_CODE (arg1) == SSA_NAME)
+ return 0;
+ return operand_equal_p (arg0, arg1, 0);
+}
+
#include "gt-tree.h"
diff --git a/gcc/tree.h b/gcc/tree.h
index 0f109a0..b9ce3ac 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -3442,6 +3442,7 @@ extern bool commutative_tree_code (enum tree_code);
extern tree get_case_label (tree);
extern tree upper_bound_in_type (tree, tree);
extern tree lower_bound_in_type (tree, tree);
+extern int operand_equal_for_phi_arg_p (tree, tree);
/* In stmt.c */