src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java
--- 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));
}
}