src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.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.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java	Fri Jul  7 09:31:25 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java	Fri Jul  7 09:31:25 2017

*** 28,38 **** --- 28,38 ---- import java.util.List; import org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph; import org.graalvm.compiler.core.common.cfg.CFGVerifier; import org.graalvm.compiler.core.common.cfg.Loop; ! import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeMap; import org.graalvm.compiler.nodes.AbstractBeginNode; import org.graalvm.compiler.nodes.AbstractEndNode;
*** 592,602 **** --- 592,602 ---- for (Block block : reversePostOrder) { AbstractBeginNode beginNode = block.getBeginNode(); if (beginNode instanceof LoopBeginNode) { Loop<Block> loop = new HIRLoop(block.getLoop(), loops.size(), block); loops.add(loop); ! block.loop = loop; ! block.setLoop(loop); loop.getBlocks().add(block); LoopBeginNode loopBegin = (LoopBeginNode) beginNode; for (LoopEndNode end : loopBegin.loopEnds()) { Block endBlock = nodeToBlock.get(end);
*** 606,628 **** --- 606,628 ---- if (graph.getGuardsStage() != GuardsStage.AFTER_FSA) { for (LoopExitNode exit : loopBegin.loopExits()) { Block exitBlock = nodeToBlock.get(exit); assert exitBlock.getPredecessorCount() == 1; computeLoopBlocks(exitBlock.getFirstPredecessor(), loop, stack, true); ! loop.getExits().add(exitBlock); ! loop.addExit(exitBlock); } // The following loop can add new blocks to the end of the loop's block // list. int size = loop.getBlocks().size(); for (int i = 0; i < size; ++i) { Block b = loop.getBlocks().get(i); for (Block sux : b.getSuccessors()) { ! if (sux.loop != loop) { ! if (sux.getLoop() != loop) { AbstractBeginNode begin = sux.getBeginNode(); if (!(begin instanceof LoopExitNode && ((LoopExitNode) begin).loopBegin() == loopBegin)) { ! Debug.log(Debug.VERBOSE_LEVEL, "Unexpected loop exit with %s, including whole branch in the loop", sux); ! graph.getDebug().log(DebugContext.VERBOSE_LEVEL, "Unexpected loop exit with %s, including whole branch in the loop", sux); computeLoopBlocks(sux, loop, stack, false); } } } }
*** 643,653 **** --- 643,653 ---- // and the succ loop is not a child loop of the curr one if (succ.getLoop() == null) { // we might exit multiple loops if b.loops is not a loop at depth 0 Loop<Block> curr = b.getLoop(); while (curr != null) { ! curr.getExits().add(succ); ! curr.addExit(succ); curr = curr.getParent(); } } else { /* * succ also has a loop, might be a child loop
*** 665,675 **** --- 665,675 ---- assert succ.getLoop().getDepth() < b.getLoop().getDepth(); // b.loop must not be a transitive parent of succ.loop assert !Loop.transitiveParentLoop(succ.getLoop(), b.getLoop()); Loop<Block> curr = b.getLoop(); while (curr != null && curr != succ.getLoop()) { ! curr.getExits().add(succ); ! curr.addExit(succ); curr = curr.getParent(); } } } }
*** 679,701 **** --- 679,701 ---- } } private static void computeLoopBlocks(Block start, Loop<Block> loop, Block[] stack, boolean usePred) { ! if (start.loop != loop) { ! start.loop = loop; ! if (start.getLoop() != loop) { ! start.setLoop(loop); stack[0] = start; loop.getBlocks().add(start); int tos = 0; do { Block block = stack[tos--]; // Add predecessors or successors to the loop. for (Block b : (usePred ? block.getPredecessors() : block.getSuccessors())) { ! if (b.loop != loop) { ! if (b.getLoop() != loop) { stack[++tos] = b; ! b.loop = loop; ! b.setLoop(loop); loop.getBlocks().add(b); } } } while (tos >= 0); }

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