Hi,
this patch fixes implementation of shift in sreal.h that ICEs on 0 value.
Also the comment is copied from shift_right and does not make sense for
sreal.h.

The to_double conversion is useful for debug output: Most of inliner data is
now output as integer that does not make much sense.

Bootstrapped/regtested x86_64-linux, OK?

        * sreal.h (to_double): Declare.
        (shift): Do not ICE on 0, update outdated comment.
        * sreal.c: Include math.h
        (sreal::to_double): New function.
Index: sreal.h
===================================================================
--- sreal.h     (revision 218286)
+++ sreal.h     (working copy)
@@ -53,6 +53,7 @@
 
   void dump (FILE *) const;
   int64_t to_int () const;
+  double to_double () const;
   sreal operator+ (const sreal &other) const;
   sreal operator- (const sreal &other) const;
   sreal operator* (const sreal &other) const;
@@ -93,12 +94,14 @@
 
   sreal shift (int s) const
   {
+    /* Zero needs no shifting.  */
+    if (!m_sig)
+      return *this;
     gcc_checking_assert (s <= SREAL_BITS);
     gcc_checking_assert (s >= -SREAL_BITS);
 
-    /* Exponent should never be so large because shift_right is used only by
-     sreal_add and sreal_sub ant thus the number cannot be shifted out from
-     exponent range.  */
+    /* Overflows/drop to 0 could be handled gracefully, but hopefully we do not
+       need to do so.  */
     gcc_checking_assert (m_exp + s <= SREAL_MAX_EXP);
     gcc_checking_assert (m_exp + s >= -SREAL_MAX_EXP);
 
Index: sreal.c
===================================================================
--- sreal.c     (revision 218286)
+++ sreal.c     (working copy)
@@ -47,6 +47,7 @@
        sig == 0 && exp == -SREAL_MAX_EXP
 */
 
+#include <math.h>
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
@@ -167,6 +168,19 @@
   return sign * m_sig;
 }
 
+/* Return value of *this as double.  */
+
+double
+sreal::to_double () const
+{
+  double val = m_sig;
+  if (m_negative)
+    val = -val;
+  if (m_exp)
+    val *= exp2 (m_exp);
+  return val;
+}
+
 /* Return *this + other.  */
 
 sreal

Reply via email to