# HG changeset patch # User Thomas Wuerthinger # Date 1358101936 -3600 # Node ID b5280041f59e475d9df389f9c61ffe272d7e3519 # Parent 00e3c2e4e43c6fb1c08feb857304cb2d3b045045 Experiment with soft alignment for branch targets. diff -r 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java Sun Jan 13 19:32:16 2013 +0100 @@ -98,10 +98,10 @@ if (block.isLoopHeader()) { block.align = true; } - order.add(block); + addBlock(block, order); } if (block.isLoopEnd() && skipLoopHeader(block.getLoop().header)) { - order.add(block.getLoop().header); + addBlock(block.getLoop().header, order); for (Block succ : block.getLoop().header.getSuccessors()) { if (succ.getLoopDepth() == block.getLoopDepth()) { succ.align = true; @@ -137,6 +137,13 @@ } } + 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 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Sun Jan 13 19:32:16 2013 +0100 @@ -2958,6 +2958,13 @@ } } + @Override + public void softAlign(int modulus) { + if (codeBuffer.position() % modulus > modulus / 2) { + nop(modulus - (codeBuffer.position() % modulus)); + } + } + public void pushfq() { emitByte(0x9c); } diff -r 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java Sun Jan 13 19:32:16 2013 +0100 @@ -50,6 +50,8 @@ 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 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Sun Jan 13 19:32:16 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)); + append(new LabelOp(new Label(), block.align, block.softAlign)); if (GraalOptions.TraceLIRGeneratorLevel >= 1) { TTY.println("BEGIN Generating LIR for block B" + block.getId()); diff -r 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java Sun Jan 13 19:32:16 2013 +0100 @@ -51,10 +51,12 @@ public static class LabelOp extends LIRInstruction { private final Label label; private final boolean align; + private final boolean softAlign; - public LabelOp(Label label, boolean align) { + public LabelOp(Label label, boolean align, boolean softAlign) { this.label = label; this.align = align; + this.softAlign = softAlign; } @Override @@ -62,6 +64,9 @@ if (align) { tasm.asm.align(tasm.target.wordSize * 2); } + if (softAlign) { + tasm.asm.softAlign(tasm.target.wordSize * 2); + } tasm.asm.bind(label); } diff -r 00e3c2e4e43c -r b5280041f59e 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 Sun Jan 13 01:55:07 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Sun Jan 13 19:32:16 2013 +0100 @@ -45,6 +45,7 @@ // Fields that still need to be worked on, try to remove them later. public boolean align; + public boolean softAlign; public int linearScanNumber; protected Block() {