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

            Bug ID: 64255
           Summary: failures with -O2 optimization on i >= 0 ? (unsigned
                    long) i : - (unsigned long) i
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vincent-gcc at vinc17 dot net

I get failures when building and testing MPFR with:

gcc (Debian 20141209-1) 5.0.0 20141209 (experimental) [trunk revision 218514]

on x86_64, using:

./configure --enable-assert=full CC=gcc-snapshot 'CFLAGS=-Wall -O2 -g'

Using -O1 only makes the problems disappear.

If I simplify the MPFR code to:

int
mpfr_set_si_2exp (mpfr_ptr x, long i, mpfr_exp_t e, mpfr_rnd_t rnd_mode)
{
  if (i == 0)
    {
      return 0;
    }
  else
    {
      unsigned long ai;

      ai = i >= 0 ? (unsigned long) i : - (unsigned long) i;
      if ((i >= 0 ? (unsigned long) i : - (unsigned long) i) != ai)
        printf ("Error!\n");
      printf ("i = %ld\n", i);
      printf ("ai = %lX\n", ai);
      return 0;
    }
}

in set_si_2exp.c, and call:

  mpfr_set_si_2exp (x, 1, 0, 0);

I get:

i = 1
ai = FFFFFFFFFFFFFFFF

If I remove the

      if ((i >= 0 ? (unsigned long) i : - (unsigned long) i) != ai)
        printf ("Error!\n");

test, I get:

i = 1
ai = 1

as expected.

I don't know why, but I didn't manage to get a standalone testcase.

Reply via email to