On Tue, Apr 18, 2023 at 11:33:05AM +0200, Jakub Jelinek wrote:
> On Tue, Apr 18, 2023 at 11:06:38AM +0200, Aldy Hernandez via Gcc-patches
> wrote:
> > This patch provides inchash support for vrange. It is along the lines
> > of the streaming support I just posted and will be used for IPA
> > hashing of ranges.
> >
> > Thoughts?
> >
> > gcc/ChangeLog:
> >
> > * inchash.cc (hash::add_real_value): New.
> > * inchash.h (class hash): Add add_real_value.
> > * value-range.cc (add_vrange): New.
> > * value-range.h (inchash::add_vrange): New.
> > ---
> > gcc/inchash.cc | 20 +++++++++++++++++++
> > gcc/inchash.h | 2 ++
> > gcc/value-range.cc | 48 ++++++++++++++++++++++++++++++++++++++++++++++
> > gcc/value-range.h | 6 ++++++
> > 4 files changed, 76 insertions(+)
> >
> > diff --git a/gcc/inchash.cc b/gcc/inchash.cc
> > index a30662b97fe..914e3cc92cd 100644
> > --- a/gcc/inchash.cc
> > +++ b/gcc/inchash.cc
> > @@ -24,3 +24,23 @@ along with GCC; see the file COPYING3. If not see
> > #endif
> > #include "system.h"
> > #include "coretypes.h"
> > +#include "real.h"
> > +#include "inchash.h"
> > +
> > +namespace inchash
> > +{
> > +
> > +/* This is here instead of inchash.h to keep us from having to put
> > + real.h in coretypes.h. */
> > +void
> > +hash::add_real_value (const real_value &v)
> > +{
> > + add_int (v.sign);
> > + add_int (v.uexp);
> > + for (unsigned i = 0; i < SIGSZ; ++i)
> > + add_hwi (v.sig[i]);
> > + /* Ignore the rest of the flags, as sign, exponent, and
> > + significant bits should be enough. */
>
> I don't think that's the case.
> At least cl, decimal and signalling are essential flags as well.
> Dunno about canonical.
> How do you otherwise differentiate between Inf and +0.0 or (canonical)
> qNaN or (canonical) sNaN?
> They have the same sign, uexp and sig.
I'd say it is best to follow real_identical that is used for the
comparisons, that one always compares cl and sign and then differentiates
based on cl:
1) for rvc_zero/rvc_inf, everything else is ignored
2) for rvc_normal, decimal, uexp and sig are compared
3) for rvc_nan, signalling and canonical are compared and if !canonical,
sig is also compared
So, perhaps:
add_int (v.cl);
add_int (v.sign);
switch (v.cl)
{
case rvc_zero:
case rvc_inf:
return;
case rvc_normal:
add_int (v.decimal);
add_int (REAL_EXP (&v));
break;
case rvc_nan:
add_int (v.signalling);
add_int (v.canonical);
if (v.canonical)
return;
break;
default:
gcc_unreachable ();
}
for (unsigned i = 0; i < SIGSZ; ++i)
add_hwi (v.sig[i]);
Jakub