Mercurial > hg > graal-compiler
changeset 23311:2cc28cd4b483
GraphPE: refactoring of loop detection
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Thu, 14 Jan 2016 15:18:33 -0800 |
parents | ca8c504c32f7 |
children | ddd530cc44c9 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java |
diffstat | 1 files changed, 42 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java Thu Jan 14 15:06:16 2016 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java Thu Jan 14 15:18:33 2016 -0800 @@ -378,7 +378,7 @@ } if (methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE) { - detectLoops(methodScope, methodScope.graph, startNode); + detectLoops(methodScope, startNode); } } @@ -1118,14 +1118,19 @@ return methodScope.encodedGraph.getObjects()[methodScope.reader.getUVInt()]; } - /* - * The following methods are a literal copy from GraphBuilderPhase. - */ + protected void detectLoops(MethodScope methodScope, FixedNode startInstruction) { + Debug.dump(1, methodScope.graph, "Before detectLoops"); + Set<LoopBeginNode> newLoopBegins = insertLoopBegins(methodScope, startInstruction); + + Debug.dump(1, methodScope.graph, "Before insertLoopExits"); - protected void detectLoops(MethodScope methodScope, StructuredGraph currentGraph, FixedNode startInstruction) { - Debug.dump(currentGraph, "Before detectLoops"); - NodeBitMap visited = currentGraph.createNodeBitMap(); - NodeBitMap active = currentGraph.createNodeBitMap(); + insertLoopExits(methodScope, startInstruction, newLoopBegins); + Debug.dump(1, methodScope.graph, "After detectLoops"); + } + + private static Set<LoopBeginNode> insertLoopBegins(MethodScope methodScope, FixedNode startInstruction) { + NodeBitMap visited = methodScope.graph.createNodeBitMap(); + NodeBitMap active = methodScope.graph.createNodeBitMap(); Deque<Node> stack = new ArrayDeque<>(); stack.add(startInstruction); visited.mark(startInstruction); @@ -1143,25 +1148,7 @@ for (Node n : next.cfgSuccessors()) { if (active.contains(n)) { // Detected cycle. - assert n instanceof MergeNode; - assert next instanceof EndNode; - MergeNode merge = (MergeNode) n; - assert methodScope.loopExplosionMerges.contains(merge) : merge; - EndNode endNode = (EndNode) next; - merge.removeEnd(endNode); - FixedNode afterMerge = merge.next(); - if (!(afterMerge instanceof EndNode) || !(((EndNode) afterMerge).merge() instanceof LoopBeginNode)) { - FrameState stateAfter = merge.stateAfter(); - merge.setNext(null); - merge.setStateAfter(null); - LoopBeginNode newLoopBegin = appendLoopBegin(currentGraph, merge); - newLoopBegin.setNext(afterMerge); - newLoopBegin.setStateAfter(stateAfter); - newLoopBegins.add(newLoopBegin); - } - LoopBeginNode loopBegin = (LoopBeginNode) ((EndNode) merge.next()).merge(); - LoopEndNode loopEnd = currentGraph.add(new LoopEndNode(loopBegin)); - endNode.replaceAndDelete(loopEnd); + insertLoopBegins(methodScope, (MergeNode) n, (EndNode) next, newLoopBegins); } else if (visited.contains(n)) { // Normal merge into a branch we are already exploring. } else { @@ -1171,23 +1158,34 @@ } } } - - Debug.dump(currentGraph, "Before insertLoopEnds"); - insertLoopEnds(methodScope, currentGraph, startInstruction, newLoopBegins); - Debug.dump(currentGraph, "After detectLoops"); + return newLoopBegins; } - private static LoopBeginNode appendLoopBegin(StructuredGraph currentGraph, FixedWithNextNode fixedWithNext) { - EndNode preLoopEnd = currentGraph.add(new EndNode()); - LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode()); - fixedWithNext.setNext(preLoopEnd); - // Add the single non-loop predecessor of the loop header. - loopBegin.addForwardEnd(preLoopEnd); - return loopBegin; + private static void insertLoopBegins(MethodScope methodScope, MergeNode merge, EndNode endNode, Set<LoopBeginNode> newLoopBegins) { + assert methodScope.loopExplosionMerges.contains(merge) : merge; + + merge.removeEnd(endNode); + FixedNode afterMerge = merge.next(); + if (!(afterMerge instanceof EndNode) || !(((EndNode) afterMerge).merge() instanceof LoopBeginNode)) { + FrameState stateAfter = merge.stateAfter(); + merge.setNext(null); + merge.setStateAfter(null); + EndNode preLoopEnd = methodScope.graph.add(new EndNode()); + LoopBeginNode newLoopBegin = methodScope.graph.add(new LoopBeginNode()); + merge.setNext(preLoopEnd); + // Add the single non-loop predecessor of the loop header. + newLoopBegin.addForwardEnd(preLoopEnd); + newLoopBegin.setNext(afterMerge); + newLoopBegin.setStateAfter(stateAfter); + newLoopBegins.add(newLoopBegin); + } + LoopBeginNode loopBegin = (LoopBeginNode) ((EndNode) merge.next()).merge(); + LoopEndNode loopEnd = methodScope.graph.add(new LoopEndNode(loopBegin)); + endNode.replaceAndDelete(loopEnd); } - private static void insertLoopEnds(MethodScope methodScope, StructuredGraph currentGraph, FixedNode startInstruction, Set<LoopBeginNode> newLoopBegins) { - NodeBitMap visited = currentGraph.createNodeBitMap(); + private static void insertLoopExits(MethodScope methodScope, FixedNode startInstruction, Set<LoopBeginNode> newLoopBegins) { + NodeBitMap visited = methodScope.graph.createNodeBitMap(); Deque<Node> stack = new ArrayDeque<>(); stack.add(startInstruction); visited.mark(startInstruction); @@ -1210,12 +1208,12 @@ for (int i = loopBegins.size() - 1; i >= 0; --i) { LoopBeginNode loopBegin = loopBegins.get(i); - insertLoopExits(methodScope, currentGraph, loopBegin); + insertLoopExits(methodScope, loopBegin); } } - private static void insertLoopExits(MethodScope methodScope, StructuredGraph currentGraph, LoopBeginNode loopBegin) { - NodeBitMap visited = currentGraph.createNodeBitMap(); + private static void insertLoopExits(MethodScope methodScope, LoopBeginNode loopBegin) { + NodeBitMap visited = methodScope.graph.createNodeBitMap(); Deque<Node> stack = new ArrayDeque<>(); for (LoopEndNode loopEnd : loopBegin.loopEnds()) { stack.push(loopEnd); @@ -1305,7 +1303,7 @@ */ JVMCIError.guarantee(merge.cfgPredecessors().count() == 1, merge.toString()); - LoopExitNode loopExit = currentGraph.add(new LoopExitNode(loopBegin)); + LoopExitNode loopExit = methodScope.graph.add(new LoopExitNode(loopBegin)); next.replaceAtPredecessor(loopExit); loopExit.setNext(next); assignLoopExitState(methodScope, loopExit, merge);