src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java	Fri Jul  7 09:31:13 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java	Fri Jul  7 09:31:13 2017

*** 20,42 **** --- 20,43 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.loop; import java.util.Collections; import org.graalvm.compiler.core.common.cfg.Loop; + import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.graph.Graph; import org.graalvm.compiler.graph.Graph.DuplicationReplacement; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeBitMap; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.FixedNode; import org.graalvm.compiler.nodes.LoopBeginNode; ! import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage; ! import org.graalvm.compiler.nodes.LoopExitNode; + import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.cfg.Block; + import org.graalvm.util.EconomicSet; public class LoopFragmentWhole extends LoopFragment { public LoopFragmentWhole(LoopEx loop) { super(loop);
*** 63,78 **** --- 64,75 ---- @Override public NodeBitMap nodes() { if (nodes == null) { Loop<Block> loop = loop().loop(); if (loop.getHeader().getBeginNode().graph().getGuardsStage() == GuardsStage.AFTER_FSA) { nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), Collections.emptyList()); } else { nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), LoopFragment.toHirExits(loop.getExits())); } } return nodes; } @Override protected ValueNode prim(ValueNode b) {
*** 111,120 **** --- 108,155 ---- @Override protected void finishDuplication() { // TODO (gd) ? } + void cleanupLoopExits() { + LoopBeginNode loopBegin = original().loop().loopBegin(); + assert nodes == null || nodes.contains(loopBegin); + StructuredGraph graph = loopBegin.graph(); + if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + // After FrameStateAssignment ControlFlowGraph treats loop exits differently which means + // that the LoopExitNodes can be in a block which post dominates the true loop exit. For + // cloning to work right they must agree. + EconomicSet<LoopExitNode> exits = EconomicSet.create(); + for (Block exitBlock : original().loop().loop().getExits()) { + LoopExitNode exitNode = exitBlock.getLoopExit(); + if (exitNode == null) { + exitNode = graph.add(new LoopExitNode(loopBegin)); + graph.addAfterFixed(exitBlock.getBeginNode(), exitNode); + if (nodes != null) { + nodes.mark(exitNode); + } + graph.getDebug().dump(DebugContext.VERBOSE_LEVEL, graph, "Adjusting loop exit node for %s", loopBegin); + } + exits.add(exitNode); + } + for (LoopExitNode exitNode : loopBegin.loopExits()) { + if (!exits.contains(exitNode)) { + if (nodes != null) { + nodes.clear(exitNode); + } + graph.removeFixed(exitNode); + } + } + } + + } + + @Override + protected void beforeDuplication() { + cleanupLoopExits(); + } + @Override public void insertBefore(LoopEx loop) { // TODO Auto-generated method stub }

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File