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() {