Commit 1e52075c by Richard Guenther Committed by Richard Biener

tree-ssa-pre.c (insert_into_preds_of_block): Before inserting a PHI ask VN if it…

tree-ssa-pre.c (insert_into_preds_of_block): Before inserting a PHI ask VN if it is already available.

2008-08-21  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-pre.c (insert_into_preds_of_block): Before inserting
	a PHI ask VN if it is already available.
	* tree-ssa-sccvn.h (vn_phi_lookup): Declare.
	* tree-ssa-sccvn.c (vn_phi_lookup): Export.

From-SVN: r139388
parent 729edaa1
2008-08-21 Richard Guenther <rguenther@suse.de> 2008-08-21 Richard Guenther <rguenther@suse.de>
* tree-ssa-pre.c (insert_into_preds_of_block): Before inserting
a PHI ask VN if it is already available.
* tree-ssa-sccvn.h (vn_phi_lookup): Declare.
* tree-ssa-sccvn.c (vn_phi_lookup): Export.
2008-08-21 Richard Guenther <rguenther@suse.de>
PR middle-end/36817 PR middle-end/36817
* tree-chrec.c (chrec_apply): Always call chrec_fold_plus which * tree-chrec.c (chrec_apply): Always call chrec_fold_plus which
makes sure to produce a result of the correct type. makes sure to produce a result of the correct type.
......
...@@ -2896,7 +2896,7 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum, ...@@ -2896,7 +2896,7 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
pre_expr eprime; pre_expr eprime;
edge_iterator ei; edge_iterator ei;
tree type = get_expr_type (expr); tree type = get_expr_type (expr);
tree temp; tree temp, res;
gimple phi; gimple phi;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
...@@ -3051,12 +3051,8 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum, ...@@ -3051,12 +3051,8 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
if (TREE_CODE (type) == COMPLEX_TYPE if (TREE_CODE (type) == COMPLEX_TYPE
|| TREE_CODE (type) == VECTOR_TYPE) || TREE_CODE (type) == VECTOR_TYPE)
DECL_GIMPLE_REG_P (temp) = 1; DECL_GIMPLE_REG_P (temp) = 1;
phi = create_phi_node (temp, block);
gimple_set_plf (phi, NECESSARY, false); phi = create_phi_node (temp, block);
VN_INFO_GET (gimple_phi_result (phi))->valnum = gimple_phi_result (phi);
VN_INFO (gimple_phi_result (phi))->value_id = val;
VEC_safe_push (gimple, heap, inserted_exprs, phi);
FOR_EACH_EDGE (pred, ei, block->preds) FOR_EACH_EDGE (pred, ei, block->preds)
{ {
pre_expr ae = avail[pred->src->index]; pre_expr ae = avail[pred->src->index];
...@@ -3067,6 +3063,20 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum, ...@@ -3067,6 +3063,20 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
else else
add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred); add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred);
} }
/* If the PHI node is already available, use it. */
if ((res = vn_phi_lookup (phi)) != NULL_TREE)
{
gimple_stmt_iterator gsi = gsi_for_stmt (phi);
remove_phi_node (&gsi, true);
release_defs (phi);
add_to_value (val, get_or_alloc_expr_for_name (res));
return false;
}
gimple_set_plf (phi, NECESSARY, false);
VN_INFO_GET (gimple_phi_result (phi))->valnum = gimple_phi_result (phi);
VN_INFO (gimple_phi_result (phi))->value_id = val;
VEC_safe_push (gimple, heap, inserted_exprs, phi);
newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi)); newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
add_to_value (val, newphi); add_to_value (val, newphi);
......
...@@ -1458,7 +1458,7 @@ static VEC(tree, heap) *shared_lookup_phiargs; ...@@ -1458,7 +1458,7 @@ static VEC(tree, heap) *shared_lookup_phiargs;
value number if it exists in the hash table. Return NULL_TREE if value number if it exists in the hash table. Return NULL_TREE if
it does not exist in the hash table. */ it does not exist in the hash table. */
static tree tree
vn_phi_lookup (gimple phi) vn_phi_lookup (gimple phi)
{ {
void **slot; void **slot;
......
...@@ -184,6 +184,7 @@ vn_reference_t vn_reference_insert (tree, tree, VEC (tree, gc) *); ...@@ -184,6 +184,7 @@ vn_reference_t vn_reference_insert (tree, tree, VEC (tree, gc) *);
vn_reference_t vn_reference_insert_pieces (VEC (tree, gc) *, vn_reference_t vn_reference_insert_pieces (VEC (tree, gc) *,
VEC (vn_reference_op_s, heap) *, VEC (vn_reference_op_s, heap) *,
tree, unsigned int); tree, unsigned int);
tree vn_phi_lookup (gimple);
hashval_t vn_nary_op_compute_hash (const vn_nary_op_t); hashval_t vn_nary_op_compute_hash (const vn_nary_op_t);
int vn_nary_op_eq (const void *, const void *); int vn_nary_op_eq (const void *, const void *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment