[Bug middle-end/87276] New: Buggy code with -O2 in trunk revision 264170: MPFR test tstrtofr fails
vincent-gcc at vinc17 dot net
gcc-bugzilla@gcc.gnu.org
Tue Sep 11 02:36:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87276
Bug ID: 87276
Summary: Buggy code with -O2 in trunk revision 264170: MPFR
test tstrtofr fails
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: vincent-gcc at vinc17 dot net
Target Milestone: ---
On Debian x86_64, I get the following failure with
gcc (Debian 20180908-1) 9.0.0 20180908 (experimental) [trunk revision 264170]
This is a regression, as there are no issues with either GCC 8 or with
gcc (Debian 20180822-1) 9.0.0 20180822 (experimental) [trunk revision 263760]
When building the MPFR trunk revision 13165 with
./configure --enable-assert=full CC=gcc-snapshot CFLAGS="-O2"
(no issues with -O or with -O2 -fsanitize=undefined -fno-sanitize-recover), I
get a failure in tstrtofr:
Check overflow failed (2) with:
s=''
x=0
I've modified MPFR's strtofr.c to the following (i.e. adding printf's):
[...]
long read_exp = strtol (str + 1, &endptr, 10);
if (endptr != str+1)
str = endptr;
sum =
read_exp < MPFR_EXP_MIN ? (str = endptr, MPFR_EXP_MIN) :
read_exp > MPFR_EXP_MAX ? (str = endptr, MPFR_EXP_MAX) :
(mpfr_exp_t) read_exp;
printf ("%ld %d\n", sum, res);
printf ("%ld\n", pstr->exp_base);
MPFR_SADD_OVERFLOW (sum, sum, pstr->exp_base,
mpfr_exp_t, mpfr_uexp_t,
MPFR_EXP_MIN, MPFR_EXP_MAX,
res = 2, res = 3);
// printf ("%ld %d\n", sum, res);
[...]
and reduced tstrtofr.c to:
#include "mpfr-test.h"
static void
check_overflow (void)
{
mpfr_t x;
char *s;
mpfr_init (x);
mpfr_strtofr (x, "123456789E9223372036854775807", &s, 0, MPFR_RNDN);
if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) )
{
printf ("Check overflow failed (2) with:\n s='%s'\n x=", s);
mpfr_dump (x);
exit (1);
}
mpfr_clear (x);
}
int
main (int argc, char *argv[])
{
tests_start_mpfr ();
check_overflow ();
tests_end_mpfr ();
return 0;
}
I get the following failure:
9223372036854775807 1
9
Check overflow failed (2) with:
s=''
x=0
Then, if I uncomment the last printf line, the failure disappears, and I get:
9223372036854775807 1
9
9223372036854775807 2
More information about the Gcc-bugs
mailing list