This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] optimize x - y cmp 0 with undefined overflow
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 2 Jun 2014 12:37:46 +0200
- Subject: Re: [RFC] optimize x - y cmp 0 with undefined overflow
- Authentication-results: sourceware.org; auth=none
- References: <1466969 dot VvFMuDKXoD at polaris> <2973073 dot WOSPpEhgk4 at polaris> <CAFiYyc2Lu-YqCS2dsiOCLQ-Y6U0bGMp2bXSLSMz=mGqeHGKakQ at mail dot gmail dot com> <2272943 dot QullF6hSsT at polaris> <CAFiYyc2YZOoquGM8E_+HtGBswQJS3yM9jBjaf4GKvaGNpwsfKg at mail dot gmail dot com>
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