SUGGESTED FIX
diff --git a/src/share/vm/opto/ifnode.cpp b/src/share/vm/opto/ifnode.cpp
--- a/src/share/vm/opto/ifnode.cpp
+++ b/src/share/vm/opto/ifnode.cpp
@@ -725,6 +725,11 @@ static Node *remove_useless_bool(IfNode
int true_path = phi->is_diamond_phi();
if( true_path == 0 ) return NULL;
+ // Make sure that iff and the control of the phi are different. This
+ // should really only happen for dead control flow since it requires
+ // an illegal cycle.
+ if (phi->in(0)->in(1)->in(0) == iff) return NULL;
+
// phi->region->if_proj->ifnode->bool->cmp
BoolNode *bol2 = phi->in(0)->in(1)->in(0)->in(1)->as_Bool();
@@ -751,6 +756,7 @@ static Node *remove_useless_bool(IfNode
}
Node* new_bol = (flip ? phase->transform( bol2->negate(phase) ) : bol2);
+ assert(new_bol != iff->in(1), "must make progress");
iff->set_req(1, new_bol);
// Intervening diamond probably goes dead
phase->C->set_major_progress();
|