@@ -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