middle-end/95118 - fix printing of denormal zero
authorRichard Biener <rguenther@suse.de>
Thu, 14 May 2020 06:53:03 +0000 (08:53 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 14 May 2020 08:50:05 +0000 (10:50 +0200)
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.

gcc/ChangeLog
gcc/real.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr95118.c [new file with mode: 0644]

index 360ad7a5b583d86ee40631997e6778cd65014ea5..e0a50f10e855e00fd36e63de0ac862930ca77305 100644 (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.
index 00b23ceb41e44a8685f24495299e425d2c018e48..09ec5c08c3863e18f498009e9a3d36522f6c2a9d 100644 (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;
index 2b6d4becf4eca2c1c3ea8045ad854d2bf2fe7122..b731544a8c6d315740f4a159070233672927e024 100644 (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.
diff --git a/gcc/testsuite/gcc.dg/pr95118.c b/gcc/testsuite/gcc.dg/pr95118.c
new file mode 100644 (file)
index 0000000..69bc47f
--- /dev/null
@@ -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);
+}