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;