changeset 21416:b148be759cf6

ControlFlowGraph.computeLoopBlocks removed recursion; simulating stack
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 19 May 2015 09:53:34 +0200
parents c435184ca071
children 05b26a1cf85f
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java
diffstat 1 files changed, 44 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Tue May 19 09:51:55 2015 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Tue May 19 09:53:34 2015 +0200
@@ -305,20 +305,53 @@
         }
     }
 
-    private static void computeLoopBlocks(Block block, Loop<Block> loop) {
-        if (block.getLoop() == loop) {
-            return;
-        }
-        assert block.loop == loop.getParent();
-        block.loop = loop;
+    private static void computeLoopBlocks(Block ablock, Loop<Block> aloop) {
+        final int process = 0;
+        final int stepOut = 1;
+        class Frame {
+            final Iterator<Block> blocks;
+            final Loop<Block> loop;
+            final Frame parent;
 
-        assert !loop.getBlocks().contains(block);
-        loop.getBlocks().add(block);
+            public Frame(Iterator<Block> blocks, Loop<Block> loop, Frame parent) {
+                super();
+                this.blocks = blocks;
+                this.loop = loop;
+                this.parent = parent;
+            }
+        }
+        int state = process;
+        Frame c = new Frame(Arrays.asList(ablock).iterator(), aloop, null);
+        while (c != null) {
+            int nextState = state;
+            if (state == process) {
+                Loop<Block> loop = c.loop;
+                Block block = c.blocks.next();
+                if (block.getLoop() == loop) {
+                    nextState = stepOut;
+                } else {
+                    assert block.loop == loop.getParent();
+                    block.loop = c.loop;
 
-        if (block != loop.getHeader()) {
-            for (Block pred : block.getPredecessors()) {
-                computeLoopBlocks(pred, loop);
+                    assert !c.loop.getBlocks().contains(block);
+                    c.loop.getBlocks().add(block);
+
+                    if (block != c.loop.getHeader()) {
+                        c = new Frame(block.getPredecessors().iterator(), loop, c);
+                    } else {
+                        nextState = stepOut;
+                    }
+                }
+            } else if (state == stepOut) {
+                if (c.blocks.hasNext()) {
+                    nextState = process;
+                } else {
+                    c = c.parent;
+                }
+            } else {
+                GraalInternalError.shouldNotReachHere();
             }
+            state = nextState;
         }
     }