8154836: VM crash due to "Base pointers must match"
Improve the handling of AddP nodes in final graph reshaping. Reviewed-by: kvn, zmajo
This commit is contained in:
parent
593cf3fb16
commit
8f2a47ba2e
@ -2846,7 +2846,7 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
|
|||||||
assert( !addp->is_AddP() ||
|
assert( !addp->is_AddP() ||
|
||||||
addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
|
addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
|
||||||
addp->in(AddPNode::Base) == n->in(AddPNode::Base),
|
addp->in(AddPNode::Base) == n->in(AddPNode::Base),
|
||||||
"Base pointers must match" );
|
"Base pointers must match (addp %u)", addp->_idx );
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
if ((UseCompressedOops || UseCompressedClassPointers) &&
|
if ((UseCompressedOops || UseCompressedClassPointers) &&
|
||||||
addp->Opcode() == Op_ConP &&
|
addp->Opcode() == Op_ConP &&
|
||||||
@ -2881,6 +2881,21 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
|
|||||||
} else {
|
} else {
|
||||||
nn = new DecodeNKlassNode(nn, t);
|
nn = new DecodeNKlassNode(nn, t);
|
||||||
}
|
}
|
||||||
|
// Check for succeeding AddP which uses the same Base.
|
||||||
|
// Otherwise we will run into the assertion above when visiting that guy.
|
||||||
|
for (uint i = 0; i < n->outcnt(); ++i) {
|
||||||
|
Node *out_i = n->raw_out(i);
|
||||||
|
if (out_i && out_i->is_AddP() && out_i->in(AddPNode::Base) == addp) {
|
||||||
|
out_i->set_req(AddPNode::Base, nn);
|
||||||
|
#ifdef ASSERT
|
||||||
|
for (uint j = 0; j < out_i->outcnt(); ++j) {
|
||||||
|
Node *out_j = out_i->raw_out(j);
|
||||||
|
assert(out_j == NULL || !out_j->is_AddP() || out_j->in(AddPNode::Base) != addp,
|
||||||
|
"more than 2 AddP nodes in a chain (out_j %u)", out_j->_idx);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
n->set_req(AddPNode::Base, nn);
|
n->set_req(AddPNode::Base, nn);
|
||||||
n->set_req(AddPNode::Address, nn);
|
n->set_req(AddPNode::Address, nn);
|
||||||
if (addp->outcnt() == 0) {
|
if (addp->outcnt() == 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user