On Wed, 16 Nov 2016, Marc Glisse wrote:

> On Wed, 16 Nov 2016, Richard Biener wrote:
> 
> > On Wed, 16 Nov 2016, Marc Glisse wrote:
> > 
> > > On Wed, 16 Nov 2016, Richard Biener wrote:
> > > 
> > > > I am testing the following to avoid undefined behavior when negating
> > > > a multiplication (basically extending a previous fix to properly handle
> > > > negative power of two).
> > > > 
> > > > Bootstrap / regtest running on x86_64-unknown-linux-gnu.
> > > > 
> > > > Richard.
> > > > 
> > > > 2016-11-16  Richard Biener  <rguent...@suse.de>
> > > > 
> > > >         PR middle-end/78305
> > > >         * fold-const.c (negate_expr_p): Fix multiplication case.
> > > > 
> > > >         * gcc.dg/torture/pr78305.c: New testcase.
> > > > 
> > > > Index: gcc/fold-const.c
> > > > ===================================================================
> > > > --- gcc/fold-const.c    (revision 242471)
> > > > +++ gcc/fold-const.c    (working copy)
> > > > @@ -450,13 +450,15 @@ negate_expr_p (tree t)
> > > >       if (TYPE_UNSIGNED (type))
> > > >         break;
> > > >       /* INT_MIN/n * n doesn't overflow while negating one operand it
> > > > does
> > > > -         if n is a power of two.  */
> > > > +         if n is a power of (minus) two.  */
> > > 
> > > if n is (minus) a power of two.
> > > if n is a divisor of INT_MIN.
> > 
> > n is a divisor of INT_MIN is correct.
> > 
> > > >       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
> > > >           && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
> > > >           && ! ((TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
> > > > -                && ! integer_pow2p (TREE_OPERAND (t, 0)))
> > > > +                && (wi::popcount (TREE_OPERAND (t, 0))
> > > > +                    != 1 + wi::neg_p (TREE_OPERAND (t, 0), SIGNED)))
> > > 
> > > Is that supposed to test for (possibly negated) powers of 2? I don't see
> > > it.
> > > For -2, aka 0b11...110, popcount is 31 != 1 + 1.
> > 
> > It's supposed to test for a power of two with the sign-bit ORed in.
> > I believe those are which, when multiplied with some number can
> > yield INT_MIN.  That is, we look for a test that ensures that there
> > exists no number when multiplied with X yields INT_MIN.
> 
> The first sentence about ORing the sign bit sounds strange (except for a
> sign-magnitude representation). With 2's complement, INT_MIN is -2^31, the
> divisors are the 2^k and -(2^k). -2 * 2^30 yields INT_MIN, but your test
> misses -2 as a possible divisor. On the other hand, 0b100...001 (aka -INT_MAX)
> is not a divisor of INT_MIN but your test says the reverse.

Yeah, but it handled the testcase ;)  So I guess the easiest would be
to check integer_pow2p (abs (TREE_OPERAND (t, 0)) then, thus
wi::popcount (wi::abs (TREE_OPERAND (t, 0))) == 1?

Thanks,
Richard.

Reply via email to