https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115552
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So basically since main writes via a double type but then spookyhash_short reads via a uint64_t type there is an alias violation. Using an union to change the pointer type does not change there is an alias violation happening. You need to use memcpy for copying from one type to another in this case. Instead of doing: c += u.p64[0]; You could do load_64(&u.p64[0]) and have load_64 defined to be: ``` static inline uint64_t load_64(void *a) { uint64_t t; memcpy(&t, a, sizeof(t)); return t; } ```