[Bug tree-optimization/88074] [7/8/9 Regression] g++ hangs on math expression

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Nov 19 13:56:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88074

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
A GCC-side fix is to limit the exponent range mpfr uses (for TFmode this
is -16381 to 16384).  Not sure if mpfr or mpc need larger exponent ranges
for intermediate computations...

Lazily initialized in mpfr_from_real but I guess we could do it globally
after target init?  (IIRC Fedora loads mpfr and friends lazily?)

diff --git a/gcc/realmpfr.c b/gcc/realmpfr.c
index 10f05caaba3..1f421990f52 100644
--- a/gcc/realmpfr.c
+++ b/gcc/realmpfr.c
@@ -23,6 +23,7 @@
 #include "tree.h"
 #include "realmpfr.h"
 #include "stor-layout.h"
+#include "diagnostic-core.h"

 /* Convert from REAL_VALUE_TYPE to MPFR.  The caller is responsible
    for initializing and clearing the MPFR parameter.  */
@@ -30,6 +31,31 @@
 void
 mpfr_from_real (mpfr_ptr m, const REAL_VALUE_TYPE *r, mp_rnd_t rndmode)
 {
+  static bool exp_initialized;
+
+  if (!exp_initialized)
+    {
+      machine_mode mode;
+      int min_exp = 1;
+      int max_exp = 1;
+      FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
+       if (SCALAR_FLOAT_MODE_P (mode))
+         {
+           const real_format *fmt = REAL_MODE_FORMAT (mode);
+           if (fmt)
+             {
+               if (fmt->emin < min_exp)
+                 min_exp = fmt->emin;
+               if (fmt->emax > max_exp)
+                 max_exp = fmt->emax;
+             }
+         }
+      if (mpfr_set_emin (min_exp)
+         || mpfr_set_emax (max_exp))
+       sorry ("mpfr not configured to handle all float modes");
+      exp_initialized = true;
+    }
+
   /* We use a string as an intermediate type.  */
   char buf[128];
   int ret;


More information about the Gcc-bugs mailing list