Mercurial > hg > graal-compiler
changeset 7353:b5280041f59e
Experiment with soft alignment for branch targets.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sun, 13 Jan 2013 19:32:16 +0100 |
parents | 00e3c2e4e43c |
children | 3a8e79636f8e 4c6e577d0c01 |
files | graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java |
diffstat | 6 files changed, 26 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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<Block> 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); }
--- 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); }
--- 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);
--- 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<LIRInstruction>()); - 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());
--- 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); }
--- 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() {