// { dg-do run }
// { dg-options "-O2" }

char heap[50000];

int
main ()
{
  for (unsigned ix = sizeof (heap); ix--;)
    heap[ix] = ix;
  return 0;
}

(distilled from http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113851
PR middle-end/27620 testcase) is miscompiled on {x86_64,i?86}-linux at -O2.

At mergephi pass it still looks correct:
int main()
{
  unsigned int ix;
  char D.2349;
  bool retval.0;
<bb 2>:
  goto <bb 4> (<L1>);
<L0>:;
  ix_9 = ix_5;
  D.2349_10 = (char) ix_5;
  heap[ix_5] = D.2349_10;
  # ix_2 = PHI <50000(2), ix_5(3)>;
<L1>:;
  ix_5 = ix_2 - 1;
  if (ix_5 != 4294967295) goto <L0>; else goto <L2>;
<L2>:;
  return 0;
}

but then vrp1 folds ix_5 != 4294967295 as 1 and since that this is an endless
loop which obviously segfaults.  But, given that ix is unsigned, wrapping
around
is valid.


-- 
           Summary: [4.1/4.2 regression] VRP miscompilation of simple loop
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jakub at gcc dot gnu dot org


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

Reply via email to