------- 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

Reply via email to