Mercurial > hg > graal-compiler
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; } }