When compiling: void assignMultiplyVec(double* restrict __attribute__ ((aligned (16))) a, const double * restrict __attribute__ ((aligned (16))) b, double coef, unsigned count) { for(unsigned i=0; i<count; i++) { a[i] = b[i]*coef; } }
Using: gcc -std=c99 -march=core2 -mtune=core2 -O3 -mfpmath=sse -ftree-vectorize -ftree-vectorizer-verbose=9 The logs show: essai_restrict_ref.c:2: note: Alignment of access forced using versioning. essai_restrict_ref.c:2: note: Versioning for alignment will be applied. essai_restrict_ref.c:2: note: Vectorizing an unaligned access. and indeed the assembly code shows a test whether operands are 16-byte aligned. This versioning is superfluous, since variable attributes guarantee 16-byte alignment. -- Summary: vectorizer ignores alignment, useless versioning Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: David dot Monniaux at ens dot fr GCC build triplet: i486-linux-gnu GCC host triplet: i486-linux-gnu GCC target triplet: i486-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38011