--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java 2017-07-07 09:31:13.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java 2017-07-07 09:31:12.000000000 -0700 @@ -50,8 +50,8 @@ import org.graalvm.compiler.nodes.VirtualState.NodeClosure; import org.graalvm.compiler.nodes.memory.MemoryPhiNode; import org.graalvm.compiler.nodes.util.GraphUtil; -import org.graalvm.util.Equivalence; import org.graalvm.util.EconomicMap; +import org.graalvm.util.Equivalence; public class LoopFragmentInside extends LoopFragment { @@ -74,6 +74,17 @@ } }; + private final DuplicationReplacement dataFixWithinAfter = new DuplicationReplacement() { + + @Override + public Node replacement(Node oriInput) { + if (!(oriInput instanceof ValueNode)) { + return oriInput; + } + return primAfter((ValueNode) oriInput); + } + }; + public LoopFragmentInside(LoopEx loop) { super(loop); } @@ -121,6 +132,12 @@ end.setNext(loop.entryPoint()); } + public void insertWithinAfter(LoopEx loop) { + assert this.isDuplicate() && this.original().loop() == loop; + + patchNodes(dataFixWithinAfter); + } + @Override public NodeBitMap nodes() { if (nodes == null) { @@ -205,6 +222,11 @@ // TODO (gd) ? } + @Override + protected void beforeDuplication() { + // Nothing to do + } + private static PhiNode patchPhi(StructuredGraph graph, PhiNode phi, AbstractMergeNode merge) { PhiNode ret; if (phi instanceof ValuePhiNode) { @@ -337,6 +359,24 @@ } } + protected ValueNode primAfter(ValueNode b) { + assert isDuplicate(); + LoopBeginNode loopBegin = original().loop().loopBegin(); + if (loopBegin.isPhiAtMerge(b)) { + PhiNode phi = (PhiNode) b; + assert phi.valueCount() == 2; + return phi.valueAt(1); + } else if (nodesReady) { + ValueNode v = getDuplicatedNode(b); + if (v == null) { + return b; + } + return v; + } else { + return b; + } + } + private AbstractBeginNode mergeEnds() { assert isDuplicate(); List endsToMerge = new LinkedList<>();