# HG changeset patch # User Josef Eisl # Date 1394622547 -3600 # Node ID a6595f1b55b001c88d3d9afe251f788dba0ec2c1 # Parent 7668297a2e6702b223c2922655a44713e7acc6dd Make LIR use AbstractBlock. (errors) diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Wed Mar 12 12:09:07 2014 +0100 @@ -73,7 +73,7 @@ public RegisterStats(LIR lir) { this.lir = lir; - for (Block block : lir.codeEmittingOrder()) { + for (AbstractBlock block : lir.codeEmittingOrder()) { for (LIRInstruction instr : lir.lir(block)) { collectStats(instr); } diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Mar 12 12:09:07 2014 +0100 @@ -239,11 +239,13 @@ assert startBlock.getPredecessorCount() == 0; LIR lir = null; + List codeEmittingOrder = null; + List linearScanOrder = null; try (Scope ds = Debug.scope("MidEnd")) { try (Scope s = Debug.scope("ComputeLinearScanOrder")) { NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure(graph).apply(); - List codeEmittingOrder = ComputeBlockOrder.computeCodeEmittingOrder(blocks.length, startBlock, nodeProbabilities); - List linearScanOrder = ComputeBlockOrder.computeLinearScanOrder(blocks.length, startBlock, nodeProbabilities); + codeEmittingOrder = ComputeBlockOrder.computeCodeEmittingOrder(blocks.length, startBlock, nodeProbabilities); + linearScanOrder = ComputeBlockOrder.computeLinearScanOrder(blocks.length, startBlock, nodeProbabilities); lir = new LIR(schedule.getCFG(), linearScanOrder, codeEmittingOrder); Debug.dump(lir, "After linear scan order"); @@ -258,7 +260,7 @@ LIRGenerator lirGen = backend.newLIRGenerator(graph, stub, frameMap, cc, lir); try (Scope s = Debug.scope("LIRGen", lirGen)) { - for (Block b : lir.linearScanOrder()) { + for (Block b : linearScanOrder) { emitBlock(lirGen, b, graph, schedule.getBlockToNodesMap()); } lirGen.beforeRegisterAllocation(); diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java Wed Mar 12 12:09:07 2014 +0100 @@ -423,7 +423,7 @@ RegisterAnalysis registerAnalysis = new RegisterAnalysis(); - for (Block b : lir.codeEmittingOrder()) { + for (AbstractBlock b : lir.codeEmittingOrder()) { for (LIRInstruction op : lir.lir(b)) { if (op instanceof LabelOp) { // Don't consider this as a definition diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotBackend.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotBackend.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotBackend.java Wed Mar 12 12:09:07 2014 +0100 @@ -121,7 +121,7 @@ return value; } }; - for (Block block : lir.codeEmittingOrder()) { + for (AbstractBlock block : lir.codeEmittingOrder()) { for (LIRInstruction op : lir.lir(block)) { if (op instanceof LabelOp) { // Don't consider this as a definition diff -r 7668297a2e67 -r a6595f1b55b0 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 Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java Wed Mar 12 12:09:07 2014 +0100 @@ -38,7 +38,7 @@ * Performs control flow optimizations on the given LIR graph. */ public static void optimize(LIR lir) { - List blocks = lir.codeEmittingOrder(); + List> blocks = lir.codeEmittingOrder(); ControlFlowOptimizer.deleteEmptyBlocks(lir, blocks); } @@ -54,8 +54,8 @@ * @param block the block checked for deletion * @return whether the block can be deleted */ - private static boolean canDeleteBlock(LIR lir, Block block) { - if (block.getSuccessorCount() != 1 || block.getPredecessorCount() == 0 || block.getFirstSuccessor() == block) { + private static boolean canDeleteBlock(LIR lir, AbstractBlock block) { + if (block.getSuccessorCount() != 1 || block.getPredecessorCount() == 0 || block.getSuccessors().iterator().next() == block) { return false; } @@ -64,13 +64,13 @@ assert instructions.size() >= 2 : "block must have label and branch"; assert instructions.get(0) instanceof StandardOp.LabelOp : "first instruction must always be a label"; assert instructions.get(instructions.size() - 1) instanceof StandardOp.JumpOp : "last instruction must always be a branch"; - assert ((StandardOp.JumpOp) instructions.get(instructions.size() - 1)).destination().label() == ((StandardOp.LabelOp) lir.lir(block.getFirstSuccessor()).get(0)).getLabel() : "branch target must be the successor"; + assert ((StandardOp.JumpOp) instructions.get(instructions.size() - 1)).destination().label() == ((StandardOp.LabelOp) lir.lir(block.getSuccessors().iterator().next()).get(0)).getLabel() : "branch target must be the successor"; // Block must have exactly one successor. return instructions.size() == 2 && !instructions.get(instructions.size() - 1).hasState() && !block.isExceptionEntry(); } - private static void alignBlock(LIR lir, Block block) { + private static void alignBlock(LIR lir, AbstractBlock block) { if (!block.isAligned()) { block.setAlign(true); List instructions = lir.lir(block); @@ -80,15 +80,15 @@ } } - private static void deleteEmptyBlocks(LIR lir, List blocks) { + private static void deleteEmptyBlocks(LIR lir, List> blocks) { assert verifyBlocks(lir, blocks); - Iterator iterator = blocks.iterator(); + Iterator> iterator = blocks.iterator(); while (iterator.hasNext()) { - Block block = iterator.next(); + AbstractBlock block = iterator.next(); if (canDeleteBlock(lir, block)) { // adjust successor and predecessor lists - Block other = block.getFirstSuccessor(); - for (Block pred : block.getPredecessors()) { + AbstractBlock other = block.getSuccessors().iterator().next(); + for (AbstractBlock pred : block.getPredecessors()) { Collections.replaceAll(pred.getSuccessors(), block, other); } for (int i = 0; i < other.getPredecessorCount(); i++) { diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java Wed Mar 12 12:09:07 2014 +0100 @@ -53,10 +53,10 @@ public static void optimize(LIR ir) { EdgeMoveOptimizer optimizer = new EdgeMoveOptimizer(ir); - List blockList = ir.linearScanOrder(); + List> blockList = ir.linearScanOrder(); // ignore the first block in the list (index 0 is not processed) for (int i = blockList.size() - 1; i >= 1; i--) { - Block block = blockList.get(i); + AbstractBlock block = blockList.get(i); if (block.getPredecessorCount() > 1) { optimizer.optimizeMovesAtBlockEnd(block); @@ -103,8 +103,8 @@ * Moves the longest {@linkplain #same common} subsequence at the end all predecessors of * {@code block} to the start of {@code block}. */ - private void optimizeMovesAtBlockEnd(Block block) { - for (Block pred : block.getPredecessors()) { + private void optimizeMovesAtBlockEnd(AbstractBlock block) { + for (AbstractBlock pred : block.getPredecessors()) { if (pred == block) { // currently we can't handle this correctly. return; @@ -118,7 +118,7 @@ assert numPreds > 1 : "do not call otherwise"; // setup a list with the LIR instructions of all predecessors - for (Block pred : block.getPredecessors()) { + for (AbstractBlock pred : block.getPredecessors()) { assert pred != null; assert ir.lir(pred) != null; List predInstructions = ir.lir(pred); @@ -129,7 +129,7 @@ return; } - assert pred.getFirstSuccessor() == block : "invalid control flow"; + assert pred.getSuccessors().iterator().next() == block : "invalid control flow"; assert predInstructions.get(predInstructions.size() - 1) instanceof StandardOp.JumpOp : "block must end with unconditional jump"; if (predInstructions.get(predInstructions.size() - 1).hasState()) { @@ -173,7 +173,7 @@ * {@code block} to the end of {@code block} just prior to the branch instruction ending * {@code block}. */ - private void optimizeMovesAtBlockBegin(Block block) { + private void optimizeMovesAtBlockBegin(AbstractBlock block) { edgeInstructionSeqences.clear(); int numSux = block.getSuccessorCount(); @@ -203,7 +203,7 @@ int insertIdx = instructions.size() - 1; // setup a list with the lir-instructions of all successors - for (Block sux : block.getSuccessors()) { + for (AbstractBlock sux : block.getSuccessors()) { List suxInstructions = ir.lir(sux); assert suxInstructions.get(0) instanceof StandardOp.LabelOp : "block must start with label"; @@ -213,7 +213,7 @@ // the same blocks. return; } - assert sux.getFirstPredecessor() == block : "invalid control flow"; + assert sux.getPredecessors().iterator().next() == block : "invalid control flow"; // ignore the label at the beginning of the block List seq = suxInstructions.subList(1, suxInstructions.size()); diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java Wed Mar 12 12:09:07 2014 +0100 @@ -40,12 +40,12 @@ /** * The linear-scan ordered list of blocks. */ - private final List linearScanOrder; + private final List> linearScanOrder; /** * The order in which the code is emitted. */ - private final List codeEmittingOrder; + private final List> codeEmittingOrder; private int firstVariableNumber; @@ -65,7 +65,7 @@ /** * Creates a new LIR instance for the specified compilation. */ - public LIR(ControlFlowGraph cfg, List linearScanOrder, List codeEmittingOrder) { + public LIR(ControlFlowGraph cfg, List> linearScanOrder, List> codeEmittingOrder) { this.cfg = cfg; this.codeEmittingOrder = codeEmittingOrder; this.linearScanOrder = linearScanOrder; @@ -80,7 +80,7 @@ * Determines if any instruction in the LIR has debug info associated with it. */ public boolean hasDebugInfo() { - for (Block b : linearScanOrder()) { + for (AbstractBlock b : linearScanOrder()) { for (LIRInstruction op : lir(b)) { if (op.hasState()) { return true; @@ -108,11 +108,11 @@ * * @return the blocks in linear scan order */ - public List linearScanOrder() { + public List> linearScanOrder() { return linearScanOrder; } - public List codeEmittingOrder() { + public List> codeEmittingOrder() { return codeEmittingOrder; } @@ -169,7 +169,7 @@ */ public static final int MAX_EXCEPTION_EDGE_OP_DISTANCE_FROM_END = 3; - public static boolean verifyBlock(LIR lir, Block block) { + public static boolean verifyBlock(LIR lir, AbstractBlock block) { List ops = lir.lir(block); if (ops.size() == 0) { return false; @@ -193,12 +193,12 @@ return true; } - public static boolean verifyBlocks(LIR lir, List blocks) { - for (Block block : blocks) { - for (Block sux : block.getSuccessors()) { + public static boolean verifyBlocks(LIR lir, List> blocks) { + for (AbstractBlock block : blocks) { + for (AbstractBlock sux : block.getSuccessors()) { assert blocks.contains(sux) : "missing successor from: " + block + "to: " + sux; } - for (Block pred : block.getPredecessors()) { + for (AbstractBlock pred : block.getPredecessors()) { assert blocks.contains(pred) : "missing predecessor from: " + block + "to: " + pred; } if (!verifyBlock(lir, block)) { diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRVerifier.java Wed Mar 12 12:09:07 2014 +0100 @@ -46,11 +46,11 @@ private final BitSet[] blockLiveOut; private final Object[] variableDefinitions; - private BitSet liveOutFor(Block block) { + private BitSet liveOutFor(AbstractBlock block) { return blockLiveOut[block.getId()]; } - private void setLiveOutFor(Block block, BitSet liveOut) { + private void setLiveOutFor(AbstractBlock block, BitSet liveOut) { blockLiveOut[block.getId()] = liveOut; } @@ -98,7 +98,7 @@ private BitSet curVariablesLive; private Value[] curRegistersLive; - private Block curBlock; + private AbstractBlock curBlock; private Object curInstruction; private BitSet curRegistersDefined; @@ -120,7 +120,7 @@ int maxRegisterNum = maxRegisterNum(); curRegistersDefined = new BitSet(); - for (Block block : lir.linearScanOrder()) { + for (AbstractBlock block : lir.linearScanOrder()) { curBlock = block; curVariablesLive = new BitSet(); curRegistersLive = new Value[maxRegisterNum]; diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java Wed Mar 12 12:09:07 2014 +0100 @@ -31,15 +31,15 @@ public final class NullCheckOptimizer { public static void optimize(LIR ir, int implicitNullCheckLimit) { - List blocks = ir.codeEmittingOrder(); + List> blocks = ir.codeEmittingOrder(); NullCheckOptimizer.foldNullChecks(ir, blocks, implicitNullCheckLimit); } private NullCheckOptimizer() { } - private static void foldNullChecks(LIR ir, List blocks, int implicitNullCheckLimit) { - for (Block block : blocks) { + private static void foldNullChecks(LIR ir, List> blocks, int implicitNullCheckLimit) { + for (AbstractBlock block : blocks) { List list = ir.lir(block); if (!list.isEmpty()) { diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java Wed Mar 12 12:09:07 2014 +0100 @@ -79,7 +79,7 @@ int entryValueNum; } - Map blockData = new HashMap<>(); + Map, BlockData> blockData = new HashMap<>(); Register[] callerSaveRegs; @@ -134,7 +134,7 @@ private void initBlockData(LIR lir) { - List blocks = lir.linearScanOrder(); + List> blocks = lir.linearScanOrder(); numRegs = 0; int maxStackLocations = COMPLEXITY_LIMIT / blocks.size(); @@ -143,7 +143,7 @@ * Search for relevant locations which can be optimized. These are register or stack slots * which occur as destinations of move instructions. */ - for (Block block : blocks) { + for (AbstractBlock block : blocks) { List instructions = lir.lir(block); for (LIRInstruction op : instructions) { if (isEligibleMove(op)) { @@ -168,7 +168,7 @@ */ int numLocations = numRegs + stackIndices.size(); Debug.log("num locations = %d (regs = %d, stack = %d)", numLocations, numRegs, stackIndices.size()); - for (Block block : blocks) { + for (AbstractBlock block : blocks) { BlockData data = new BlockData(numLocations); blockData.put(block, data); } @@ -183,7 +183,7 @@ Indent indent = Debug.logAndIndent("solve data flow"); - List blocks = lir.linearScanOrder(); + List> blocks = lir.linearScanOrder(); int numIter = 0; @@ -197,7 +197,7 @@ changed = false; Indent indent2 = indent.logAndIndent("new iteration"); - for (Block block : blocks) { + for (AbstractBlock block : blocks) { BlockData data = blockData.get(block); /* @@ -226,7 +226,7 @@ /* * Merge the states of predecessor blocks */ - for (Block predecessor : block.getPredecessors()) { + for (AbstractBlock predecessor : block.getPredecessors()) { BlockData predData = blockData.get(predecessor); newState |= mergeState(data.entryState, predData.exitState, valueNum); } @@ -281,9 +281,9 @@ Indent indent = Debug.logAndIndent("eliminate moves"); - List blocks = lir.linearScanOrder(); + List> blocks = lir.linearScanOrder(); - for (Block block : blocks) { + for (AbstractBlock block : blocks) { Indent indent2 = indent.logAndIndent("eliminate moves in block %d", block.getId()); diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java Wed Mar 12 12:09:07 2014 +0100 @@ -298,7 +298,7 @@ */ public boolean isSuccessorEdge(LabelRef edge) { assert lir != null; - List order = lir.codeEmittingOrder(); + List> order = lir.codeEmittingOrder(); assert order.get(currentBlockIndex) == edge.getSourceBlock(); return currentBlockIndex < order.size() - 1 && order.get(currentBlockIndex + 1) == edge.getTargetBlock(); } @@ -312,7 +312,7 @@ this.lir = lir; this.currentBlockIndex = 0; frameContext.enter(this); - for (Block b : lir.codeEmittingOrder()) { + for (AbstractBlock b : lir.codeEmittingOrder()) { emitBlock(b); currentBlockIndex++; } @@ -320,7 +320,7 @@ this.currentBlockIndex = 0; } - private void emitBlock(Block block) { + private void emitBlock(AbstractBlock block) { if (Debug.isDumpEnabled()) { blockComment(String.format("block B%d %s", block.getId(), block.getLoop())); } diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/AbstractBlock.java Wed Mar 12 12:09:07 2014 +0100 @@ -55,4 +55,6 @@ boolean isAligned(); void setAlign(boolean align); + + T getDominator(); } diff -r 7668297a2e67 -r a6595f1b55b0 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Wed Mar 12 13:36:23 2014 +0100 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Wed Mar 12 12:09:07 2014 +0100 @@ -160,7 +160,7 @@ // No need to print the HIR nodes again if this is not the first // time dumping the same LIR since the HIR will not have changed. boolean printNodes = previousObject != object; - cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder(), printNodes); + cfgPrinter.printCFG(message, (List) cfgPrinter.lir.codeEmittingOrder(), printNodes); } else if (object instanceof StructuredGraph) { if (cfgPrinter.cfg == null) {