On Thu, Jan 15, 2015 at 2:22 PM, Konstantin Vladimirov
<konstantin.vladimi...@gmail.com> wrote:
> Hi,
>
> Consider simple test:
>
> #include <stdlib.h>
>
> #ifdef FAILV
>
> unsigned short* get_aa(void);
> double* get_bb(void);
>
> #else
>
> extern unsigned short a[1024];
> extern double b[1024];
>
> #endif
>
>
> unsigned short *foo()
> {
>     size_t i;
>
> #ifdef FAILV
>     unsigned short * restrict aa = get_aa();
>     double * restrict bb = get_bb();
> #else
>     unsigned short * restrict aa = a;
>     double * restrict bb = b;
> #endif
>
>     for (i = 0; i < 1024; ++i)
>     {
>         *bb = *aa;
>         ++bb; ++aa;
>     }
>
>     return aa;
> }
>
> Compile it with latest gcc, 4.8 or 4.9:
>
> gcc -O3 -ftree-vectorizer-verbose=2 --std=c99 -S test.c
> gcc -O3 -ftree-vectorizer-verbose=2 --std=c99 -S test.c -DFAILV
>
> In second case it outputs:
>
> test.c:28: note: versioning for alias required: can't determine
> dependence between *aa_22 and *bb_23
>
> So loop is vectorized but there is unnecessary aliasing check inside.
>
> But AFAIC, due to strong aliasing rules, compiler should statically
> know, that aliasing is not possible in that case.

It can know but only because it is in a loop.  I belive this is fixed
already for GCC 5.

Richard.



> Is it a bug?
>
> ---
> With best regards, Konstantin

Reply via email to