# HG changeset patch # User Thomas Wuerthinger # Date 1447715262 -3600 # Node ID 0b79cf15676d226730d7d513b951e538301ab40b # Parent dd3f7ad81b73e9b6c4f8a6229414792c5d36b71f Make more precise which nodes are considered part of a loop in later compilation stages. diff -r dd3f7ad81b73 -r 0b79cf15676d graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Fri Nov 13 14:12:43 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue Nov 17 00:07:42 2015 +0100 @@ -48,6 +48,7 @@ import com.oracle.graal.nodes.ProxyNode; import com.oracle.graal.nodes.StartNode; import com.oracle.graal.nodes.StructuredGraph; +import com.oracle.graal.nodes.StructuredGraph.GuardsStage; public class ControlFlowGraph implements AbstractControlFlowGraph { /** @@ -287,23 +288,27 @@ computeLoopBlocks(endBlock, loop); } - for (LoopExitNode exit : loopBegin.loopExits()) { - Block exitBlock = nodeToBlock.get(exit); - assert exitBlock.getPredecessorCount() == 1; - computeLoopBlocks(exitBlock.getFirstPredecessor(), loop); - loop.getExits().add(exitBlock); + if (graph.getGuardsStage() != GuardsStage.AFTER_FSA) { + for (LoopExitNode exit : loopBegin.loopExits()) { + Block exitBlock = nodeToBlock.get(exit); + assert exitBlock.getPredecessorCount() == 1; + computeLoopBlocks(exitBlock.getFirstPredecessor(), loop); + loop.getExits().add(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) { - AbstractBeginNode begin = sux.getBeginNode(); - if (!(begin instanceof LoopExitNode && ((LoopExitNode) begin).loopBegin() == loopBegin)) { - Debug.log(3, "Unexpected loop exit with %s, including whole branch in the loop", sux); - addBranchToLoop(loop, sux); + if (graph.hasValueProxies()) { + // 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) { + AbstractBeginNode begin = sux.getBeginNode(); + if (!(begin instanceof LoopExitNode && ((LoopExitNode) begin).loopBegin() == loopBegin)) { + Debug.log(3, "Unexpected loop exit with %s, including whole branch in the loop", sux); + addBranchToLoop(loop, sux); + } } } } diff -r dd3f7ad81b73 -r 0b79cf15676d graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/MemoryScheduleVerification.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/MemoryScheduleVerification.java Fri Nov 13 14:12:43 2015 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/MemoryScheduleVerification.java Tue Nov 17 00:07:42 2015 +0100 @@ -140,7 +140,9 @@ @Override protected Set cloneState(Set oldState) { Set result = CollectionsFactory.newSet(); - result.addAll(oldState); + if (oldState != null) { + result.addAll(oldState); + } return result; } diff -r dd3f7ad81b73 -r 0b79cf15676d graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Fri Nov 13 14:12:43 2015 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Nov 17 00:07:42 2015 +0100 @@ -49,6 +49,7 @@ import com.oracle.graal.nodes.AbstractMergeNode; import com.oracle.graal.nodes.ControlSinkNode; import com.oracle.graal.nodes.ControlSplitNode; +import com.oracle.graal.nodes.DeoptimizeNode; import com.oracle.graal.nodes.FixedNode; import com.oracle.graal.nodes.FrameState; import com.oracle.graal.nodes.GuardNode; @@ -275,6 +276,10 @@ for (Node n : nodes) { assert n.isAlive(); assert nodeMap.get(n) == b; + StructuredGraph g = (StructuredGraph) n.graph(); + if (g.hasLoops() && g.getGuardsStage().areDeoptsFixed() && n instanceof DeoptimizeNode) { + assert b.getLoopDepth() == 0 : n; + } } } return true;