On December 4, 2014 7:00:12 PM CET, Jan Hubicka <hubi...@ucw.cz> wrote: >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.
Can't you use dump for this? Richard. >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