https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30128
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|Strange code generated |byte independent store not | |done in some cases due to | |truncation of addition too | |early --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- These two functions should produce the same code but only foo1 produces one store and one add. #define GSF_LE_SET_GUINT32(p, dat) \ ((*((char *)(p) + 0) = (char) ((dat)) & 0xff), \ (*((char *)(p) + 1) = (char) ((dat) >> 8) & 0xff), \ (*((char *)(p) + 2) = (char) ((dat) >> 16) & 0xff), \ (*((char *)(p) + 3) = (char) ((dat) >> 24) & 0xff)) void bar (void *); void foo (unsigned i) { char buffer[4]; unsigned len = i + 1; GSF_LE_SET_GUINT32 (buffer, len + 1); bar (buffer); } void foo1 (unsigned i) { char buffer[4]; unsigned len = i + 1; len += 1; GSF_LE_SET_GUINT32 (buffer, len); bar (buffer); }