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

            Bug ID: 64291
           Summary: [5 Regression] Miscompile t-div in GMP's testsuite
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: glisse at gcc dot gnu.org

In the following code, on x86_64-unknown-linux-gnu, we should call g(0,8,16),
but we somehow end up calling g(0,16,16). The most suspicious dump is
marc.c.228r.postreload.

$ gcc-4.9 -O2 marc.c f.c && ./a.out

$ gcc-5 -O2 marc.c f.c && ./a.out
a.out: f.c:3: g: Assertion `a==8' failed.
zsh: abort      ./a.out

$ cat f.c
#include <assert.h>
void f(void*p,...){}
void g(void*p,long a,long b){assert(a==8);}

$ cat marc.c
void f(void*,...);
void g(void*,long,long);
int nnn=0;
long test=0;

typedef struct
{
  int _mp_size;
  unsigned long *_mp_d;
} __mpz_struct;
typedef __mpz_struct mpz_t[1];

int main ()
{
  mpz_t n, d;
  long nn, dn;
  unsigned long *np, *dup, *dnp, *qp;
  long alloc, itch;

  f (n);
  f (d);
  qp = (unsigned long*)__builtin_alloca(4099*8) + 1;
  dnp = (unsigned long*)__builtin_alloca (2049*8);
  alloc = 1;
  for (test = 0; test < 1; test++)
  {
    dn = d->_mp_size;
    dup = d->_mp_d;
    f (dnp, dup, dn);
    dnp[dn - 1] |= 1UL<<63;
    f (0);
    nn = nnn;
    np = n->_mp_d;
    qp[-1] = -757136820;
    qp[nn - dn + 1] = 14883681;
    f (0);
    if (dn >= 6)
      f (0);
    itch = nn + 1;
    if (itch + 1> alloc)
    {
      g(0,alloc*8,(itch+1)*8);
      alloc = itch + 1;
    }
    f (np, nn);
  }
  return 0;
}

Reply via email to