diff options
author | Richard Biener <rguenther@suse.de> | 2016-02-16 15:00:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-02-16 15:00:45 +0000 |
commit | 87440c298eb2ed47166b8d57a4afc90d310f3a8f (patch) | |
tree | 8d0e66b862f18cc6aaa9eaf860c087a6377e9e42 /gcc/tree-ssa-alias.c | |
parent | 6d87c306c6a44f8db81a9a9f2f5de4d943d5e57f (diff) | |
download | gcc-87440c298eb2ed47166b8d57a4afc90d310f3a8f.zip gcc-87440c298eb2ed47166b8d57a4afc90d310f3a8f.tar.gz gcc-87440c298eb2ed47166b8d57a4afc90d310f3a8f.tar.bz2 |
re PR tree-optimization/69776 (Wrong optimization with aliasing)
2016-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/69776
* tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Get alias
sets from caller.
(indirect_refs_may_alias_p): Likewise.
(refs_may_alias_p_1): Pass alias sets as from ao_ref.
* tree-ssa-sccvn.c (vn_reference_lookup): Also adjust vr alias-set
according to tbaa_p.
* tree-ssa-dom.c (lookup_avail_expr): Add tbaa_p flag.
(optimize_stmt): For redundant store discovery do not allow tbaa.
* gcc.dg/torture/pr69776-2.c: New testcase.
From-SVN: r233453
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index c9c09c8..08f10e5 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1067,12 +1067,8 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1)); /* If the alias set for a pointer access is zero all bets are off. */ - if (base1_alias_set == -1) - base1_alias_set = get_deref_alias_set (ptrtype1); if (base1_alias_set == 0) return true; - if (base2_alias_set == -1) - base2_alias_set = get_alias_set (base2); /* When we are trying to disambiguate an access with a pointer dereference as base versus one with a decl as base we can use both the size @@ -1239,13 +1235,8 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, ptrtype2 = TREE_TYPE (TREE_OPERAND (base2, 1)); /* If the alias set for a pointer access is zero all bets are off. */ - if (base1_alias_set == -1) - base1_alias_set = get_deref_alias_set (ptrtype1); - if (base1_alias_set == 0) - return true; - if (base2_alias_set == -1) - base2_alias_set = get_deref_alias_set (ptrtype2); - if (base2_alias_set == 0) + if (base1_alias_set == 0 + || base2_alias_set == 0) return true; /* If both references are through the same type, they do not alias @@ -1417,7 +1408,8 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p) if (var1_p && ind2_p) return indirect_ref_may_alias_decl_p (ref2->ref, base2, offset2, max_size2, - ao_ref_alias_set (ref2), -1, + ao_ref_alias_set (ref2), + ao_ref_base_alias_set (ref2), ref1->ref, base1, offset1, max_size1, ao_ref_alias_set (ref1), @@ -1426,10 +1418,12 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p) else if (ind1_p && ind2_p) return indirect_refs_may_alias_p (ref1->ref, base1, offset1, max_size1, - ao_ref_alias_set (ref1), -1, + ao_ref_alias_set (ref1), + ao_ref_base_alias_set (ref1), ref2->ref, base2, offset2, max_size2, - ao_ref_alias_set (ref2), -1, + ao_ref_alias_set (ref2), + ao_ref_base_alias_set (ref2), tbaa_p); gcc_unreachable (); |