# HG changeset patch # User Josef Eisl # Date 1397056308 -7200 # Node ID 1bf700e19e84d3fcd4815988b96127e1ec3c4fbd # Parent 6876a4599b7e6fcff41a222d7c39fb47d19ac19f Make Loop generic. diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java --- a/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java Wed Apr 09 17:11:48 2014 +0200 @@ -34,12 +34,12 @@ * with the most likely path that was left out during this process. The process iteratively * continues until all blocks are scheduled. Additionally, it is guaranteed that all blocks of a * loop are scheduled before any block following the loop is scheduled. - * + * * The machine code generator order includes reordering of loop headers such that the backward jump * is a conditional jump if there is only one loop end block. Additionally, the target of loop * backward jumps are always marked as aligned. Aligning the target of conditional jumps does not * bring a measurable benefit and is therefore avoided to keep the code size small. - * + * * The linear scan register allocator order has an additional mechanism that prevents merge nodes * from being scheduled if there is at least one highly likely predecessor still unscheduled. This * increases the probability that the merge node and the corresponding predecessor are more closely @@ -63,7 +63,7 @@ /** * Computes the block order used for the linear scan register allocator. - * + * * @return sorted list of blocks */ public static > List computeLinearScanOrder(int blockCount, T startBlock, BlocksToDoubles blockProbabilities) { @@ -77,7 +77,7 @@ /** * Computes the block order used for code emission. - * + * * @return sorted list of blocks */ public static > List computeCodeEmittingOrder(int blockCount, T startBlock, BlocksToDoubles blockProbabilities) { @@ -151,7 +151,6 @@ /** * Add a linear path to the code emission order greedily following the most likely successor. */ - @SuppressWarnings("unchecked") private static > void addPathToCodeEmittingOrder(T initialBlock, List order, PriorityQueue worklist, BitSet visitedBlocks, BlocksToDoubles blockProbabilities) { T block = initialBlock; while (block != null) { @@ -166,17 +165,17 @@ addBlock(block, order); } - Loop loop = block.getLoop(); + Loop loop = block.getLoop(); if (block.isLoopEnd() && skipLoopHeader(loop.header)) { // This is the only loop end of a skipped loop header. // Add the header immediately afterwards. - addBlock((T) loop.header, order); + addBlock(loop.header, order); // Make sure the loop successors of the loop header are aligned // as they are the target // of the backward jump. - for (Block successor : loop.header.getSuccessors()) { + for (T successor : loop.header.getSuccessors()) { if (successor.getLoopDepth() == block.getLoopDepth()) { successor.setAlign(true); } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Wed Apr 09 17:11:48 2014 +0200 @@ -121,7 +121,7 @@ // add loops ? how do we add looks when we haven't parsed the bytecode? // create the control flow graph - LIRControlFlowGraph cfg = new LIRControlFlowGraph(blockMap.blocks.toArray(new BciBlock[0]), new Loop[0]); + LIRControlFlowGraph cfg = new LIRControlFlowGraph(blockMap.blocks.toArray(new BciBlock[0]), new ArrayList>()); BlocksToDoubles blockProbabilities = new BlocksToDoubles(blockMap.blocks.size()); for (BciBlock b : blockMap.blocks) { diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRBlock.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRBlock.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRBlock.java Wed Apr 09 17:11:48 2014 +0200 @@ -34,7 +34,7 @@ successors = Collections.emptyList(); } - public Loop getLoop() { + public Loop getLoop() { // TODO Auto-generated method stub return null; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRControlFlowGraph.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRControlFlowGraph.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRControlFlowGraph.java Wed Apr 09 17:11:48 2014 +0200 @@ -22,15 +22,17 @@ */ package com.oracle.graal.baseline; +import java.util.*; + import com.oracle.graal.java.BciBlockMapping.BciBlock; import com.oracle.graal.nodes.cfg.*; public class LIRControlFlowGraph implements AbstractControlFlowGraph { private BciBlock[] blocks; - private Loop[] loops; + private List> loops; - public LIRControlFlowGraph(BciBlock[] blocks, Loop[] loops) { + public LIRControlFlowGraph(BciBlock[] blocks, List> loops) { this.blocks = blocks; this.loops = loops; } @@ -39,7 +41,7 @@ return blocks; } - public Loop[] getLoops() { + public Collection> getLoops() { return loops; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/NestedLoopTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/NestedLoopTest.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/NestedLoopTest.java Wed Apr 09 17:11:48 2014 +0200 @@ -148,10 +148,10 @@ Debug.dump(graph, "Graph"); ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true); - Assert.assertTrue(cfg.getLoops().length == 3); - Loop rootLoop = cfg.getLoops()[0]; - Loop nestedLoop = cfg.getLoops()[1]; - Loop innerMostLoop = cfg.getLoops()[2]; + Assert.assertTrue(cfg.getLoops().size() == 3); + Loop rootLoop = cfg.getLoops().get(0); + Loop nestedLoop = cfg.getLoops().get(1); + Loop innerMostLoop = cfg.getLoops().get(2); Invoke a = getInvoke("a", graph); Invoke b = getInvoke("b", graph); Invoke c = getInvoke("c", graph); @@ -168,14 +168,14 @@ Debug.dump(graph, "Graph"); } - private static boolean contains(Loop loop, Invoke node, ControlFlowGraph cfg) { + private static boolean contains(Loop loop, Invoke node, ControlFlowGraph cfg) { Block block = cfg.blockFor((Node) node); Assert.assertNotNull(block); return loop.blocks.contains(block); } - private static boolean containsDirect(Loop loop, Invoke node, ControlFlowGraph cfg) { - for (Loop child : loop.children) { + private static boolean containsDirect(Loop loop, Invoke node, ControlFlowGraph cfg) { + for (Loop child : loop.children) { if (contains(child, node, cfg)) { return false; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Apr 09 17:11:48 2014 +0200 @@ -335,7 +335,7 @@ } int numLoops() { - return ir.getControlFlowGraph().getLoops().length; + return ir.getControlFlowGraph().getLoops().size(); } boolean isIntervalInLoop(int interval, int loop) { diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/DecompilerLoopSimplify.java --- a/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/DecompilerLoopSimplify.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/DecompilerLoopSimplify.java Wed Apr 09 17:11:48 2014 +0200 @@ -46,7 +46,7 @@ cfgBlocks.remove(0); if (firstBlock.isLoopHeader()) { DecompilerLoopBlock loopBlock = new DecompilerLoopBlock(firstBlock, decompiler, decompiler.getSchedule(), infoStream); - Loop loop = firstBlock.getLoop(); + Loop loop = firstBlock.getLoop(); for (int i = 0; i < cfgBlocks.size(); i++) { if (loop.blocks.contains(cfgBlocks.get(i)) && cfgBlocks.get(i) != firstBlock) { diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Wed Apr 09 17:11:48 2014 +0200 @@ -144,7 +144,7 @@ return sb.toString(); } - public Loop getLoop() { + public Loop getLoop() { // TODO Auto-generated method stub return null; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java Wed Apr 09 17:11:48 2014 +0200 @@ -36,19 +36,19 @@ public class LoopEx { - private final Loop lirLoop; + private final Loop lirLoop; private LoopFragmentInside inside; private LoopFragmentWhole whole; private CountedLoopInfo counted; // TODO (gd) detect private LoopsData data; private InductionVariables ivs; - LoopEx(Loop lirLoop, LoopsData data) { + LoopEx(Loop lirLoop, LoopsData data) { this.lirLoop = lirLoop; this.data = data; } - public Loop lirLoop() { + public Loop lirLoop() { return lirLoop; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentWhole.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentWhole.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentWhole.java Wed Apr 09 17:11:48 2014 +0200 @@ -56,7 +56,7 @@ @Override public NodeIterable nodes() { if (nodes == null) { - Loop lirLoop = loop().lirLoop(); + Loop lirLoop = loop().lirLoop(); nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(lirLoop.blocks), LoopFragment.toHirBlocks(lirLoop.exits)); } return nodes; diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java Wed Apr 09 17:11:48 2014 +0200 @@ -31,7 +31,7 @@ public class LoopsData { - private Map lirLoopToEx = new IdentityHashMap<>(); + private Map, LoopEx> lirLoopToEx = new IdentityHashMap<>(); private Map loopBeginToEx = new IdentityHashMap<>(); private ControlFlowGraph cfg; @@ -42,14 +42,14 @@ throw Debug.handle(e); } - for (Loop lirLoop : cfg.getLoops()) { + for (Loop lirLoop : cfg.getLoops()) { LoopEx ex = new LoopEx(lirLoop, this); lirLoopToEx.put(lirLoop, ex); loopBeginToEx.put(ex.loopBegin(), ex); } } - public LoopEx loop(Loop lirLoop) { + public LoopEx loop(Loop lirLoop) { return lirLoopToEx.get(lirLoop); } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java Wed Apr 09 17:11:48 2014 +0200 @@ -24,11 +24,11 @@ import java.util.*; -public interface AbstractBlock> { +public interface AbstractBlock> { int getId(); - Loop getLoop(); + Loop getLoop(); int getLoopDepth(); diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractControlFlowGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractControlFlowGraph.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractControlFlowGraph.java Wed Apr 09 17:11:48 2014 +0200 @@ -22,11 +22,13 @@ */ package com.oracle.graal.nodes.cfg; +import java.util.*; + public interface AbstractControlFlowGraph> { T[] getBlocks(); - Loop[] getLoops(); + Collection> getLoops(); T getStartBlock(); } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Wed Apr 09 17:11:48 2014 +0200 @@ -32,7 +32,7 @@ protected final AbstractBeginNode beginNode; protected FixedNode endNode; - protected Loop loop; + protected Loop loop; protected List dominated; protected Block postdominator; @@ -49,7 +49,7 @@ return endNode; } - public Loop getLoop() { + public Loop getLoop() { return loop; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/CFGVerifier.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/CFGVerifier.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/CFGVerifier.java Wed Apr 09 17:11:48 2014 +0200 @@ -84,13 +84,13 @@ } if (cfg.getLoops() != null) { - for (Loop loop : cfg.getLoops()) { + for (Loop loop : cfg.getLoops()) { assert loop.header.isLoopHeader(); for (Block block : loop.blocks) { assert block.getId() >= loop.header.getId(); - Loop blockLoop = block.getLoop(); + Loop blockLoop = block.getLoop(); while (blockLoop != loop) { assert blockLoop != null; blockLoop = blockLoop.parent; @@ -109,7 +109,7 @@ for (Block block : loop.exits) { assert block.getId() >= loop.header.getId(); - Loop blockLoop = block.getLoop(); + Loop blockLoop = block.getLoop(); while (blockLoop != null) { blockLoop = blockLoop.parent; assert blockLoop != loop; diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Wed Apr 09 17:11:48 2014 +0200 @@ -34,7 +34,7 @@ private final NodeMap nodeToBlock; private Block[] reversePostOrder; - private Loop[] loops; + private List> loops; public static ControlFlowGraph compute(StructuredGraph graph, boolean connectBlocks, boolean computeLoops, boolean computeDominators, boolean computePostdominators) { ControlFlowGraph cfg = new ControlFlowGraph(graph); @@ -106,7 +106,7 @@ return nodeToBlock.get(node); } - public Loop[] getLoops() { + public List> getLoops() { return loops; } @@ -233,12 +233,12 @@ } private void computeLoopInformation() { - ArrayList loopsList = new ArrayList<>(); + loops = new ArrayList<>(); for (Block block : reversePostOrder) { Node beginNode = block.getBeginNode(); if (beginNode instanceof LoopBeginNode) { - Loop loop = new Loop(block.getLoop(), loopsList.size(), block); - loopsList.add(loop); + Loop loop = new Loop<>(block.getLoop(), loops.size(), block); + loops.add(loop); LoopBeginNode loopBegin = (LoopBeginNode) beginNode; for (LoopEndNode end : loopBegin.loopEnds()) { @@ -269,10 +269,9 @@ } } } - loops = loopsList.toArray(new Loop[loopsList.size()]); } - private static void addBranchToLoop(Loop l, Block b) { + private static void addBranchToLoop(Loop l, Block b) { if (l.blocks.contains(b)) { return; } @@ -283,7 +282,7 @@ } } - private static void computeLoopBlocks(Block block, Loop loop) { + private static void computeLoopBlocks(Block block, Loop loop) { if (block.getLoop() == loop) { return; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Loop.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Loop.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Loop.java Wed Apr 09 17:11:48 2014 +0200 @@ -26,18 +26,18 @@ import com.oracle.graal.nodes.*; -public class Loop { +public class Loop> { - public final Loop parent; - public final List children; + public final Loop parent; + public final List> children; public final int depth; public final int index; - public final Block header; - public final List blocks; - public final List exits; + public final T header; + public final List blocks; + public final List exits; - protected Loop(Loop parent, int index, Block header) { + protected Loop(Loop parent, int index, T header) { this.parent = parent; if (parent != null) { this.depth = parent.depth + 1; @@ -58,6 +58,6 @@ } public LoopBeginNode loopBegin() { - return (LoopBeginNode) header.getBeginNode(); + return (LoopBeginNode) ((Block) header).getBeginNode(); } } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Wed Apr 09 17:11:48 2014 +0200 @@ -92,7 +92,7 @@ private static void exitLoops(AbstractDeoptimizeNode deopt, EndNode end, ControlFlowGraph cfg) { Block block = cfg.blockFor(deopt); - Loop loop = block.getLoop(); + Loop loop = block.getLoop(); while (loop != null) { end.graph().addBeforeFixed(end, end.graph().add(new LoopExitNode(loop.loopBegin()))); loop = loop.parent; diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Wed Apr 09 17:11:48 2014 +0200 @@ -174,7 +174,7 @@ } private void insertLoopExits(DeoptimizeNode deopt) { - Loop loop = block.getLoop(); + Loop loop = block.getLoop(); StructuredGraph graph = deopt.graph(); while (loop != null) { LoopExitNode exit = graph.add(new LoopExitNode(loop.loopBegin())); diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ProfileCompiledMethodsPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ProfileCompiledMethodsPhase.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ProfileCompiledMethodsPhase.java Wed Apr 09 17:11:48 2014 +0200 @@ -43,11 +43,11 @@ * for each node would be too costly, so this phase takes the compromise that it trusts split * probabilities, but not loop frequencies. This means that it will insert counters at the start of * a method and at each loop header. - * + * * A schedule is created so that floating nodes can also be taken into account. The weight of a node * is determined heuristically in the * {@link ProfileCompiledMethodsPhase#getNodeWeight(ScheduledNode)} method. - * + * * Additionally, there's a second counter that's only increased for code sections without invokes. */ public class ProfileCompiledMethodsPhase extends Phase { @@ -65,18 +65,18 @@ schedule.apply(graph, false); ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true); - for (Loop loop : cfg.getLoops()) { + for (Loop loop : cfg.getLoops()) { double loopProbability = probabilities.get(loop.loopBegin()); if (loopProbability > (1D / Integer.MAX_VALUE)) { addSectionCounters(loop.loopBegin(), loop.blocks, loop.children, schedule, probabilities); } } - addSectionCounters(graph.start(), Arrays.asList(cfg.getBlocks()), Arrays.asList(cfg.getLoops()), schedule, probabilities); + addSectionCounters(graph.start(), Arrays.asList(cfg.getBlocks()), cfg.getLoops(), schedule, probabilities); } - private static void addSectionCounters(FixedWithNextNode start, Collection sectionBlocks, Collection childLoops, SchedulePhase schedule, NodesToDoubles probabilities) { + private static void addSectionCounters(FixedWithNextNode start, Collection sectionBlocks, Collection> childLoops, SchedulePhase schedule, NodesToDoubles probabilities) { HashSet blocks = new HashSet<>(sectionBlocks); - for (Loop loop : childLoops) { + for (Loop loop : childLoops) { blocks.removeAll(loop.blocks); } double weight = getSectionWeight(schedule, probabilities, blocks) / probabilities.get(start); diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java Wed Apr 09 17:11:48 2014 +0200 @@ -105,21 +105,21 @@ private Scope[] computeScopes() { ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false); - Loop[] loops = cfg.getLoops(); - HashMap processedScopes = new HashMap<>(); - Scope[] result = new Scope[loops.length + 1]; + List> loops = cfg.getLoops(); + HashMap, Scope> processedScopes = new HashMap<>(); + Scope[] result = new Scope[loops.size() + 1]; Scope methodScope = new Scope(graph.start(), null); processedScopes.put(null, methodScope); result[0] = methodScope; - for (int i = 0; i < loops.length; i++) { - result[i + 1] = createScope(loops[i], processedScopes); + for (int i = 0; i < loops.size(); i++) { + result[i + 1] = createScope(loops.get(i), processedScopes); } return result; } - private Scope createScope(Loop loop, HashMap processedLoops) { + private Scope createScope(Loop loop, HashMap, Scope> processedLoops) { Scope parent = processedLoops.get(loop.parent); if (parent == null) { parent = createScope(loop.parent, processedLoops); diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Wed Apr 09 17:11:48 2014 +0200 @@ -45,14 +45,14 @@ protected abstract StateT cloneState(StateT oldState); - protected abstract List processLoop(Loop loop, StateT initialState); + protected abstract List processLoop(Loop loop, StateT initialState); } private ReentrantBlockIterator() { // no instances allowed } - public static LoopInfo processLoop(BlockIteratorClosure closure, Loop loop, StateT initialState) { + public static LoopInfo processLoop(BlockIteratorClosure closure, Loop loop, StateT initialState) { IdentityHashMap blockEndStates = apply(closure, loop.header, initialState, new HashSet<>(loop.blocks)); LoopInfo info = new LoopInfo<>(); @@ -101,7 +101,7 @@ states.put(current.getEndNode(), state); } else { // recurse into the loop - Loop loop = successor.getLoop(); + Loop loop = successor.getLoop(); LoopBeginNode loopBegin = loop.loopBegin(); assert successor.getBeginNode() == loopBegin; diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Apr 09 17:11:48 2014 +0200 @@ -152,7 +152,7 @@ } @Override - protected List processLoop(Loop loop, KillSet state) { + protected List processLoop(Loop loop, KillSet state) { LoopInfo info = ReentrantBlockIterator.processLoop(this, loop, cloneState(state)); assert loop.header.getBeginNode() instanceof LoopBeginNode; @@ -649,7 +649,7 @@ * implies that the inputs' blocks have a total ordering via their dominance relation. So in * order to find the earliest block placement for this node we need to find the input block * that is dominated by all other input blocks. - * + * * While iterating over the inputs a set of dominator blocks of the current earliest * placement is maintained. When the block of an input is not within this set, it becomes * the current earliest placement and the list of dominator blocks is updated. diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/util/GraphOrder.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/util/GraphOrder.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/util/GraphOrder.java Wed Apr 09 17:11:48 2014 +0200 @@ -140,7 +140,7 @@ BlockIteratorClosure closure = new BlockIteratorClosure() { @Override - protected List processLoop(Loop loop, NodeBitMap initialState) { + protected List processLoop(Loop loop, NodeBitMap initialState) { return ReentrantBlockIterator.processLoop(this, loop, initialState).exitStates; } diff -r 6876a4599b7e -r 1bf700e19e84 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Tue Apr 15 13:34:29 2014 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Wed Apr 09 17:11:48 2014 +0200 @@ -43,7 +43,7 @@ protected final NodeMap aliases; protected final BlockMap blockEffects; - private final IdentityHashMap loopMergeEffects = new IdentityHashMap<>(); + private final IdentityHashMap, GraphEffectList> loopMergeEffects = new IdentityHashMap<>(); private final IdentityHashMap loopEntryStates = new IdentityHashMap<>(); private boolean changed; @@ -105,7 +105,7 @@ } @Override - protected List processLoop(Loop loop, Void initialState) { + protected List processLoop(Loop loop, Void initialState) { LoopInfo info = ReentrantBlockIterator.processLoop(this, loop, initialState); apply(loopMergeEffects.get(loop), loop); return info.exitStates; @@ -150,7 +150,7 @@ } @Override - protected final List processLoop(Loop loop, BlockT initialState) { + protected final List processLoop(Loop loop, BlockT initialState) { BlockT loopEntryState = initialState; BlockT lastMergedState = cloneState(initialState); MergeProcessor mergeProcessor = createMergeProcessor(loop.header);