[RFC] optimize x - y cmp 0 with undefined overflow

Richard Biener richard.guenther@gmail.com
Mon Jun 2 10:36:00 GMT 2014


On Fri, May 30, 2014 at 10:48 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> I'd say we still handle "basic" symbolic range ops in
>> extract_range_from_binary_1
>> but in extract_range_from_binary_expr for a symbolic op0 we try to simplify
>> it with both [op1, op1] and with the value-range of op1 until we get a
>> non-varying range as result.  Not sure if it's worth restricting that
>> to the case
>> where op0s value-range refers to op1 or vice versa, and eventually only
>> use op1 symbolically then.
>
> Patch along these lines attached.  A bit heavy as expected, but it's VRP...
> It deals with my pet problem, you might want to check it does so with yours.
>
> Tested on x86_64-suse-linux with no regressions.

Looks mostly ok.  Any reason why you are not re-creating
MINUS_EXPR in build_symbolic_expr?  That is, build
inv - t (for non-pointers, of course)?  Otherwise if a range
becomes -t + inv that will no longer match get_single_symbol
for further propagation?

Then I'm not sure if

+      /* Try with VR0 and [-INF, OP1].  */
+      set_value_range (&new_vr1, VR_RANGE, vrp_val_min (expr_type), op1, NULL);
+      extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &new_vr1);
+      if (vr->type != VR_VARYING)
+       return;
+
+      /* Try with VR0 and [OP1, +INF].  */
+      set_value_range (&new_vr1, VR_RANGE, op1, vrp_val_max (expr_type), NULL);
+      extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &new_vr1);
+      if (vr->type != VR_VARYING)
+       return;

is a safe thing to do.  If it does make a difference to try [-INF, OP1],
[OP1, +INF] instead of just [OP1, OP1] then at least it's very suspicious ;)
(or an "easy" missed optimization).

So - can you fix the negate thing and drop the four cases trying
the +-INF based ranges?

Thanks,
Richard.

>
> 2014-05-30  Eric Botcazou  <ebotcazou@adacore.com>
>
>         * tree-vrp.c (get_single_symbol): New function.
>         (build_symbolic_expr): Likewise.
>         (symbolic_range_based_on_p): New predicate.
>         (extract_range_from_binary_expr_1): Deal with single-symbolic ranges
>         for PLUS and MINUS.  Do not drop symbolic ranges at the end.
>         (extract_range_from_binary_expr): Try harder for PLUS and MINUS if
>         operand is symbolic and based on the other operand.
>
>
> 2014-05-30  Eric Botcazou  <ebotcazou@adacore.com>
>
>         * gcc.dg/tree-ssa/vrp93.c: New test.
>         * gnat.dg/opt38.adb: Likewise.
>
>
> --
> Eric Botcazou



More information about the Gcc-patches mailing list