RFR: 8289943: Simplify some object allocation merges [v13]
Vladimir Ivanov
vlivanov at openjdk.org
Tue Oct 11 23:25:18 UTC 2022
On Thu, 6 Oct 2022 16:50:28 GMT, Cesar Soares Lucas <cslucas at openjdk.org> wrote:
>> Hi there, can I please get some feedback on this approach to simplify object allocation merges in order to promote Scalar Replacement of the objects involved in the merge?
>>
>> The basic idea for this [approach was discussed in this thread](https://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2022-April/055189.html) and it consists of:
>> 1) Identify Phi nodes that merge object allocations and replace them with a new IR node called ReducedAllocationMergeNode (RAM node).
>> 2) Scalar Replace the incoming allocations to the RAM node.
>> 3) Scalar Replace the RAM node itself.
>>
>> There are a few conditions for doing the replacement of the Phi by a RAM node though - Although I plan to work on removing them in subsequent PRs:
>>
>> - The only supported users of the original Phi are AddP->Load, SafePoints/Traps, DecodeN.
>>
>> These are the critical parts of the implementation and I'd appreciate it very much if you could tell me if what I implemented isn't violating any C2 IR constraints:
>>
>> - The way I identify/use the memory edges that will be used to find the last stored values to the merged object fields.
>> - The way I check if there is an incoming Allocate node to the original Phi node.
>> - The way I check if there is no store to the merged objects after they are merged.
>>
>> Testing:
>> - Windows/Linux/MAC fastdebug/release
>> - hotspot_all
>> - tier1
>> - Renaissance
>> - dacapo
>> - new IR-based tests
>
> Cesar Soares Lucas has updated the pull request incrementally with one additional commit since the last revision:
>
> Fix x86 tests.
Minor comments. No need to act until we agree on high-level aspects of the patch.
src/hotspot/share/opto/escape.cpp line 403:
> 401: int ConnectionGraph::reduce_allocation_merges() {
> 402: Unique_Node_List ideal_nodes;
> 403: ideal_nodes.map(_compile->live_nodes(), NULL);
You do a full pass over the whole graph to enumerate `Phi`s. Don't you achieve the same when enumerating `LocalVar`s from the CG?
src/hotspot/share/opto/escape.cpp line 4075:
> 4073:
> 4074: // Update the memory inputs of ReducedAllocationMerge nodes
> 4075: Unique_Node_List ram_nodes;
Same here: pass over the whole graph to enumerate `ReducedAllocationMerge` nodes. For such cases, we keep node lists on Compile (see `GrowableArray<Node*>` declared there).
-------------
PR: https://git.openjdk.org/jdk/pull/9073
More information about the hotspot-compiler-dev
mailing list