src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java Tue Mar 12 12:12:01 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java Tue Mar 12 19:17:42 2019 +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);