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
This commit is contained in:
Richard Guenther 2008-08-21 15:18:58 +00:00 committed by Richard Biener
parent 729edaa1bb
commit 1e52075c54
4 changed files with 25 additions and 7 deletions

View File

@ -1,3 +1,10 @@
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

View File

@ -2896,7 +2896,7 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
pre_expr eprime;
edge_iterator ei;
tree type = get_expr_type (expr);
tree temp;
tree temp, res;
gimple phi;
if (dump_file && (dump_flags & TDF_DETAILS))
@ -3051,12 +3051,8 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
if (TREE_CODE (type) == COMPLEX_TYPE
|| TREE_CODE (type) == VECTOR_TYPE)
DECL_GIMPLE_REG_P (temp) = 1;
phi = create_phi_node (temp, block);
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);
phi = create_phi_node (temp, block);
FOR_EACH_EDGE (pred, ei, block->preds)
{
pre_expr ae = avail[pred->src->index];
@ -3067,6 +3063,20 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
else
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));
add_to_value (val, newphi);

View File

@ -1458,7 +1458,7 @@ static VEC(tree, heap) *shared_lookup_phiargs;
value number if it exists in the hash table. Return NULL_TREE if
it does not exist in the hash table. */
static tree
tree
vn_phi_lookup (gimple phi)
{
void **slot;

View File

@ -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) *,
VEC (vn_reference_op_s, heap) *,
tree, unsigned int);
tree vn_phi_lookup (gimple);
hashval_t vn_nary_op_compute_hash (const vn_nary_op_t);
int vn_nary_op_eq (const void *, const void *);