src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java
changeset 51436 091c0d22e735
parent 50858 2d3e99a72541
child 52578 7dd81e82d083
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java	Fri Aug 17 11:56:59 2018 -0500
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java	Fri Aug 17 13:20:53 2018 -0700
@@ -826,7 +826,21 @@
         if (this.graph().hasValueProxies()) {
             if (trueSuccessor instanceof LoopExitNode && falseSuccessor instanceof LoopExitNode) {
                 assert ((LoopExitNode) trueSuccessor).loopBegin() == ((LoopExitNode) falseSuccessor).loopBegin();
-                assert trueSuccessor.usages().isEmpty() && falseSuccessor.usages().isEmpty();
+                /*
+                 * we can collapse all proxy nodes on one loop exit, the surviving one, which will
+                 * be the true successor
+                 */
+                if (falseSuccessor.anchored().isEmpty() && falseSuccessor.usages().isNotEmpty()) {
+                    for (Node n : falseSuccessor.usages().snapshot()) {
+                        assert n instanceof ProxyNode;
+                        ((ProxyNode) n).setProxyPoint((LoopExitNode) trueSuccessor);
+                    }
+                }
+                /*
+                 * The true successor (surviving loop exit) can have usages, namely proxy nodes, the
+                 * false successor however, must not have usages any more after the code above
+                 */
+                assert trueSuccessor.anchored().isEmpty() && falseSuccessor.usages().isEmpty();
                 return this.graph().addOrUnique(new ValueProxyNode(replacement, (LoopExitNode) trueSuccessor));
             }
         }