# HG changeset patch # User Thomas Wuerthinger # Date 1358178779 -3600 # Node ID d3c6fe53e6312b224ea10787f8b5bd67e9d28d77 # Parent 39a4192ae632e105fcfc09a0e8670d4ccfae7b15# Parent cbcee2e1ce51507debe537fe3ded3682b33bfc42 Merge. diff -r cbcee2e1ce51 -r d3c6fe53e631 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 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java Mon Jan 14 16:52:59 2013 +0100 @@ -76,38 +76,42 @@ 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; } - addBlock(block, order); + order.add(block); } if (block.isLoopEnd() && skipLoopHeader(block.getLoop().header)) { - addBlock(block.getLoop().header, order); + order.add(block.getLoop().header); for (Block succ : block.getLoop().header.getSuccessors()) { if (succ.getLoopDepth() == block.getLoopDepth()) { succ.align = true; } } } + newLinearScanOrder.add(block); Block bestSucc = null; double bestSuccProb = 0; @@ -133,17 +137,10 @@ if (bestSucc != null) { orderedBlocks.set(bestSucc.getId()); - addImportantPath(bestSucc, order, worklist, orderedBlocks); + addImportantPath(bestSucc, order, newLinearScanOrder, worklist, orderedBlocks); } } - private static void addBlock(Block block, List order) { - if (order.size() > 0 && block.getPredecessors().size() == 1 && block.getPredecessors().get(0) != order.get(order.size() - 1)) { - block.softAlign = false; - } - order.add(block); - } - private boolean skipLoopHeader(Block bestSucc) { return (reorderLoops && bestSucc.isLoopHeader() && !bestSucc.isLoopEnd() && bestSucc.getLoop().loopBegin().loopEnds().count() == 1); } diff -r cbcee2e1ce51 -r d3c6fe53e631 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Jan 14 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Jan 14 16:52:59 2013 +0100 @@ -2958,13 +2958,6 @@ } } - @Override - public void softAlign(int modulus) { - if (codeBuffer.position() % modulus > modulus / 2) { - nop(modulus - (codeBuffer.position() % modulus)); - } - } - public void pushfq() { emitByte(0x9c); } diff -r cbcee2e1ce51 -r d3c6fe53e631 graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java --- a/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java Mon Jan 14 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java Mon Jan 14 16:52:59 2013 +0100 @@ -50,8 +50,6 @@ public abstract void align(int modulus); - public abstract void softAlign(int modulus); - public abstract void jmp(Label l); protected abstract void patchJumpTarget(int branch, int jumpTarget); diff -r cbcee2e1ce51 -r d3c6fe53e631 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 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Jan 14 16:52:59 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() { diff -r cbcee2e1ce51 -r d3c6fe53e631 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Mon Jan 14 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Mon Jan 14 16:52:59 2013 +0100 @@ -282,7 +282,7 @@ assert lir.lir(block) == null : "LIR list already computed for this block"; lir.setLir(block, new ArrayList()); - append(new LabelOp(new Label(), block.align, block.softAlign)); + append(new LabelOp(new Label(), block.align)); if (GraalOptions.TraceLIRGeneratorLevel >= 1) { TTY.println("BEGIN Generating LIR for block B" + block.getId()); diff -r cbcee2e1ce51 -r d3c6fe53e631 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java Mon Jan 14 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java Mon Jan 14 16:52:59 2013 +0100 @@ -51,12 +51,10 @@ public static class LabelOp extends LIRInstruction { private final Label label; private final boolean align; - private final boolean softAlign; - public LabelOp(Label label, boolean align, boolean softAlign) { + public LabelOp(Label label, boolean align) { this.label = label; this.align = align; - this.softAlign = softAlign; } @Override @@ -64,9 +62,6 @@ if (align) { tasm.asm.align(tasm.target.wordSize * 2); } - if (softAlign) { - tasm.asm.softAlign(tasm.target.wordSize * 2); - } tasm.asm.bind(label); } diff -r cbcee2e1ce51 -r d3c6fe53e631 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 Mon Jan 14 15:23:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Mon Jan 14 16:52:59 2013 +0100 @@ -45,7 +45,6 @@ // Fields that still need to be worked on, try to remove them later. public boolean align; - public boolean softAlign; public int linearScanNumber; protected Block() {