The following test wrongly fails with a floating point exception (division
by integer 0) when built with -O2 for i686-pc-linux-gnu.  Based on an
example posted by Robert Seacord to the WG14 reflector.  It works with 3.4 and
earlier, fails with 4.0 and later.  The % operation may trap if it is % 0
(or INT_MIN % -1, cf bug 30484 and another recent reflector discussion
suggesting INT_MIN % -1 should in fact be undefined in ISO C), so cannot be
hoisted above the loop unless it is guaranteed to be executed at least once.

extern void exit (int);
extern void abort (void);

volatile int a = 1;
volatile int b = 0;
volatile int x = 2;
volatile signed int r = 8;

void __attribute__((noinline))
foo (void)
{
  exit (0);
}

int
main (void)
{
  int si1 = a;
  int si2 = b;
  int i;

  for (i = 0; i < 100; ++i) {
    foo ();
    if (x == 8)
      i++;
    r += i + si1 % si2;
  }
  abort ();
}


-- 
           Summary: [4.2/4.3/4.4 Regression] trapping expression wrongly
                    hoisted out of loop
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jsm28 at gcc dot gnu dot org


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

Reply via email to