aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-02-16 15:00:45 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-02-16 15:00:45 +0000
commit87440c298eb2ed47166b8d57a4afc90d310f3a8f (patch)
tree8d0e66b862f18cc6aaa9eaf860c087a6377e9e42 /gcc/tree-ssa-alias.c
parent6d87c306c6a44f8db81a9a9f2f5de4d943d5e57f (diff)
downloadgcc-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.c22
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 ();