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.
Is it a bug?
---
With best regards, Konstantin