Question about vectorization
Konstantin Vladimirov
konstantin.vladimirov@gmail.com
Thu Jan 15 13:22:00 GMT 2015
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
More information about the Gcc
mailing list