middle-end/95118 - fix printing of denormal zero

This fixes printing a REAL_CST generated from value-numbering
punning some bits to a real which turns out as zero with big
negative exponent.  This causes the loop in real_to_decimal_for_mode to
never terminate.

2020-05-14  Richard Biener  <rguenther@suse.de>

	PR middle-end/95118
	* real.c (real_to_decimal_for_mode): Make sure we handle
	a zero with nonzero exponent.

	* gcc.dg/pr95118.c: New testcase.
This commit is contained in:
Richard Biener 2020-05-14 08:53:03 +02:00
parent 7a50e70875
commit 568c985113
4 changed files with 24 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2020-05-14 Richard Biener <rguenther@suse.de>
PR middle-end/95118
* real.c (real_to_decimal_for_mode): Make sure we handle
a zero with nonzero exponent.
2020-05-14 Jakub Jelinek <jakub@redhat.com>
* Makefile.in (GTFILES): Add omp-general.c.

View File

@ -1714,8 +1714,8 @@ real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig,
do_multiply (&u, &v, ten);
/* Stop if we're now >= 1. */
if (REAL_EXP (&u) > 0)
/* Stop if we're now >= 1 or zero. */
if (REAL_EXP (&u) > 0 || u.cl == rvc_zero)
break;
v = u;

View File

@ -1,3 +1,8 @@
2020-05-14 Richard Biener <rguenther@suse.de>
PR middle-end/95118
* gcc.dg/pr95118.c: New testcase.
2020-05-14 Jakub Jelinek <jakub@redhat.com>
* c-c++-common/gomp/declare-variant-14.c: New test.

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-fre" } */
void a();
void b() {
union {
int c[4];
long double d;
} e = {{0, 0, 4}};
a(e.d);
}