# HG changeset patch # User Thomas Wuerthinger # Date 1358178764 -3600 # Node ID 39a4192ae632e105fcfc09a0e8670d4ccfae7b15 # Parent 4c6e577d0c018c4d54898d3fc847990524ad6c86 Experiment with new block order for LSRA. diff -r 4c6e577d0c01 -r 39a4192ae632 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 Mon Jan 14 14:19:49 2013 +0100 +++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java Mon Jan 14 16:52:44 2013 +0100 @@ -76,24 +76,27 @@ countEdges(startBlock, null); computeOrder(startBlock); + List newLinearScanOrder = new ArrayList<>(); List order = new ArrayList<>(); PriorityQueue worklist = new PriorityQueue<>(10, blockComparator); BitSet orderedBlocks = new BitSet(maxBlockId); orderedBlocks.set(startBlock.getId()); worklist.add(startBlock); - computeCodeEmittingOrder(order, worklist, orderedBlocks); + computeCodeEmittingOrder(order, newLinearScanOrder, worklist, orderedBlocks); assert codeEmittingOrder.size() == order.size(); codeEmittingOrder = order; + + linearScanOrder = newLinearScanOrder; } - private void computeCodeEmittingOrder(List order, PriorityQueue worklist, BitSet orderedBlocks) { + private void computeCodeEmittingOrder(List order, List newLinearScanOrder, PriorityQueue worklist, BitSet orderedBlocks) { while (!worklist.isEmpty()) { Block nextImportantPath = worklist.poll(); - addImportantPath(nextImportantPath, order, worklist, orderedBlocks); + addImportantPath(nextImportantPath, order, newLinearScanOrder, worklist, orderedBlocks); } } - private void addImportantPath(Block block, List order, PriorityQueue worklist, BitSet orderedBlocks) { + private void addImportantPath(Block block, List order, List newLinearScanOrder, PriorityQueue worklist, BitSet orderedBlocks) { if (!skipLoopHeader(block)) { if (block.isLoopHeader()) { block.align = true; @@ -108,6 +111,7 @@ } } } + newLinearScanOrder.add(block); Block bestSucc = null; double bestSuccProb = 0; @@ -133,7 +137,7 @@ if (bestSucc != null) { orderedBlocks.set(bestSucc.getId()); - addImportantPath(bestSucc, order, worklist, orderedBlocks); + addImportantPath(bestSucc, order, newLinearScanOrder, worklist, orderedBlocks); } } diff -r 4c6e577d0c01 -r 39a4192ae632 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 Mon Jan 14 14:19:49 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Jan 14 16:52:44 2013 +0100 @@ -241,11 +241,22 @@ public void run() { for (Block b : lir.linearScanOrder()) { - lirGenerator.doBlock(b); + emitBlock(b); } Debug.dump(lir, "After LIR generation"); } + + private void emitBlock(Block b) { + if (lir.lir(b) == null) { + for (Block pred : b.getPredecessors()) { + if (!b.isLoopHeader() || !pred.isLoopEnd()) { + emitBlock(pred); + } + } + lirGenerator.doBlock(b); + } + } }); Debug.scope("Allocator", new Runnable() {