diff options
author | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-16 01:12:07 +0000 |
---|---|---|
committer | dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-16 01:12:07 +0000 |
commit | f0c13a343d486f428f8c7eb41d0e1c8a7f0b2f86 (patch) | |
tree | 9ae1ca4cfd3a16282eccd4a1235eecbb784104c3 /gcc/tree-vn.c | |
parent | e3feb2af3138cba10396fab975f553e986304d08 (diff) | |
download | gcc-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.c | 26 |
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); |