From: Richard Biener Date: Thu, 14 May 2020 06:53:03 +0000 (+0200) Subject: middle-end/95118 - fix printing of denormal zero X-Git-Tag: releases/gcc-10.2.0~165 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe19d514ae915163b49fa344703ecfa1778a44d8;p=thirdparty%2Fgcc.git 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 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 --git a/gcc/real.c b/gcc/real.c index 00b23ceb41e4..09ec5c08c386 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 000000000000..69bc47fd7aad --- /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); +}