On Sat, Oct 8, 2016 at 9:38 PM, kugan <kugan.vivekanandara...@linaro.org> wrote:
> Hi Richard,
>
> Thanks for the review.
> On 07/10/16 20:11, Richard Biener wrote:
>>
>> On Fri, Oct 7, 2016 at 12:00 AM, kugan
>> <kugan.vivekanandara...@linaro.org> wrote:
>>>
>>> Hi,
>>>
>>> In vrp intersect_ranges, Richard recently changed it to create integer
>>> value
>>> ranges when it is integer singleton.
>>>
>>> Maybe we should do the same when the other range is a complex ranges with
>>> SSA_NAME (like [x+2, +INF])?
>>>
>>> Attached patch tries to do this. There are cases where it will be
>>> beneficial
>>> as the  testcase in the patch. (For this testcase to work with Early VRP,
>>> we
>>> need the patch posted at
>>> https://gcc.gnu.org/ml/gcc-patches/2016-10/msg00413.html)
>>>
>>> Bootstrapped and regression tested on x86_64-linux-gnu with no new
>>> regressions.
>>
>>
>> This is not clearly a win, in fact it can completely lose an ASSERT_EXPR
>> because there is no way to add its effect back as an equivalence.  The
>> current choice of always using the "left" keeps the ASSERT_EXPR range
>> and is able to record the other range via an equivalence.
>
>
> How about changing the order in Early VRP when we are dealing with the same
> SSA_NAME in inner and outer scope. Here is a patch that does this. Is this
> OK if no new regressions?

I'm not sure if this is a good way forward.  The failure with the testcase is
that we don't extract a range for k from if (j < k) which I believe another
patch from you addresses?

As said the issue is with the equivalence / value-range representation so
you can't do sth like

          /* Discover VR when condition is true.  */
          extract_range_for_var_from_comparison_expr (op0, code, op0, op1, &vr);
          if (old_vr->type == VR_RANGE || old_vr->type == VR_ANTI_RANGE)
            vrp_intersect_ranges (&vr, old_vr);

          /* If we found any usable VR, set the VR to ssa_name and create a
             PUSH old value in the stack with the old VR.  */
          if (vr.type == VR_RANGE || vr.type == VR_ANTI_RANGE)
            {
              new_vr = vrp_value_range_pool.allocate ();
              *new_vr = vr;
              push_value_range (op0, new_vr);
  ->>>  add equivalence to old_vr for new_vr.

because old_vr and new_vr are the 'same' (they are associated with SSA name op0)

Richard.

> Thanks,
> Kugan
>
>
>
>
>
>> My thought on this was that we need to separate "ranges" and associated
>> SSA names so we can introduce new ranges w/o the need for an SSA name
>> (and thus we can create an equivalence to the ASSERT_EXPR range).
>> IIRC I started on this at some point but never finished it ...
>>
>> Richard.
>>
>>> Thanks,
>>> Kugan
>>>
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>> 2016-10-07  Kugan Vivekanandarajah  <kug...@linaro.org>
>>>
>>>         * gcc.dg/tree-ssa/evrp6.c: New test.
>>>
>>> gcc/ChangeLog:
>>>
>>> 2016-10-07  Kugan Vivekanandarajah  <kug...@linaro.org>
>>>
>>>         * tree-vrp.c (intersect_ranges): If we failed to handle
>>>         the intersection and the other range involves computation with
>>>         symbolic values, choose integer range if available.
>>>
>>>
>>>
>

Reply via email to