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

             Bug #: 51592
           Summary: ICE with -fnon-call-exceptions
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: i...@airs.com


Compile this C program with -O -fexceptions -fnon-call-exceptions:


extern void f2 () __attribute__ ((noreturn));
void
f1 ()
{
  unsigned char a[8];
  unsigned int i;

  for (i = 0; i < 8; i++)
    {
      if (i > 8)
    f2 ();
      a[i] = i <= 8;
    }
}

With current mainline I get an ICE:

foo.c: In function ‘f1’:
foo.c:3:1: error: statement marked for throw, but doesn’t
# .MEM_17 = VDEF <.MEM_8(D)>
a[0] = D.1714_10;

foo.c:3:1: internal compiler error: verify_gimple failed

The basic problem is that the compiler thinks that a[i] can trap, and because
we are using -fnon-call-exceptions, it sets up an exception region for it. 
When the loop is unrolled, the statement changes from a[i] to a[0].  The
compiler knows that a[0] can not trap, but the statement is still in the
exception region.

Reply via email to