diff -r 4748b3308cda -r 435c7b4577cd src/share/vm/opto/compile.cpp --- a/src/share/vm/opto/compile.cpp Mon Oct 21 17:34:27 2013 -0700 +++ b/src/share/vm/opto/compile.cpp Mon Oct 21 15:31:16 2013 +0200 @@ -3006,10 +3006,15 @@ if (result != NULL) { for (DUIterator_Fast jmax, j = result->fast_outs(jmax); j < jmax; j++) { Node* out = result->fast_out(j); - if (out->in(0) == NULL) { - out->set_req(0, non_throwing); - } else if (out->in(0) == ctrl) { - out->set_req(0, non_throwing); + // Phi nodes shouldn't be moved. They would only match below if they + // had the same control as the MathExactNode. The only time that + // would happen is if the Phi is also an input to the MathExact + if (!out->is_Phi()) { + if (out->in(0) == NULL) { + out->set_req(0, non_throwing); + } else if (out->in(0) == ctrl) { + out->set_req(0, non_throwing); + } } } }