From: Jakub Jelinek <jakub@redhat.com>
To: Andrew MacLeod <amacleod@redhat.com>
Cc: Aldy Hernandez <aldyh@redhat.com>, GCC patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] [PR tree-optimization/18639] Compare nonzero bits in irange with widest_int.
Date: Fri, 3 Feb 2023 17:25:58 +0100 [thread overview]
Message-ID: <Y901lWcaL5WXrZmN@tucnak> (raw)
In-Reply-To: <4fc527b8-c5e0-97a6-725f-8e86b7c1e494@redhat.com>
On Fri, Feb 03, 2023 at 11:23:28AM -0500, Andrew MacLeod wrote:
>
> On 2/3/23 04:16, Jakub Jelinek wrote:
> > On Fri, Feb 03, 2023 at 09:50:43AM +0100, Aldy Hernandez wrote:
> > > [PR tree-optimization/18639] Compare nonzero bits in irange with widest_int.
> > 0 missing in the bug number in the subject line, though the current
> > recommended formatting of the subject is I think:
> > value-range: Compare nonzero bits in irange with widest_int [PR180639]
> > PR 108639/tree-optimization
> >
> > Reversed component and number
> >
> > > --- a/gcc/value-range.cc
> > > +++ b/gcc/value-range.cc
> > > @@ -1259,7 +1259,10 @@ irange::legacy_equal_p (const irange &other) const
> > > other.tree_lower_bound (0))
> > > && vrp_operand_equal_p (tree_upper_bound (0),
> > > other.tree_upper_bound (0))
> > > - && get_nonzero_bits () == other.get_nonzero_bits ());
> > > + && (widest_int::from (get_nonzero_bits (),
> > > + TYPE_SIGN (type ()))
> > > + == widest_int::from (other.get_nonzero_bits (),
> > > + TYPE_SIGN (other.type ()))));
> > > }
> > > bool
> > > @@ -1294,7 +1297,11 @@ irange::operator== (const irange &other) const
> > > || !operand_equal_p (ub, ub_other, 0))
> > > return false;
> > > }
> > > - return get_nonzero_bits () == other.get_nonzero_bits ();
> > > + widest_int nz1 = widest_int::from (get_nonzero_bits (),
> > > + TYPE_SIGN (type ()));
> > > + widest_int nz2 = widest_int::from (other.get_nonzero_bits (),
> > > + TYPE_SIGN (other.type ()));
> > > + return nz1 == nz2;
> > > }
> > While the above avoids the ICE (and would be certainly correct for
> > the bounds, depending on the sign of their type sign or zero extended
> > to widest int), but is the above what we want for non-zero bits
> > to be considered equal? The wide_ints (which ought to have precision
> > of the corresponding type) don't represent normal numbers but bitmasks,
> > 0 - this bit is known to be zero, 1 - nothing is known about this bit).
> > So, if there are different precisions and the narrower value has 0
> > in the MSB of the bitmask (so MSB is known to be zero), the above requires
> > for equality that in the other range all upper bits are known to be zero
> > too for both signed and unsigned. That is ok. Similarly for MSB set
> > if TYPE_SIGN of the narrower is unsigned, the MSB value is unknown, but we
> > require on the wider to have all the upper bits cleared. But for signed
> > narrower type with MSB set, i.e. it is unknown if it is positive or
> > negative, the above requires that all the above bits are unknown too.
> > And that is the case I'm not sure about, whether in that case the
> > upper bits of the wider wide_int should be checked at all.
> > Though, perhaps from the POV of nonzero bits derived from the sign-extended
> > values in the ranges sign bit copies (so all above bits 1) is what one would
> > get, so maybe it is ok. Just food for thought.
> >
> if the bits match exactly along with everything else, then we can be sure
> the ranges are truly equal. If for some reason the numbers are all the same
> but the non-zero bits don't compare equal, then I can't think of what harm
> it could cause to compare unequal.. Worst case is we dont perform some
> optimization in this extremely rare scenario of differing precisions. And
> in fact they could actually be unequal...
>
> So I suspect this is fine...
Ok then.
Jakub
prev parent reply other threads:[~2023-02-03 20:13 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-03 8:50 Aldy Hernandez
2023-02-03 9:16 ` Jakub Jelinek
2023-02-03 16:23 ` Andrew MacLeod
2023-02-03 16:25 ` Jakub Jelinek [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y901lWcaL5WXrZmN@tucnak \
--to=jakub@redhat.com \
--cc=aldyh@redhat.com \
--cc=amacleod@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).