< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java

Print this page

        

@@ -24,29 +24,27 @@
 
 package org.graalvm.compiler.phases.common;
 
 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;
 
 public class RemoveValueProxyPhase extends Phase {
 
     @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);
     }
 }
< prev index next >