# HG changeset patch # User Stefan Anzinger # Date 1428675766 -7200 # Node ID 2402d55347732f9185334d1f650a8108399e5332 # Parent dc41766b35e11348281b76fd70b456b6ba3cf7e9 Simulate recursion on AbstractControlFlowGraph.calcoDominatorRanges as the recursive version exceeds stack size on SPARC diff -r dc41766b35e1 -r 2402d5534773 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Fri Apr 10 13:10:56 2015 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Fri Apr 10 16:22:46 2015 +0200 @@ -66,17 +66,39 @@ } dominator.getDominated().add(block); } - calcDominatorRanges(cfg.getStartBlock(), 0); + calcDominatorRanges(cfg.getStartBlock()); } - static > int calcDominatorRanges(T block, int next) { - int myNumber = next; - int maxNumber = myNumber; - for (T dominated : block.getDominated()) { - maxNumber = calcDominatorRanges(dominated, maxNumber + 1); + static > void calcDominatorRanges(T block) { + final class Frame { + int myNumber; + int maxNumber; + T block; + Iterator dominated; + Frame parent; + + public Frame(int myNumber, T block, Iterator dominated, Frame parent) { + super(); + this.myNumber = myNumber; + this.maxNumber = myNumber; + this.block = block; + this.dominated = dominated; + this.parent = parent; + } } - block.setDominatorNumbers(myNumber, maxNumber); - return maxNumber; + Frame f = new Frame<>(0, block, block.getDominated().iterator(), null); + while (f != null) { + if (!f.dominated.hasNext()) { // Retreat + f.block.setDominatorNumbers(f.myNumber, f.maxNumber); + if (f.parent != null) + f.parent.maxNumber = f.maxNumber; + f = f.parent; + } else { + T d = f.dominated.next(); + List dd = d.getDominated(); + f = new Frame<>(f.maxNumber + 1, d, dd.iterator(), f); + } + } } /**