Compilation of the attached code (adapted from
http://gcc.gnu.org/projects/tree-ssa/vectorization.html
example3)
* works and vectorizes with gcc-4.0.1
g++ -O -msse -ftree-vectorizer -c vect.cpp
* works with gcc-4.1.0 and 4.2.0-20060311 if one of the above options is
omitted
(but does not or not fully vectorize...)
* fails with gcc-4.1.0 and 4.2.0-20060311
g++ -O -msse -ftree-vectorizer -c vect.cpp
[...] "alignment of array elements is greater than element size"
I have more examples. I tried on PentiumIV and AMD64. The error is triggered
when a pointer to a 16-byte aligned int (or double, or float) is used as class
member or as a local variable or argument in a member function. It seems that
pointers in member functions are treated as arrays.
I think this is a bug, since the same code in a C-style function does not
trigger the error. It essentially prevents the use of SSE alignment with C++
and severely limits opportunities for auto-vectorization.
/* begin vect.cpp */
typedef int aint __attribute__ ((__aligned__(16)));
void foo (int n, aint * __restrict__ p, aint * __restrict q)
{ while (n--) *p++ = *q++; }
struct toto {
static void foo (int n, aint * __restrict__ p, aint * __restrict q)
{ while (n--) *p++ = *q++; }
};
void tata(int n, aint * __restrict__ p, aint * __restrict q)
{
toto x;
x.foo(n,p,q);
}
/* end vect.cpp */
--
Summary: pointers to 16-byte aligned ints are rejected in member
functions
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dubos at lmd dot polytechnique dot fr
GCC host triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26654