# HG changeset patch # User Josef Eisl # Date 1398340807 -7200 # Node ID 8117e9cadb481f90350779fc5f513950b932cc55 # Parent d897375b372add89f7c763a911c788771549ae1b Use List instead of an array in AbstractControlFlowGraph. diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineControlFlowGraph.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineControlFlowGraph.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineControlFlowGraph.java Thu Apr 24 14:00:07 2014 +0200 @@ -31,17 +31,17 @@ public class BaselineControlFlowGraph implements AbstractControlFlowGraph { - private BciBlock[] blocks; + private List blocks; private Collection> loops; private BitSet visited; public BaselineControlFlowGraph(BciBlockMapping blockMap) { - blocks = blockMap.blocks.toArray(new BciBlock[0]); + blocks = blockMap.blocks; loops = new ArrayList<>(); computeLoopInformation(); } - public BciBlock[] getBlocks() { + public List getBlocks() { return blocks; } @@ -50,17 +50,17 @@ } public BciBlock getStartBlock() { - if (blocks.length > 0) { - return blocks[0]; + if (!blocks.isEmpty()) { + return blocks.get(0); } return null; } private void computeLoopInformation() { - visited = new BitSet(blocks.length); + visited = new BitSet(blocks.size()); Deque stack = new ArrayDeque<>(); - for (int i = blocks.length - 1; i >= 0; i--) { - BciBlock block = blocks[i]; + for (int i = blocks.size() - 1; i >= 0; i--) { + BciBlock block = blocks.get(i); calcLoop(block, stack); } } diff -r d897375b372a -r 8117e9cadb48 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 Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Thu Apr 24 14:00:07 2014 +0200 @@ -29,7 +29,7 @@ static final int BLOCK_ID_INITIAL = -1; static final int BLOCK_ID_VISITED = -2; - T[] getBlocks(); + List getBlocks(); Collection> getLoops(); diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/BlockMap.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/BlockMap.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/BlockMap.java Thu Apr 24 14:00:07 2014 +0200 @@ -28,7 +28,7 @@ @SuppressWarnings("unchecked") public BlockMap(AbstractControlFlowGraph cfg) { - data = (T[]) new Object[cfg.getBlocks().length]; + data = (T[]) new Object[cfg.getBlocks().size()]; } public T get(AbstractBlock block) { diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Thu Apr 24 14:00:07 2014 +0200 @@ -164,7 +164,7 @@ @Test public void testLoop1() { SchedulePhase schedule = getFinalSchedule("testLoop1Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(6, schedule.getCFG().getBlocks().length); + assertEquals(6, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, true); assertReadWithinAllReturnBlocks(schedule, false); } @@ -189,7 +189,7 @@ @Test public void testLoop2() { SchedulePhase schedule = getFinalSchedule("testLoop2Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(6, schedule.getCFG().getBlocks().length); + assertEquals(6, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, true); } @@ -211,7 +211,7 @@ @Test public void testLoop3() { SchedulePhase schedule = getFinalSchedule("testLoop3Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(6, schedule.getCFG().getBlocks().length); + assertEquals(6, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, true); assertReadWithinAllReturnBlocks(schedule, false); } @@ -247,7 +247,7 @@ @Test public void testLoop5() { SchedulePhase schedule = getFinalSchedule("testLoop5Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(10, schedule.getCFG().getBlocks().length); + assertEquals(10, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, false); } @@ -285,7 +285,7 @@ @Test public void testIfRead1() { SchedulePhase schedule = getFinalSchedule("testIfRead1Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(3, schedule.getCFG().getBlocks().length); + assertEquals(3, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, true); assertReadAndWriteInSameBlock(schedule, false); } @@ -306,7 +306,7 @@ @Test public void testIfRead2() { SchedulePhase schedule = getFinalSchedule("testIfRead2Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(3, schedule.getCFG().getBlocks().length); + assertEquals(3, schedule.getCFG().getBlocks().size()); assertEquals(1, schedule.getCFG().graph.getNodes().filter(FloatingReadNode.class).count()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, false); @@ -328,7 +328,7 @@ @Test public void testIfRead3() { SchedulePhase schedule = getFinalSchedule("testIfRead3Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(4, schedule.getCFG().getBlocks().length); + assertEquals(4, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, true); } @@ -349,7 +349,7 @@ @Test public void testIfRead4() { SchedulePhase schedule = getFinalSchedule("testIfRead4Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(3, schedule.getCFG().getBlocks().length); + assertEquals(3, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, false); assertReadAndWriteInSameBlock(schedule, true); @@ -368,7 +368,7 @@ @Test public void testIfRead5() { SchedulePhase schedule = getFinalSchedule("testIfRead5Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(4, schedule.getCFG().getBlocks().length); + assertEquals(4, schedule.getCFG().getBlocks().size()); assertReadWithinStartBlock(schedule, false); assertReadWithinAllReturnBlocks(schedule, true); assertReadAndWriteInSameBlock(schedule, false); @@ -397,7 +397,7 @@ StructuredGraph graph = schedule.getCFG().graph; NodeIterable writeNodes = graph.getNodes().filter(WriteNode.class); - assertEquals(1, schedule.getCFG().getBlocks().length); + assertEquals(1, schedule.getCFG().getBlocks().size()); assertEquals(8, writeNodes.count()); assertEquals(1, graph.getNodes().filter(FloatingReadNode.class).count()); diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java Thu Apr 24 14:00:07 2014 +0200 @@ -63,45 +63,45 @@ ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true); - Block[] blocks = cfg.getBlocks(); + List blocks = cfg.getBlocks(); // check number of blocks - assertEquals(4, blocks.length); + assertEquals(4, blocks.size()); // check block - node assignment - assertEquals(blocks[0], cfg.blockFor(graph.start())); - assertEquals(blocks[0], cfg.blockFor(ifNode)); - assertEquals(blocks[1], cfg.blockFor(trueBegin)); - assertEquals(blocks[1], cfg.blockFor(trueEnd)); - assertEquals(blocks[2], cfg.blockFor(falseBegin)); - assertEquals(blocks[2], cfg.blockFor(falseEnd)); - assertEquals(blocks[3], cfg.blockFor(merge)); - assertEquals(blocks[3], cfg.blockFor(returnNode)); + assertEquals(blocks.get(0), cfg.blockFor(graph.start())); + assertEquals(blocks.get(0), cfg.blockFor(ifNode)); + assertEquals(blocks.get(1), cfg.blockFor(trueBegin)); + assertEquals(blocks.get(1), cfg.blockFor(trueEnd)); + assertEquals(blocks.get(2), cfg.blockFor(falseBegin)); + assertEquals(blocks.get(2), cfg.blockFor(falseEnd)); + assertEquals(blocks.get(3), cfg.blockFor(merge)); + assertEquals(blocks.get(3), cfg.blockFor(returnNode)); // check postOrder Iterator it = cfg.postOrder().iterator(); - for (int i = blocks.length - 1; i >= 0; i--) { + for (int i = blocks.size() - 1; i >= 0; i--) { assertTrue(it.hasNext()); Block b = it.next(); - assertEquals(blocks[i], b); + assertEquals(blocks.get(i), b); } // check dominators - assertDominator(blocks[0], null); - assertDominator(blocks[1], blocks[0]); - assertDominator(blocks[2], blocks[0]); - assertDominator(blocks[3], blocks[0]); + assertDominator(blocks.get(0), null); + assertDominator(blocks.get(1), blocks.get(0)); + assertDominator(blocks.get(2), blocks.get(0)); + assertDominator(blocks.get(3), blocks.get(0)); // check dominated - assertDominatedSize(blocks[0], 3); - assertDominatedSize(blocks[1], 0); - assertDominatedSize(blocks[2], 0); - assertDominatedSize(blocks[3], 0); + assertDominatedSize(blocks.get(0), 3); + assertDominatedSize(blocks.get(1), 0); + assertDominatedSize(blocks.get(2), 0); + assertDominatedSize(blocks.get(3), 0); // check postdominators - assertPostdominator(blocks[0], blocks[3]); - assertPostdominator(blocks[1], blocks[3]); - assertPostdominator(blocks[2], blocks[3]); - assertPostdominator(blocks[3], null); + assertPostdominator(blocks.get(0), blocks.get(3)); + assertPostdominator(blocks.get(1), blocks.get(3)); + assertPostdominator(blocks.get(2), blocks.get(3)); + assertPostdominator(blocks.get(3), null); } public static void assertDominator(Block block, Block expectedDominator) { diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Apr 24 14:00:07 2014 +0200 @@ -218,7 +218,7 @@ } public static LIRGenerationResult emitLIR(Backend backend, TargetDescription target, SchedulePhase schedule, StructuredGraph graph, Object stub, CallingConvention cc, RegisterConfig registerConfig) { - Block[] blocks = schedule.getCFG().getBlocks(); + List blocks = schedule.getCFG().getBlocks(); Block startBlock = schedule.getCFG().getStartBlock(); assert startBlock != null; assert startBlock.getPredecessorCount() == 0; @@ -228,8 +228,8 @@ List linearScanOrder = null; try (Scope ds = Debug.scope("MidEnd")) { try (Scope s = Debug.scope("ComputeLinearScanOrder")) { - codeEmittingOrder = ComputeBlockOrder.computeCodeEmittingOrder(blocks.length, startBlock); - linearScanOrder = ComputeBlockOrder.computeLinearScanOrder(blocks.length, startBlock); + codeEmittingOrder = ComputeBlockOrder.computeCodeEmittingOrder(blocks.size(), startBlock); + linearScanOrder = ComputeBlockOrder.computeLinearScanOrder(blocks.size(), startBlock); lir = new LIR(schedule.getCFG(), linearScanOrder, codeEmittingOrder); Debug.dump(lir, "After linear scan order"); diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java --- a/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.java.decompiler/src/com/oracle/graal/java/decompiler/Decompiler.java Thu Apr 24 14:00:07 2014 +0200 @@ -68,8 +68,8 @@ cfgBlocks.add(b); } - for (int i = 0; i < getCfg().getBlocks().length - 1; i++) { - if (cfg.getBlocks()[i].getId() >= cfg.getBlocks()[i + 1].getId()) { + for (int i = 0; i < getCfg().getBlocks().size() - 1; i++) { + if (cfg.getBlocks().get(i).getId() >= cfg.getBlocks().get(i + 1).getId()) { throw new AssertionError(); } } diff -r d897375b372a -r 8117e9cadb48 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 Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/CFGVerifier.java Thu Apr 24 14:00:07 2014 +0200 @@ -31,7 +31,7 @@ public static boolean verify(ControlFlowGraph cfg) { for (Block block : cfg.getBlocks()) { assert block.getId() >= 0; - assert cfg.getBlocks()[block.getId()] == block; + assert cfg.getBlocks().get(block.getId()) == block; for (Block pred : block.getPredecessors()) { assert pred.getSuccessors().contains(block); diff -r d897375b372a -r 8117e9cadb48 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 Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Thu Apr 24 14:00:07 2014 +0200 @@ -35,7 +35,7 @@ public final StructuredGraph graph; private final NodeMap nodeToBlock; - private Block[] reversePostOrder; + private List reversePostOrder; private List> loops; public static ControlFlowGraph compute(StructuredGraph graph, boolean connectBlocks, boolean computeLoops, boolean computeDominators, boolean computePostdominators) { @@ -64,12 +64,12 @@ this.nodeToBlock = graph.createNodeMap(true); } - public Block[] getBlocks() { + public List getBlocks() { return reversePostOrder; } public Block getStartBlock() { - return reversePostOrder[0]; + return reversePostOrder.get(0); } public Iterable postOrder() { @@ -79,16 +79,16 @@ public Iterator iterator() { return new Iterator() { - private int nextIndex = reversePostOrder.length - 1; + private ListIterator it = reversePostOrder.listIterator(reversePostOrder.size()); @Override public boolean hasNext() { - return nextIndex >= 0; + return it.hasPrevious(); } @Override public Block next() { - return reversePostOrder[nextIndex--]; + return it.previous(); } @Override @@ -188,11 +188,11 @@ // Compute reverse postorder and number blocks. assert postOrder.size() <= numBlocks : "some blocks originally created can be unreachable, so actual block list can be shorter"; numBlocks = postOrder.size(); - reversePostOrder = new Block[numBlocks]; + reversePostOrder = new ArrayList<>(numBlocks); for (int i = 0; i < numBlocks; i++) { Block block = postOrder.get(numBlocks - i - 1); block.setId(i); - reversePostOrder[i] = block; + reversePostOrder.add(block); } } @@ -307,9 +307,9 @@ } private void computeDominators() { - assert reversePostOrder[0].getPredecessorCount() == 0 : "start block has no predecessor and therefore no dominator"; - for (int i = 1; i < reversePostOrder.length; i++) { - Block block = reversePostOrder[i]; + assert reversePostOrder.get(0).getPredecessorCount() == 0 : "start block has no predecessor and therefore no dominator"; + for (int i = 1; i < reversePostOrder.size(); i++) { + Block block = reversePostOrder.get(i); assert block.getPredecessorCount() > 0; Block dominator = null; for (Block pred : block.getPredecessors()) { diff -r d897375b372a -r 8117e9cadb48 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 Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ProfileCompiledMethodsPhase.java Thu Apr 24 14:00:07 2014 +0200 @@ -79,7 +79,7 @@ while (current.next() instanceof FixedWithNextNode) { current = (FixedWithNextNode) current.next(); } - addSectionCounters(current, Arrays.asList(cfg.getBlocks()), cfg.getLoops(), schedule, probabilities); + addSectionCounters(current, cfg.getBlocks(), cfg.getLoops(), schedule, probabilities); if (WITH_INVOKES) { for (Node node : graph.getNodes()) { diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java Thu Apr 24 14:00:07 2014 +0200 @@ -137,7 +137,7 @@ } ControlFlowGraph cfg = schedule == null ? null : schedule.getCFG(); BlockMap> blockToNodes = schedule == null ? null : schedule.getBlockToNodesMap(); - Block[] blocks = cfg == null ? null : cfg.getBlocks(); + List blocks = cfg == null ? null : cfg.getBlocks(); writeNodes(graph); writeBlocks(blocks, blockToNodes); } @@ -460,9 +460,9 @@ } } - private void writeBlocks(Block[] blocks, BlockMap> blockToNodes) throws IOException { + private void writeBlocks(List blocks, BlockMap> blockToNodes) throws IOException { if (blocks != null) { - writeInt(blocks.length); + writeInt(blocks.size()); for (Block block : blocks) { List nodes = blockToNodes.get(block); writeInt(block.getId()); diff -r d897375b372a -r 8117e9cadb48 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Thu Apr 24 13:38:14 2014 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Thu Apr 24 14:00:07 2014 +0200 @@ -174,7 +174,7 @@ StructuredGraph graph = (StructuredGraph) object; cfgPrinter.cfg = ControlFlowGraph.compute(graph, true, true, true, false); } - cfgPrinter.printCFG(message, Arrays.asList(cfgPrinter.cfg.getBlocks()), true); + cfgPrinter.printCFG(message, cfgPrinter.cfg.getBlocks(), true); } else if (object instanceof CompilationResult) { final CompilationResult compResult = (CompilationResult) object;