https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66917

--- Comment #7 from ktkachov at gcc dot gnu.org ---
(In reply to Richard Biener from comment #6)
> Probably because you access a.u/b.u which is uint64_t and thus the union
> is laid out as having 8 byte alignment?
> 
> How do the original GENERIC trees produced look like?

The 003t.original shows:
  typedef union 
  {
    uint64_t u[2];
    uint8_t c[16];
  } unionunion 
  {
    uint64_t u[2];
    uint8_t c[16];
  };
  union 
  {
    uint64_t u[2];
    uint8_t c[16];
  } a;
  union 
  {
    uint64_t u[2];
    uint8_t c[16];
  } b;

    union 
  {
    uint64_t u[2];
    uint8_t c[16];
  } a;
    union 
  {
    uint64_t u[2];
    uint8_t c[16];
  } b;
  memcpy ((void * restrict) &a.c, (const void * restrict) ap, 16);
  memcpy ((void * restrict) &b.c, (const void * restrict) bp, 16);
  a.u[0] = a.u[0] ^ b.u[0];
  a.u[1] = a.u[1] ^ b.u[1];
  memcpy ((void * restrict) outp, (const void * restrict) &a.c, 16);

Reply via email to