https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83175
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code Target| |Powerpc*-*-* Status|UNCONFIRMED |RESOLVED Component|c |middle-end Resolution|--- |INVALID --- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- I did not notice this before but you either need to use volatile or a memory barrier between the writes of unlockAddr1_f64[0]. Something like: volatile double *unlockAddr1_f64 = (volatile double*) thisVars(vol)->unlockAddr1; volatile double *unlockAddr2_f64 = (volatile double*) thisVars(vol)->unlockAddr2; cmd.word32[0] = ((command<<16) | command); cmd.word32[1] = cmd.word32[0]; unlockAddr1_f64[0] = unlock1_cmd.fword64; unlockAddr2_f64[0] = unlock2_cmd.fword64; unlockAddr1_f64[0] = cmd.fword64; Or something like: unlockAddr1_f64 = (double*) thisVars(vol)->unlockAddr1; unlockAddr2_f64 = (double*) thisVars(vol)->unlockAddr2; cmd.word32[0] = ((command<<16) | command); cmd.word32[1] = cmd.word32[0]; unlockAddr1_f64[0] = unlock1_cmd.fword64; asm("":::"memory"); unlockAddr2_f64[0] = unlock2_cmd.fword64; asm("":::"memory"); unlockAddr1_f64[0] = cmd.fword64;