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

            Bug ID: 119733
           Summary: store-merging increases alignment
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kristerw at gcc dot gnu.org
  Target Milestone: ---

store-merging miscompiles the following program when targeting x86_64 with the
options "-O3 -fno-strict-aliasing":


struct S { unsigned char a, b; unsigned short c; unsigned char d, e, f, g;
unsigned long long h; };

__attribute__((noipa)) void
f3 (struct S *p, struct S *q)
{
  unsigned char pa = q->a;
  unsigned char pb = q->b;
  unsigned short pc = q->c;
  unsigned char pd = q->d;
  unsigned char pe = q->e;
  unsigned char pf = q->f;
  unsigned char pg = q->g;
  p->a = pa;
  p->b = pb;
  p->c = pc;
  p->d = pd;
  p->e = pe;
  p->f = pf;
  p->g = pg;
}


The GIMPLE before store-merging performs the memory operations as:

  vect_pa_3.5_19 = MEM <vector(2) unsigned char> [(unsigned char *)q_2(D)];
  pc_5 = q_2(D)->c;
  vect_pd_6.10_24 = MEM <vector(4) unsigned char> [(unsigned char *)q_2(D) +
4B];
  MEM <vector(2) unsigned char> [(unsigned char *)p_10(D)] = vect_pa_3.5_19;
  p_10(D)->c = pc_5;
  MEM <vector(4) unsigned char> [(unsigned char *)p_10(D) + 4B] =
vect_pd_6.10_24;

which requires 32-bit alignment. The store-merging pass then changes this to

  _26 = MEM <unsigned long> [(void *)q_2(D)];
  MEM <unsigned long> [(void *)p_10(D)] = _26;

requiring 64-bit alignment.

Reply via email to