summaryrefslogtreecommitdiff
path: root/gcc/tree-vn.c
diff options
context:
space:
mode:
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-16 01:12:07 +0000
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-16 01:12:07 +0000
commitf0c13a343d486f428f8c7eb41d0e1c8a7f0b2f86 (patch)
tree9ae1ca4cfd3a16282eccd4a1235eecbb784104c3 /gcc/tree-vn.c
parente3feb2af3138cba10396fab975f553e986304d08 (diff)
downloadgcc-f0c13a343d486f428f8c7eb41d0e1c8a7f0b2f86.tar.gz
2005-05-15 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/21576 * tree-ssa-pre.c (expression_node_pool): New pool. (comparison_node_pool): Ditto. (list_node_pool): Ditto. (pool_copy_list): New function. (phi_translate): Handle CALL_EXPR. (valid_in_set): Ditto. (create_expression_by_pieces): Ditto. (insert_into_preds_of_block): Ditto. (insert_aux): Ditto. (compute_avail): Ditto. (create_value_expr_from): Handle TREE_LIST and CALL_EXPR. (can_value_number_call): New function. (find_leader): Update comment. (init_pre): Create new pools. (fini_pre): Free new pools. (pass_pre): Add TODO_update_ssa for the future when we are going to need vops. * tree-vn.c (expressions_equal_p): Handle TREE_LIST. (set_value_handle): Ditto. (get_value_handle): Ditto. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99759 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vn.c')
-rw-r--r--gcc/tree-vn.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/gcc/tree-vn.c b/gcc/tree-vn.c
index 5f003720e4d..e46fafaf308 100644
--- a/gcc/tree-vn.c
+++ b/gcc/tree-vn.c
@@ -119,9 +119,25 @@ expressions_equal_p (tree e1, tree e2)
te1 = TREE_TYPE (e1);
te2 = TREE_TYPE (e2);
- if (TREE_CODE (e1) == TREE_CODE (e2)
- && (te1 == te2 || lang_hooks.types_compatible_p (te1, te2))
- && operand_equal_p (e1, e2, OEP_PURE_SAME))
+ if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST)
+ {
+ tree lop1 = e1;
+ tree lop2 = e2;
+ for (lop1 = e1, lop2 = e2;
+ lop1 || lop2;
+ lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2))
+ {
+ if (!lop1 || !lop2)
+ return false;
+ if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2)))
+ return false;
+ }
+ return true;
+
+ }
+ else if (TREE_CODE (e1) == TREE_CODE (e2)
+ && (te1 == te2 || lang_hooks.types_compatible_p (te1, te2))
+ && operand_equal_p (e1, e2, OEP_PURE_SAME))
return true;
return false;
@@ -166,7 +182,7 @@ set_value_handle (tree e, tree v)
{
if (TREE_CODE (e) == SSA_NAME)
SSA_NAME_VALUE (e) = v;
- else if (EXPR_P (e) || DECL_P (e))
+ else if (EXPR_P (e) || DECL_P (e) || TREE_CODE (e) == TREE_LIST)
get_tree_ann (e)->common.value_handle = v;
else
/* Do nothing. Constants are their own value handles. */
@@ -271,7 +287,7 @@ get_value_handle (tree expr)
if (TREE_CODE (expr) == SSA_NAME)
return SSA_NAME_VALUE (expr);
- else if (EXPR_P (expr) || DECL_P (expr))
+ else if (EXPR_P (expr) || DECL_P (expr) || TREE_CODE (expr) == TREE_LIST)
{
tree_ann_t ann = tree_ann (expr);
return ((ann) ? ann->common.value_handle : NULL_TREE);