[gcc r10-8349] middle-end/95118 - fix printing of denormal zero

Richard Biener rguenth@gcc.gnu.org
Tue Jun 23 11:06:30 GMT 2020


https://gcc.gnu.org/g:fe19d514ae915163b49fa344703ecfa1778a44d8

commit r10-8349-gfe19d514ae915163b49fa344703ecfa1778a44d8
Author: Richard Biener <rguenther@suse.de>
Date:   Thu May 14 08:53:03 2020 +0200

    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.

Diff:
---
 gcc/real.c                     |  4 ++--
 gcc/testsuite/gcc.dg/pr95118.c | 11 +++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gcc/real.c b/gcc/real.c
index 00b23ceb41e..09ec5c08c38 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -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;
diff --git a/gcc/testsuite/gcc.dg/pr95118.c b/gcc/testsuite/gcc.dg/pr95118.c
new file mode 100644
index 00000000000..69bc47fd7aa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95118.c
@@ -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);
+}


More information about the Gcc-cvs mailing list