On 07/19/2018 04:18 AM, Richard Biener wrote:
On Wed, Jul 18, 2018 at 2:05 PM Aldy Hernandez <al...@redhat.com> wrote:
Hi again!
Well, since this hasn't been reviewed and I'm about to overhaul the
TYPE_OVERFLOW_WRAPS code anyhow, might as well lump it all in one patch.
On 07/16/2018 09:19 AM, Aldy Hernandez wrote:
Howdy!
I've abstracted out the cross product calculations into its own
function, and have adapted it to deal with wide ints so it's more
reusable. It required some shuffling around, and implementing things a
bit different, but things should be behave as before.
I also renamed vrp_int_const_binop to make its intent clearer,
especially now that it's really just a wrapper to wide_int_binop that
deals with overflow.
(If wide_int_binop_overflow is generally useful, perhaps we could merge
it with wide_int_overflow.)
This is the same as the previous patch, plus I'm abstracting the
TYPE_OVERFLOW_WRAPS code as well. With this, the code dealing with
MULT_EXPR in vrp gets reduced to handling value_range specific stuff.
Yay code re-use!
A few notes:
This is dead code. I've removed it:
- /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
- drop to VR_VARYING. It would take more effort to compute a
- precise range for such a case. For example, if we have
- op0 == 65536 and op1 == 65536 with their ranges both being
- ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
- we cannot claim that the product is in ~[0,0]. Note that we
- are guaranteed to have vr0.type == vr1.type at this
- point. */
- if (vr0.type == VR_ANTI_RANGE
- && !TYPE_OVERFLOW_UNDEFINED (expr_type))
- {
- set_value_range_to_varying (vr);
- return;
- }
Also, the vrp_int typedef has a weird name, especially when we have
widest2_int in gimple-fold.c that does the exact thing. I've moved the
common code to wide-int.h and tree.h so we can all share :).
At some point we could move the wide_int_range* and wide_int_binop* code
into its own file.
Yes.
Sometime within the next couple rounds I'll come up with a file name
that doesn't hurt my eyes. It seems that the hardest part of
programming is actually coming up with sensible file and variable names :-/.
Tested on x86-64 Linux.
OK?
+bool
+wide_int_range_cross_product_wrapping (wide_int &res_lb,
+ wide_int &res_ub,
please rename this to sth like wide_int_range_mult_wrapping
because it only handles multiplication to not confuse it with
the other function.
Done.
Thanks.
Aldy
Otherwise OK (and sorry for the delay in reviewing).
Thanks,
Richard.