[13] RFR (S): 8217918: C2: -XX:+AggressiveUnboxing is broken
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Fri Feb 1 18:33:23 UTC 2019
>>> Nice! Did you consider to update indexes in separate pass at the end
>>> of PhaseRenumberLive? Would it be simpler?
>>
>> It already does additional pass, but only over the nodes which contain
>> embedded IDs (those are recorded into _delayed during the first pass).
>> If you are talking about full pass over the graph, then it would allow
>> to eliminate _delayed array.
>
> No, I was only concern about code in new_index() where you store
> _live_node_count if Id is not set in _old2new_map.
> I was thinking to collect all nodes with ID (regardless values in
> _old2new_map) first as you do now for _delayed. And then do the same as
> your code (call update_embedded_ids() in post loop) where you can assume
> that _old2new_map contains all values - so you can replace your checks
> with asserts. Am I missing something?
I spotted the following code to produce Phi with instance_id which may
become stale (base phi goes dead) by the time RenumberLive kicks in:
Node *LoadNode::split_through_phi(PhaseGVN *phase) {
...
if (!t_oop->is_known_instance() && load_boxed_values) {
// Use _idx of address base for boxed values.
this_iid = base->_idx;
}
PhaseIterGVN* igvn = phase->is_IterGVN();
Node* phi = new PhiNode(region, this_type, NULL, mem->_idx, this_iid,
this_index, this_offset);
It looks benign if we can guarantee that the ID won't be reused, so I
allocate a placeholder ID.
Best regards,
Vladimir Ivanov
[1]
http://hg.openjdk.java.net/jdk/jdk/file/tip/src/hotspot/share/opto/memnode.cpp#l1442
>>
>> Also, it's possible to do everything in a single pass, but it requires
>> eager allocation of IDs for not-yet-seen nodes (which needs
>> _new2old_map).
>>
>> Best regards,
>> Vladimir Ivanov
>>
>>> On 1/31/19 11:10 AM, Vladimir Ivanov wrote:
>>>> https://bugs.openjdk.java.net/browse/JDK-8217918
>>>> http://cr.openjdk.java.net/~vlivanov/8217918/webrev.00/
>>>>
>>>> When -XX:+AggressiveUnboxing is enabled,
>>>> LoadNode::split_through_phi() produces Phi nodes with non-negative
>>>> _inst_mem_id & _inst_id early enough, so it breaks PhaseRenumber
>>>> pass which doesn't support nodes with embedded IDs.
>>>>
>>>> Proposed fix tracks nodes with embedded IDs and updates them once
>>>> renumbering pass over the graph is over.
>>>>
>>>> Testing: hs-precheckin-comp, tier1-5
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list