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);
}

Reply via email to