--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java 2019-03-12 08:10:02.855750002 +0100 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java 2019-03-12 08:10:02.491747644 +0100 @@ -26,7 +26,6 @@ import org.graalvm.compiler.nodes.FrameState; import org.graalvm.compiler.nodes.LoopExitNode; -import org.graalvm.compiler.nodes.ProxyNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.phases.Phase; @@ -36,15 +35,14 @@ @Override protected void run(StructuredGraph graph) { for (LoopExitNode exit : graph.getNodes(LoopExitNode.TYPE)) { - for (ProxyNode vpn : exit.proxies().snapshot()) { - vpn.replaceAtUsagesAndDelete(vpn.value()); - } - FrameState stateAfter = exit.stateAfter(); - if (stateAfter != null) { + exit.removeProxies(); + FrameState frameState = exit.stateAfter(); + if (frameState != null && frameState.isExceptionHandlingBCI()) { + // The parser will create loop exits with such BCIs on the exception handling path. + // Loop optimizations must avoid duplicating such exits + // We clean them up here otherwise they could survive until code generation exit.setStateAfter(null); - if (stateAfter.hasNoUsages()) { - GraphUtil.killWithUnusedFloatingInputs(stateAfter); - } + GraphUtil.tryKillUnused(frameState); } } graph.setHasValueProxies(false);