RFR: 8279219: [REDO] C2 crash when allocating array of size too large [v2]
Nils Eliasson
neliasso at openjdk.java.net
Thu Jan 27 17:25:39 UTC 2022
On Tue, 11 Jan 2022 13:48:13 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> The new fix is largely similar to the previous one. 3 bugs were filed
>> because of the previous change but there are only really 2 issues:
>>
>> - attaching the valid length condition at expansion time to the new
>> array runtime call causes issues. With Shenandoah, passes of loop
>> opts are executed after macro expansion but precedence edges are
>> ignored when assigning controls to nodes which causes loop opts to
>> incorrectly attempt to eliminate the node pointed to by the
>> precedence edge. A similar issue occurs when the runtime call ends
>> up in a subgraph that dies after macro expansion because the
>> precedence edge is not cleared by dead code elimination which causes
>> the runtime call to still be reachable. In the new patch, this is
>> fixed by appending an extra input to the runtime call instead of
>> using a precedence edge.
>>
>> - In the previous patch, a top valid length input is used when there's
>> no valid length input that needs to be recorded. That can cause an
>> assert failure during CCP. If valid length initially has type top,
>> the CatchNode out of the AllocateArray then have type (control,
>> control). If next, the valid length input becomes constant 0, the
>> CatchNode has type (top, control). An assert catches that the type
>> of the CatchNode doesn't widen. This fixed by using 1 by default as
>> valid length input and tweaking CatchNode::Value.
>>
>> The new patch includes test cases for both issues.
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
>
> review
src/hotspot/share/opto/macro.cpp line 1397:
> 1395: // allocate node with the call
> 1396: call->copy_call_debug_info(&_igvn, alloc);
> 1397: if (valid_length_test != NULL) {
How about adding a comment or assert that makes it clear that valid_length_test != NULL if it's an array that's allocated? If length == NULL, then valid_length_test is NULL too. Just to ease the reading of this code a bit.
-------------
PR: https://git.openjdk.java.net/jdk/pull/6952
More information about the hotspot-compiler-dev
mailing list