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