RFR: 8267988: C2: assert(!addp->is_AddP() || addp->in(AddPNode::Base)->is_top() || addp->in(AddPNode::Base) == n->in(AddPNode::Base)) failed: Base pointers must match (addp 1301) [v3]

Roland Westrelin roland at openjdk.java.net
Thu Jun 10 12:09:23 UTC 2021


On Thu, 10 Jun 2021 11:07:16 GMT, Vladimir Ivanov <vlivanov at openjdk.org> wrote:

>> Roland Westrelin has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains five commits:
>> 
>>  - review
>>  - merge
>>  - review
>>  - review
>>  - fix
>
> src/hotspot/share/opto/loopopts.cpp line 1510:
> 
>> 1508:           // is only added once both AddP nodes are sunk (see special code for AddP after the cast is created).
>> 1509:           if (x->in(0) == NULL && !x->is_DecodeNarrowPtr() &&
>> 1510:               !(x->is_AddP() && x->in(AddPNode::Address)->is_AddP() && x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base))) {
> 
> I read the last check as "not a case of chained AddP with different bases". 
> Then the comparison should be `!=`, shouldn't it?

It's safe to add a cast if it's not a chained AddP with the same base otherwise there's a risk that adding a cast would make the base differ.

> src/hotspot/share/opto/loopopts.cpp line 1523:
> 
>> 1521:                 register_new_node(cast, x_ctrl);
>> 1522:                 x->replace_edge(in, cast);
>> 1523:                 if (x->is_AddP() && k == AddPNode::Base) {
> 
> Does the code assume that "inner" node is processed first?
> Otherwise, the "outer" node could be already processed and bases don't match anymore.
> 
> I'm asking because `PhaseIdealLoop::split_if_with_blocks()` (which calls `split_if_with_blocks_post()` and `try_sink_out_of_loop()` does process users first.

The expectation is that uses are processed first.  The:
!(x->is_AddP() && x->in(AddPNode::Address)->is_AddP() && x->in(AddPNode::Address)->in(AddPNode::Base) == x->in(AddPNode::Base))
check guarantees the "outer" node doesn't change the base when it's processed. When the "inner" node is processed, bases for the inner and outer node are updated.

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

PR: https://git.openjdk.java.net/jdk/pull/4387


More information about the hotspot-compiler-dev mailing list