changeset 13843:f5f81bc9c9f0

Align successor when deleting aligned empty block.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 31 Jan 2014 11:38:32 +0100
parents a02441dcf05f
children 6bc07d0c2682
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java
diffstat 1 files changed, 15 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java	Fri Jan 31 11:35:38 2014 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java	Fri Jan 31 11:38:32 2014 +0100
@@ -68,6 +68,16 @@
         return instructions.size() == 2 && !instructions.get(instructions.size() - 1).hasState() && !block.isExceptionEntry();
     }
 
+    private static void alignBlock(LIR lir, Block block) {
+        if (!block.isAligned()) {
+            block.setAlign(true);
+            List<LIRInstruction> instructions = lir.lir(block);
+            assert instructions.get(0) instanceof StandardOp.LabelOp : "first instruction must always be a label";
+            StandardOp.LabelOp label = (StandardOp.LabelOp) instructions.get(0);
+            instructions.set(0, new StandardOp.LabelOp(label.getLabel(), true));
+        }
+    }
+
     private static void deleteEmptyBlocks(LIR lir, List<Block> blocks) {
         assert verifyBlocks(lir, blocks);
         Iterator<Block> iterator = blocks.iterator();
@@ -87,6 +97,11 @@
                 }
                 block.getSuccessors().clear();
                 block.getPredecessors().clear();
+
+                if (block.isAligned()) {
+                    alignBlock(lir, other);
+                }
+
                 Debug.metric("BlocksDeleted").increment();
                 iterator.remove();
             }