On 10/31/2017 03:49 AM, Kugan Vivekanandarajah wrote:
> Hi Jeff,
> 
> On 31 October 2017 at 14:47, Jeff Law <l...@redhat.com> wrote:
>> On 10/29/2017 03:54 PM, Kugan Vivekanandarajah wrote:
>>> Hi Jeff,
>>>
>>> On 28 October 2017 at 18:28, Jeff Law <l...@redhat.com> wrote:
>>>>
>>>> Jan,
>>>>
>>>> What's the purpose behind calling vrp_meet and
>>>> extract_range_from_unary_expr from within the IPA passes?
>>>
>>> This is used such that when we have an argument to a function and this
>>> for which we know the VR and this intern is passed as a parameter to
>>> another. For example:
>>>
>>> void foo (int i)
>>> {
>>> ...
>>>   bar (unary_op (i))
>>> ...
>>> }
>>>
>>> This is mainly to share what is done in tree-vrp.
>> Presumably you never have equivalences or anything like that, which
>> probably helps with not touching vrp_bitmap_obstack which isn't
>> initialized when you run the IPA bits.
>>
>>>>
>>>> AFAICT that is not safe to do.  Various paths through those routines
>>>> will access static objects within tree-vrp.c which may not be
>>>> initialized when IPA runs (vrp_equiv_obstack, vr_value).
>>>
>>> IPA-VRP does not track equivalence and vr_value is not used.
>> But there's no enforcement and I'd be hard pressed to believe that all
>> the paths through the routines you use in tree-vrp aren't going to touch
>> vr_value, or vrp_bitmap_obstack.  vrp_bitmap_obstack turns out to be
>> incredibly tangled into the implementations within tree-vrp.c :(
>>
> 
> I looked into the usage and it does seem to be not using vr_value
> unless I am missing something. There are two overloaded functions
> here:
> 
> extract_range_from_unary_expr (value_range *vr,
>                    enum tree_code code, tree type,
>                    value_range *vr0_, tree op0_type)
> is safe as this works with value_range and does not use
> get_value_range to access vr_value.
Agreed that it doesn't access vr_value.  I think I got somewhat confused
by the overload and I hadn't worked through
extract_range_from_binary_expr_1 to see if needed vr_values or just the
vrp_bitmap_obstack (it just needs the latter).  Once I narrowed what
extract_range_from_binary_expr_1 needed it was pretty clear.

But we still need access to vrp_bitmap_obstack via the calls to
copy_value_range and via the call to extract_range_from_binary_expr_1.
Now in the case of the calls from IPA we may not have equivalences
attached to the vr_range so that *may* be OK in practice, but this is
something that also needs some cleaning up to avoid nasty runtime
surprises in the future.



> 
> extract_range_from_unary_expr (value_range *vr, enum tree_code code,
>                    tree type, tree op0)
> This is not safe as this takes tree as an argument and gets
> value_range by calling get_value_range. May be we should change the
> names to reflect this.
Well, what I suspect will happen is the former routine will continue to
be a free function while the latter will likely move into the vr_values
class.  That's what I've got here and what allows me to quickly see
where the violations are.

The big benefit is it gets much harder to mess things up and we don't
have to do a deep manual inspection.  A function that needs vr_values
will be within the class or perhaps have the class instance passed in.
 It becomes very clear at compile time what does and does not need
vr_values.

Furthermore, if someone were to mess things up (say by trying to call
vrp_visit_assignment_or_call from the IPA passes), they'll see at
compile time that they don't have a class instance for vr_values rather
than seeing some kind of weird runtime failure.

Jeff

Reply via email to