Skip to content

Commit 3352b56

Browse files
committed
8275326: C2: assert(no_dead_loop) failed: dead loop detected
Backport-of: 70d5dffb4e7110902b59b56efaef31614916148c
1 parent ad94355 commit 3352b56

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/hotspot/share/opto/cfgnode.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,13 +2006,13 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
20062006
// Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into
20072007
// MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...))
20082008
PhaseIterGVN* igvn = phase->is_IterGVN();
2009+
assert(igvn != NULL, "sanity check");
20092010
Node* hook = new Node(1);
20102011
PhiNode* new_base = (PhiNode*) clone();
20112012
// Must eagerly register phis, since they participate in loops.
2012-
if (igvn) {
2013-
igvn->register_new_node_with_optimizer(new_base);
2014-
hook->add_req(new_base);
2015-
}
2013+
igvn->register_new_node_with_optimizer(new_base);
2014+
hook->add_req(new_base);
2015+
20162016
MergeMemNode* result = MergeMemNode::make(new_base);
20172017
for (uint i = 1; i < req(); ++i) {
20182018
Node *ii = in(i);
@@ -2024,10 +2024,8 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
20242024
if (mms.is_empty()) {
20252025
Node* new_phi = new_base->slice_memory(mms.adr_type(phase->C));
20262026
made_new_phi = true;
2027-
if (igvn) {
2028-
igvn->register_new_node_with_optimizer(new_phi);
2029-
hook->add_req(new_phi);
2030-
}
2027+
igvn->register_new_node_with_optimizer(new_phi);
2028+
hook->add_req(new_phi);
20312029
mms.set_memory(new_phi);
20322030
}
20332031
Node* phi = mms.memory();
@@ -2045,6 +2043,13 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
20452043
}
20462044
}
20472045
}
2046+
// Already replace this phi node to cut it off from the graph to not interfere in dead loop checks during the
2047+
// transformations of the new phi nodes below. Otherwise, we could wrongly conclude that there is no dead loop
2048+
// because we are finding this phi node again. Also set the type of the new MergeMem node in case we are also
2049+
// visiting it in the transformations below.
2050+
igvn->replace_node(this, result);
2051+
igvn->set_type(result, result->bottom_type());
2052+
20482053
// now transform the new nodes, and return the mergemem
20492054
for (MergeMemStream mms(result); mms.next_non_empty(); ) {
20502055
Node* phi = mms.memory();

0 commit comments

Comments
 (0)