changeset 22995:0b79cf15676d

Make more precise which nodes are considered part of a loop in later compilation stages.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 17 Nov 2015 00:07:42 +0100
parents dd3f7ad81b73
children 1fb858f97559
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/MemoryScheduleVerification.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java
diffstat 3 files changed, 28 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- 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<Block> {
     /**
@@ -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);
+                                }
                             }
                         }
                     }
--- 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<FloatingReadNode> cloneState(Set<FloatingReadNode> oldState) {
         Set<FloatingReadNode> result = CollectionsFactory.newSet();
-        result.addAll(oldState);
+        if (oldState != null) {
+            result.addAll(oldState);
+        }
         return result;
     }
 
--- 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;