[Bug tree-optimization/17679] New: Aliasing problem with ivopts

rakdver at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sun Sep 26 15:55:00 GMT 2004


The following testcase is misscompiled with -O2 -ftree-loop-ivcanon.  The
reason is that ivopts rewrite the first loop into (equivalent of)

b[0] = 1;
b[1] = 2;
b[2] = 3;
for (tmp = &a, cnt = 3; cnt != 0; tmp += 4B, cnt--)
  if (*tmp != *(tmp - &a + &b))
    { puts ("ERR 1"); break; }

Rtl alias analysis concludes that "a" is base for the register in that
(tmp - &a + &b) is computed.  Store motion than decides that the stores
to "b" before the loop are not used inside loop and moves them after the loop,
thus causing the error.

Reason for this behavior is that the code above is illegal in C (you cannot
take difference of two different arrays).  However ivopts needs to produce
this type of expressions.

int a[3] = {1,2,3};
int c[3] = {4,5,6};

int main(void)
{
  int b[3];
  int i;

  b[0] = 1;
  b[1] = 2;
  b[2] = 3;

  for (i = 0; i < 3; i++)
    if (a[i] != b[i])
      {
        puts ("ERR 1");
        break;
      }

  b[0] = 4;
  b[1] = 5;
  b[2] = 6;

  for (i = 0; i < 3; i++)
    if (c[i] != b[i])
      {
        puts ("ERR 2");
        break;
      }

  return 0;
}

-- 
           Summary: Aliasing problem with ivopts
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: tree-optimization
        AssignedTo: rakdver at gcc dot gnu dot org
        ReportedBy: rakdver at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17679



More information about the Gcc-bugs mailing list