Commit 25aa059e by Richard Guenther Committed by Richard Biener

tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid redundant lookups, make looking…

tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid redundant lookups, make looking through aggregate copies stronger.

2011-08-11  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid redundant
	lookups, make looking through aggregate copies stronger.

	* g++.dg/tree-ssa/pr41186.C: Un-XFAIL.

From-SVN: r177672
parent 3627ac1a
2011-08-11 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid redundant
lookups, make looking through aggregate copies stronger.
2011-08-11 Richard Henderson <rth@redhat.com>
PR bootstrap/50018
......
2011-08-11 Richard Guenther <rguenther@suse.de>
* g++.dg/tree-ssa/pr41186.C: Un-XFAIL.
2011-08-11 Michael Matz <matz@suse.de>
* gcc.dg/graphite/run-id-pr47593.c: Remove -m32.
......
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-fre1-details" } */
/* { dg-options "-O -fno-tree-sra -fdump-tree-fre1-details" } */
struct Foo {
Foo() {};
......@@ -30,6 +30,6 @@ int main()
}
/* { dg-final { scan-tree-dump "Replaced b1.b with 1" "fre1" } } */
/* { dg-final { scan-tree-dump "Replaced b1.i with 0" "fre1" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump "Replaced b1.f with 1" "fre1" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump "Replaced b1.D.\[0-9\]*.i with 0" "fre1" } } */
/* { dg-final { scan-tree-dump "Replaced b1.D.\[0-9\]*.f with 1" "fre1" } } */
/* { dg-final { cleanup-tree-dump "fre1" } } */
......@@ -1351,18 +1351,28 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
{
VEC (vn_reference_op_s, heap) *tem;
tree lhs = gimple_assign_lhs (def_stmt);
bool valueized_anything = false;
/* Avoid re-allocation overhead. */
VEC_truncate (vn_reference_op_s, lhs_ops, 0);
copy_reference_ops_from_ref (lhs, &lhs_ops);
tem = lhs_ops;
lhs_ops = valueize_refs (lhs_ops);
lhs_ops = valueize_refs_1 (lhs_ops, &valueized_anything);
gcc_assert (lhs_ops == tem);
lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref, get_alias_set (lhs),
if (valueized_anything)
{
lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref,
get_alias_set (lhs),
TREE_TYPE (lhs), lhs_ops);
if (lhs_ref_ok
&& !refs_may_alias_p_1 (ref, &lhs_ref, true))
return NULL;
}
else
{
ao_ref_init (&lhs_ref, lhs);
lhs_ref_ok = true;
}
}
base = ao_ref_base (ref);
offset = ref->offset;
......@@ -1469,6 +1479,20 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
j--;
}
/* ??? The innermost op should always be a MEM_REF and we already
checked that the assignment to the lhs kills vr. Thus for
aggregate copies using char[] types the vn_reference_op_eq
may fail when comparing types for compatibility. But we really
don't care here - further lookups with the rewritten operands
will simply fail if we messed up types too badly. */
if (j == 0 && i == 0
&& VEC_index (vn_reference_op_s, lhs_ops, 0)->opcode == MEM_REF
&& VEC_index (vn_reference_op_s, vr->operands, i)->opcode == MEM_REF
&& tree_int_cst_equal
(VEC_index (vn_reference_op_s, lhs_ops, 0)->op0,
VEC_index (vn_reference_op_s, vr->operands, i)->op0))
i--, j--;
/* i now points to the first additional op.
??? LHS may not be completely contained in VR, one or more
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