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