Request for reviews (M): 7059047: EA: can't find initializing store with several CheckCastPP
Vladimir Kozlov
vladimir.kozlov at oracle.com
Mon Nov 7 12:37:39 PST 2011
Tom,
Could you look on this update? webrev.02 vs original webrev difference:
http://cr.openjdk.java.net/~kvn/7059047/webrev.update
Thanks,
Vladimir
Vladimir Kozlov wrote:
> Nothing was wrong with scalar_replaceable flag except it was not
> propagated to referenced objects so ArgEscape state was used in such cases.
>
> But I see what you are concern about. The escape state type should be
> pure escape state and applicable optimizations should be controlled by
> separate flag. OK, I returned back scalar_replaceable flag and 3
> original escape states:
>
> http://cr.openjdk.java.net/~kvn/7059047/webrev.02
>
> > Right, because ArgEscape means that we've lost track of identity
> because of aliasing?
>
> Correct.
>
> Thanks,
> Vladimir
>
> Tom Rodriguez wrote:
>> On Nov 1, 2011, at 1:59 PM, Vladimir Kozlov wrote:
>>
>>> Thank you, Tom
>>>
>>> Tom Rodriguez wrote:
>>>> I'm not sure I follow the distinction that's being made with
>>>> ControlEscape, or ArgEscape for that matter. They seem to be about
>>>> what optimizations we can do on an object more than whether they are
>>>> escaping or not, which makes the naming confusing. Or am I
>>>> misunderstand what's happening? Is this how they would be translated?
>>>> NoEscape == ScalarReplaceable
>>>> ControlEscape == NonEscaping
>>>> ArgEscape == LocallyEscaping
>>>> GlobalEscape == GlobalEcaping
>>> Your translation is correct. Yes, the states define optimizations we
>>> can do with objects.
>>>
>>>> Would be it be possible to come up with more descriptive names for
>>>> these states?
>>> How about your translation names?
>>
>> I'm happy with them of course but I wasn't sure they were accurate.
>> Some comments explaining the distinction would be helpful too.
>>
>> In thinking about this some more, I'm wondering whether it's right to
>> introduce this new state. What was wrong with the old
>> scalar_replaceable flag? It feels to me like we have two distinct
>> axes that we're trying to shove into a single number, which
>> complicates the terminology for it.
>>
>>>> Why is has_non_escaping_obj assigned to twice?
>>>> // mark all nodes reachable from ArgEscape nodes
>>>> ! has_non_escaping_obj = propagate_escape_state(&cg_worklist,
>>>> &worklist, PointsToNode::ArgEscape);
>>>> ! // mark all nodes reachable from ControlEscape nodes
>>>> ! has_non_escaping_obj = propagate_escape_state(&cg_worklist,
>>>> &worklist, PointsToNode::ControlEscape);
>>>> Should the second one be |=?
>>> You are right. My bad.
>>>
>>>> Do we eliminate locking on ControlEscape objects?
>>> Yes, the same as ArgEscape.
>>>
>>> I will add code for 7105605 to fold CmpP for NoEscape and
>>> ControlEscape objects. I don't think it will be safe to do for
>>> ArgEscape.
>>
>> Right, because ArgEscape means that we've lost track of identity
>> because of aliasing?
>>
>>> An other optimization I am thinking for ControlEscape objects is
>>> eliminating loads from it as we do for ScalarReplaceable objects.
>>
>> That seems good, though that might change how we name the states.
>> NoEscape means all optimizations and elimination of allocation,
>> ControlEscape just means we can't eliminate the allocation but we can
>> do other allocations. Maybe the NoEscape shouldn't be renamed
>> ScalarReplaceable then?
>>
>> tom
>>
>>> Thanks,
>>> Vladimir
>>>
>>>> tom
>>>> On Nov 1, 2011, at 11:41 AM, Vladimir Kozlov wrote:
>>>>> http://cr.openjdk.java.net/~kvn/7059047/webrev
>>>>>
>>>>> 7059047: EA: can't find initializing store with several CheckCastPP
>>>>>
>>>>> Added new escape state: ControlEscape. Use it instead of ArgEscape
>>>>> and (NoEscape && !_scalar_replaceable) in cases where not escaped
>>>>> objects can't be scalar replaced because of flow-insensitive
>>>>> analysis limitations. It is preparation for 7105605 changes.
>>>>>
>>>>> Split adjust_escape_state() method into two. New find_init_values()
>>>>> method is used to find fields initializing values for not escaped
>>>>> allocations. It is called before deferred edges are removed since
>>>>> it affects results. adjust_escape_state() now is called after all
>>>>> deferred edges are removed to get correct results.
>>>>>
>>>>> Factored out escape state propagation code into new method
>>>>> propagate_escape_state().
>>>>>
>>>>> Removed methods is_scalar_replaceable() and hidden_alias() which
>>>>> are not used and corresponding fields in PointsToNode (which will
>>>>> reduce used memory).
>>>>>
>>>>> Tested with CTW, jtreg, NSK, refworkload.
>>>>>
>>>>> Thanks,
>>>>> Vladimir
>>
More information about the hotspot-compiler-dev
mailing list