This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On Mon, Jun 2, 2014 at 12:36 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> 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?

Btw, the testcases are missing in the patch so I can't have a look myself.

Richard.

> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]