[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