[Bug tree-optimization/80198] [8/9/10/11 Regression] does not vectorize generic inplace integer operation
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Wed Jan 27 12:43:48 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80198
--- Comment #21 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 27 Jan 2021, rsandifo at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80198
>
> --- Comment #20 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #19)
> > So I think when you consider
> >
> > void __attribute__((noinline)) fun(int * a, int * b, int c)
> > {
> > int i;
> > for (i=0; i < 256; i++) {
> > a[i] = b[i] | c;
> > }
> > }
> >
> > we can improve the versioning condition to allow a dependence distance
> > of zero.
> This one was fixed by r10-4803. E.g. for aarch64 we now have:
>
> add x3, x1, 4
> sub x3, x0, x3
> cmp x3, 8
> bls .L5
Ah, yeah - I failed to decipher the generated check:
_7 = b_12 + 4;
_22 = a_10 - _7;
_23 = (sizetype) _22;
if (_23 > 8)
the difference is -4U and thus > 8 when a == b.
> > Likewise with
> >
> > void __attribute__((noipa)) generic(int * a, int * b, int c)
> > {
> > int i;
> > a = __builtin_assume_aligned (a, 16);
> > b = __builtin_assume_aligned (b, 16);
> > for (i=0; i < 256; i++) {
> > a[i] = b[i] | c;
> > }
> > }
> >
> > we fail to realize no versioning check is required - the distance is
> > either zero or a multiple of 16.
> >
> > Richard - ISTR you added some alignment considerations to the alias
> > versioning code, but it doesn't seem to help?
> I don't remember adding anything for that, but yeah, I agree it looks
> like we need it.
More information about the Gcc-bugs
mailing list