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> 2011-08-11 Richard Henderson <rth@redhat.com>
PR bootstrap/50018 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> 2011-08-11 Michael Matz <matz@suse.de>
* gcc.dg/graphite/run-id-pr47593.c: Remove -m32. * gcc.dg/graphite/run-id-pr47593.c: Remove -m32.
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -fdump-tree-fre1-details" } */ /* { dg-options "-O -fno-tree-sra -fdump-tree-fre1-details" } */
struct Foo { struct Foo {
Foo() {}; Foo() {};
...@@ -30,6 +30,6 @@ int main() ...@@ -30,6 +30,6 @@ int main()
} }
/* { dg-final { scan-tree-dump "Replaced b1.b with 1" "fre1" } } */ /* { 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.D.\[0-9\]*.i with 0" "fre1" } } */
/* { dg-final { scan-tree-dump "Replaced b1.f with 1" "fre1" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump "Replaced b1.D.\[0-9\]*.f with 1" "fre1" } } */
/* { dg-final { cleanup-tree-dump "fre1" } } */ /* { dg-final { cleanup-tree-dump "fre1" } } */
...@@ -1351,18 +1351,28 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) ...@@ -1351,18 +1351,28 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
{ {
VEC (vn_reference_op_s, heap) *tem; VEC (vn_reference_op_s, heap) *tem;
tree lhs = gimple_assign_lhs (def_stmt); tree lhs = gimple_assign_lhs (def_stmt);
bool valueized_anything = false;
/* Avoid re-allocation overhead. */ /* Avoid re-allocation overhead. */
VEC_truncate (vn_reference_op_s, lhs_ops, 0); VEC_truncate (vn_reference_op_s, lhs_ops, 0);
copy_reference_ops_from_ref (lhs, &lhs_ops); copy_reference_ops_from_ref (lhs, &lhs_ops);
tem = 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); 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); TREE_TYPE (lhs), lhs_ops);
if (lhs_ref_ok if (lhs_ref_ok
&& !refs_may_alias_p_1 (ref, &lhs_ref, true)) && !refs_may_alias_p_1 (ref, &lhs_ref, true))
return NULL; return NULL;
} }
else
{
ao_ref_init (&lhs_ref, lhs);
lhs_ref_ok = true;
}
}
base = ao_ref_base (ref); base = ao_ref_base (ref);
offset = ref->offset; offset = ref->offset;
...@@ -1469,6 +1479,20 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) ...@@ -1469,6 +1479,20 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
j--; 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. /* 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