Commit 8ea34dab by Richard Guenther Committed by Richard Biener

tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid doing work twice.

2010-11-23  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid doing work
	twice.  Avoid re-allocating the ops vector all the time.

2010-11-23  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-alias.c (refs_may_alias_p_1): Avoid calls to
	is_gimple_min_invariant, group tree code checks to allow
	combining them.
	(stmt_may_clobber_ref_p_1): Check for SSA_NAME instead
	of is_gimple_reg.

From-SVN: r167072
parent ad234fc7
2010-11-23 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid doing work
twice. Avoid re-allocating the ops vector all the time.
2010-11-23 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.c (refs_may_alias_p_1): Avoid calls to
is_gimple_min_invariant, group tree code checks to allow
combining them.
(stmt_may_clobber_ref_p_1): Check for SSA_NAME instead
of is_gimple_reg.
2010-11-23 Eric Botcazou <ebotcazou@adacore.com> 2010-11-23 Eric Botcazou <ebotcazou@adacore.com>
* config.gcc (sparc*-*-*): Reorder. * config.gcc (sparc*-*-*): Reorder.
...@@ -1000,21 +1000,23 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p) ...@@ -1000,21 +1000,23 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
*D.1663_44 = VIEW_CONVERT_EXPR<struct DB_LSN>(__tmp$B0F64_59); *D.1663_44 = VIEW_CONVERT_EXPR<struct DB_LSN>(__tmp$B0F64_59);
which is seen as a struct copy. */ which is seen as a struct copy. */
if (TREE_CODE (base1) == SSA_NAME if (TREE_CODE (base1) == SSA_NAME
|| TREE_CODE (base2) == SSA_NAME
|| TREE_CODE (base1) == CONST_DECL || TREE_CODE (base1) == CONST_DECL
|| TREE_CODE (base1) == CONSTRUCTOR
|| TREE_CODE (base1) == ADDR_EXPR
|| CONSTANT_CLASS_P (base1)
|| TREE_CODE (base2) == SSA_NAME
|| TREE_CODE (base2) == CONST_DECL || TREE_CODE (base2) == CONST_DECL
|| TREE_CODE (base1) == STRING_CST || TREE_CODE (base2) == CONSTRUCTOR
|| TREE_CODE (base2) == STRING_CST || TREE_CODE (base2) == ADDR_EXPR
|| is_gimple_min_invariant (base1) || CONSTANT_CLASS_P (base2))
|| is_gimple_min_invariant (base2))
return false; return false;
/* We can end up refering to code via function and label decls. /* We can end up refering to code via function and label decls.
As we likely do not properly track code aliases conservatively As we likely do not properly track code aliases conservatively
bail out. */ bail out. */
if (TREE_CODE (base1) == FUNCTION_DECL if (TREE_CODE (base1) == FUNCTION_DECL
|| TREE_CODE (base2) == FUNCTION_DECL
|| TREE_CODE (base1) == LABEL_DECL || TREE_CODE (base1) == LABEL_DECL
|| TREE_CODE (base2) == FUNCTION_DECL
|| TREE_CODE (base2) == LABEL_DECL) || TREE_CODE (base2) == LABEL_DECL)
return true; return true;
...@@ -1572,7 +1574,7 @@ stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref) ...@@ -1572,7 +1574,7 @@ stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref)
{ {
tree lhs = gimple_call_lhs (stmt); tree lhs = gimple_call_lhs (stmt);
if (lhs if (lhs
&& !is_gimple_reg (lhs)) && TREE_CODE (lhs) != SSA_NAME)
{ {
ao_ref r; ao_ref r;
ao_ref_init (&r, lhs); ao_ref_init (&r, lhs);
...@@ -1585,10 +1587,10 @@ stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref) ...@@ -1585,10 +1587,10 @@ stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref)
else if (gimple_assign_single_p (stmt)) else if (gimple_assign_single_p (stmt))
{ {
tree lhs = gimple_assign_lhs (stmt); tree lhs = gimple_assign_lhs (stmt);
if (!is_gimple_reg (lhs)) if (TREE_CODE (lhs) != SSA_NAME)
{ {
ao_ref r; ao_ref r;
ao_ref_init (&r, gimple_assign_lhs (stmt)); ao_ref_init (&r, lhs);
return refs_may_alias_p_1 (ref, &r, true); return refs_may_alias_p_1 (ref, &r, true);
} }
} }
......
...@@ -1288,21 +1288,25 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) ...@@ -1288,21 +1288,25 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
tree fndecl; tree fndecl;
tree base; tree base;
HOST_WIDE_INT offset, maxsize; HOST_WIDE_INT offset, maxsize;
static VEC (vn_reference_op_s, heap) *lhs_ops = NULL;
ao_ref lhs_ref;
bool lhs_ref_ok = false;
/* First try to disambiguate after value-replacing in the definitions LHS. */ /* First try to disambiguate after value-replacing in the definitions LHS. */
if (is_gimple_assign (def_stmt)) if (is_gimple_assign (def_stmt))
{ {
VEC (vn_reference_op_s, heap) *tem;
tree lhs = gimple_assign_lhs (def_stmt); tree lhs = gimple_assign_lhs (def_stmt);
ao_ref ref1; /* Avoid re-allocation overhead. */
VEC (vn_reference_op_s, heap) *operands = NULL; VEC_truncate (vn_reference_op_s, lhs_ops, 0);
bool res = true; copy_reference_ops_from_ref (lhs, &lhs_ops);
copy_reference_ops_from_ref (lhs, &operands); tem = lhs_ops;
operands = valueize_refs (operands); lhs_ops = valueize_refs (lhs_ops);
if (ao_ref_init_from_vn_reference (&ref1, get_alias_set (lhs), gcc_assert (lhs_ops == tem);
TREE_TYPE (lhs), operands)) lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref, get_alias_set (lhs),
res = refs_may_alias_p_1 (ref, &ref1, true); TREE_TYPE (lhs), lhs_ops);
VEC_free (vn_reference_op_s, heap, operands); if (lhs_ref_ok
if (!res) && !refs_may_alias_p_1 (ref, &lhs_ref, true))
return NULL; return NULL;
} }
...@@ -1378,34 +1382,38 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) ...@@ -1378,34 +1382,38 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
|| handled_component_p (gimple_assign_rhs1 (def_stmt)))) || handled_component_p (gimple_assign_rhs1 (def_stmt))))
{ {
tree base2; tree base2;
HOST_WIDE_INT offset2, size2, maxsize2; HOST_WIDE_INT offset2, size2;
int i, j; int i, j;
VEC (vn_reference_op_s, heap) *lhs = NULL, *rhs = NULL; VEC (vn_reference_op_s, heap) *rhs = NULL;
vn_reference_op_t vro; vn_reference_op_t vro;
ao_ref r; ao_ref r;
if (!lhs_ref_ok)
return (void *)-1;
/* See if the assignment kills REF. */ /* See if the assignment kills REF. */
base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), base2 = ao_ref_base (&lhs_ref);
&offset2, &size2, &maxsize2); offset2 = lhs_ref.offset;
if (!operand_equal_p (base, base2, 0) size2 = lhs_ref.size;
if ((base != base2
&& !operand_equal_p (base, base2, 0))
|| offset2 > offset || offset2 > offset
|| offset2 + size2 < offset + maxsize) || offset2 + size2 < offset + maxsize)
return (void *)-1; return (void *)-1;
/* Find the common base of ref and the lhs. */ /* Find the common base of ref and the lhs. lhs_ops already
copy_reference_ops_from_ref (gimple_assign_lhs (def_stmt), &lhs); contains valueized operands for the lhs. */
i = VEC_length (vn_reference_op_s, vr->operands) - 1; i = VEC_length (vn_reference_op_s, vr->operands) - 1;
j = VEC_length (vn_reference_op_s, lhs) - 1; j = VEC_length (vn_reference_op_s, lhs_ops) - 1;
while (j >= 0 && i >= 0 while (j >= 0 && i >= 0
&& vn_reference_op_eq (VEC_index (vn_reference_op_s, && vn_reference_op_eq (VEC_index (vn_reference_op_s,
vr->operands, i), vr->operands, i),
VEC_index (vn_reference_op_s, lhs, j))) VEC_index (vn_reference_op_s, lhs_ops, j)))
{ {
i--; i--;
j--; j--;
} }
VEC_free (vn_reference_op_s, heap, lhs);
/* i now points to the first additional op. /* i now points to the first additional op.
??? LHS may not be completely contained in VR, one or more ??? LHS may not be completely contained in VR, one or more
VIEW_CONVERT_EXPRs could be in its way. We could at least VIEW_CONVERT_EXPRs could be in its way. We could at least
......
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