changeset 7372:6d65e368bb81

Merge.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 14 Jan 2013 16:56:54 +0100
parents d3c6fe53e631 (diff) f04a5e46cdd2 (current diff)
children 6b2c55fc9ba8 44012c5c6783
files
diffstat 7 files changed, 25 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java	Mon Jan 14 16:56:54 2013 +0100
@@ -76,38 +76,42 @@
         countEdges(startBlock, null);
         computeOrder(startBlock);
 
+        List<Block> newLinearScanOrder = new ArrayList<>();
         List<Block> order = new ArrayList<>();
         PriorityQueue<Block> 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<Block> order, PriorityQueue<Block> worklist, BitSet orderedBlocks) {
+    private void computeCodeEmittingOrder(List<Block> order, List<Block> newLinearScanOrder, PriorityQueue<Block> 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<Block> order, PriorityQueue<Block> worklist, BitSet orderedBlocks) {
+    private void addImportantPath(Block block, List<Block> order, List<Block> newLinearScanOrder, PriorityQueue<Block> 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<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	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java	Mon Jan 14 16:56:54 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);
     }
--- a/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.asm/src/com/oracle/graal/asm/AbstractAssembler.java	Mon Jan 14 16:56:54 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);
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java	Mon Jan 14 16:56:54 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() {
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Mon Jan 14 16:56:54 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, block.softAlign));
+        append(new LabelOp(new Label(), block.align));
 
         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	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/StandardOp.java	Mon Jan 14 16:56:54 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);
         }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java	Mon Jan 14 16:29:08 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java	Mon Jan 14 16:56:54 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() {