http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52407
--- Comment #1 from Uros Bizjak <ubizjak at gmail dot com> 2012-02-27 23:34:33
UTC ---
This looks like an aliasing violation to me:
vl_t w;
int64_t *p = (int64_t *)&w;
p[0] = p[1] = x;
Using following code, the test works OK:
union {
vl_t w;
int64_t p[2];
} z;
z.p[0] = z.p[1] = x;
while (m--)
*u++ = *v++ * z.w;
