# HG changeset patch # User Roland Schatz # Date 1391164712 -3600 # Node ID f5f81bc9c9f00e442c72c1c38ad5f4dbbe608804 # Parent a02441dcf05f885a38af749a4aa7f4ebacc3ee90 Align successor when deleting aligned empty block. diff -r a02441dcf05f -r f5f81bc9c9f0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java --- 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 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 blocks) { assert verifyBlocks(lir, blocks); Iterator 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(); }