RFR: 8302850: Implement C1 clone intrinsic that reuses arraycopy code for primitive arrays [v7]

Galder Zamarreño galder at openjdk.org
Tue Apr 9 15:54:06 UTC 2024


On Fri, 5 Apr 2024 02:16:55 GMT, Dean Long <dlong at openjdk.org> wrote:

>> Galder Zamarreño has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 10 commits:
>> 
>>  - Merge branch 'master' into topic.0131.c1-array-clone
>>  - Merge branch 'master' into topic.0131.c1-array-clone
>>  - Reserve necessary frame map space for clone use cases
>>  - 8302850: C1 primitive array clone intrinsic in graph
>>    
>>    * Combine array length, new type array and arraycopy for clone in c1 graph.
>>    * Add OmitCheckFlags to skip arraycopy checks.
>>    * Instantiate ArrayCopyStub only if necessary.
>>    * Avoid zeroing newly created arrays for clone.
>>    * Add array null after c1 clone compilation test.
>>    * Pass force reexecute to intrinsic via value stack.
>>    This is needed to be able to deoptimize correctly this intrinsic.
>>    * When new type array or array copy are used for the clone intrinsic,
>>    their state needs to be based on the state before for deoptimization
>>    to work as expected.
>>  - Revert "8302850: Primitive array copy C1 intrinsic for aarch64 and x86"
>>    
>>    This reverts commit fe5d916724614391a685bbef58ea939c84197d07.
>>  - 8302850: Link code emit infos for null check and alloc array
>>  - 8302850: Null check array before getting its length
>>    
>>    * Added a jtreg test to verify the null check works.
>>    Without the fix this test fails with a SEGV crash.
>>  - 8302850: Force reexecuting clone in case of a deoptimization
>>    
>>    * Copy state including locals for clone
>>    so that reexecution works as expected.
>>  - 8302850: Avoid instantiating array copy stub for clone use cases
>>  - 8302850: Primitive array copy C1 intrinsic for aarch64 and x86
>>    
>>    * Clone calls that involve Phi nodes are not supported.
>>    * Add unimplemented stubs for other platforms.
>
> I think we could eventually relax the requirement that receiver_klass be loaded, at least for object arrays, but for simplicity my patch will follow the existing behavior.

@dean-long I tried your patch and my test worked fine with it. I had one doubt about the following:


    Value recv = apop();
    apush(recv);


Wouldn't you prefer to just peek the top of the stack rather than pop it to push it again? I would expect the former to be cheaper to do?

> My patch still needs some work.

What else does it need?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/17667#issuecomment-2045534567


More information about the hotspot-compiler-dev mailing list