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

            Bug ID: 118887
           Summary: Missed CSE of symbolic address computation
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: law at gcc dot gnu.org
  Target Milestone: ---

This code on riscv generates poor code at -O2:




struct S
{
  char p[48];
  unsigned long long q, r, s;
} s[50];

struct D
{
  unsigned long long q, r;
} d[50];

void
foo (void)
{
  unsigned long i;
  for (i = 0; i < 50; ++i)
    {
      d[i].q = s[i].q;
      d[i].r = s[i].r;
    }
}

In particular note the redundant address calculations for "s":
        lui     a1,%hi(s+2047)
        addi    a1,a1,%lo(s+2047)
        lui     a5,%hi(s+48)
        addi    a5,a5,%lo(s+48)

To produce s+48, we could have just subtracted 1999 from the s+2047
computation.  That would have an instruction.

Reply via email to