On Tue, Apr 13, 2021 at 3:50 PM Richard Biener <rguent...@suse.de> wrote: > > This adds disambiguation of the access size vs. the decl size > in the pointer based vs. decl based disambiguator. We have > a TBAA based check like this already but that's fend off when > seeing alias-sets of zero or when -fno-strict-aliasing is in > effect. Also the perceived dynamic type could be smaller than > the actual access. > > Bootstrapped and tested on x86_64-unknown-linux-gnu, queued for stage1.
g:d1d01a66012a93cc8cb7dafbe1b5ec453ec96b59 > 2021-04-13 Richard Biener <rguent...@suse.de> > > PR tree-optimization/100051 > * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Add > disambiguator based on access size vs. decl size. > > * gcc.dg/tree-ssa/ssa-fre-92.c: New testcase. > --- > gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c | 21 +++++++++++++++++++++ > gcc/tree-ssa-alias.c | 11 +++++++++++ > 2 files changed, 32 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c > b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c > new file mode 100644 > index 00000000000..c67fcea5e93 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c > @@ -0,0 +1,21 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-fre1" } */ > + > +extern void foo(void); > +int a, c, *f, **d = &f; > +char b; > +int main() > +{ > + if (a) { > + b = 0; > + int *g = &c; > + *g = 0; > + f = *d; > + *d = f; > + if ((2 ^ b) == 0) > + foo(); > + } > + return 0; > +} > + > +/* { dg-final { scan-tree-dump-not "foo" "fre1" } } */ > diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c > index ebb3f49c86c..6c7d2f1b7e0 100644 > --- a/gcc/tree-ssa-alias.c > +++ b/gcc/tree-ssa-alias.c > @@ -2034,6 +2034,17 @@ indirect_ref_may_alias_decl_p (tree ref1 > ATTRIBUTE_UNUSED, tree base1, > if (TREE_CODE (base1) != TARGET_MEM_REF > && !ranges_maybe_overlap_p (offset1 + moff, -1, offset2, max_size2)) > return false; > + > + /* If the pointer based access is bigger than the variable they cannot > + alias. This is similar to the check below where we use TBAA to > + increase the size of the pointer based access based on the dynamic > + type of a containing object we can infer from it. */ > + poly_int64 dsize2; > + if (known_size_p (size1) > + && poly_int_tree_p (DECL_SIZE (base2), &dsize2) > + && known_lt (dsize2, size1)) > + return false; > + > /* They also cannot alias if the pointer may not point to the decl. */ > if (!ptr_deref_may_alias_decl_p (ptr1, base2)) > return false; > -- > 2.26.2