https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116856
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|WAITING |RESOLVED --- Comment #7 from Richard Earnshaw <rearnsha at gcc dot gnu.org> --- *(uint32_t __attribute__ ((__aligned__(1)))*) &array[i + 4] ^= *(uint32_t __attribute__ ((__aligned__(1)))*) &array[i]; By casting an address to uint32_t you are asserting to the compiler that the address is 32-bit aligned. LDRD does two 32-bit aligned loads (see the Arm ARM DDI0553B). So this code is safe iff your address calculations produce 32-bit aligned values. If they don't then that's a bug in your code, not the compiler.