src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java
changeset 54084 84f10bbf993f
parent 52910 583fd71c47d6
child 58299 6df94ce3ab2f
--- 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);