This code violates c/c++ aliasing rules.
Sent from my iPhone
On Mar 23, 2008, at 6:33, "victork at gcc dot gnu dot org" <[EMAIL PROTECTED]
> wrote:
------- Comment #6 from victork at gcc dot gnu dot org 2008-03-23
13:33 -------
Here is AN even more reduced example which demonstrates the problem:
int main()
{
char buf[256];
char *dest;
int i;
dest = &buf[2];
for (i = 0; i < 32; i++)
{
*(unsigned *)dest = 0;
dest += 4;
}
return buf[2];
}
gcc -O3 t.c && ./a.out
Segmentation fault
The problem is that vectorizer is assuming that the access was
aligned to the
the size of the element before vectorization. A loop peeling only
handles
misalignment in multiples of element size.
In this case, vectorizer could check the actual alignment in compile
time and
prevent vectorization. (Though the assignment of a constant still
can be
vectorized if value of constant is adjusted accordingly).
In general case, when alignment of the non-vectorized access is
unknown, a fix
of this bug would require an addition of a run-time test.
--
victork at gcc dot gnu dot org changed:
What |Removed |Added
---
---
----------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |victork at gcc dot
gnu dot
|dot org |org
Status|NEW |ASSIGNED
Last reconfirmed|2008-03-21 17:47:58 |2008-03-23 13:33:08
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35653