# HG changeset patch # User Thomas Wuerthinger # Date 1423864255 -3600 # Node ID 4acfeb8a0010307cb62142530adc103b846b9367 # Parent bef4a591e0b3e0be8ec80ab11e99e596eb99db9a Prototype avoiding the creation of begin nodes for target blocks with single predecessor. diff -r bef4a591e0b3 -r 4acfeb8a0010 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Feb 13 22:03:34 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Feb 13 22:50:55 2015 +0100 @@ -284,7 +284,7 @@ currentBlock = blockMap.startBlock; blockMap.startBlock.setEntryState(0, frameState); if (blockMap.startBlock.isLoopHeader && !explodeLoops) { - appendGoto(createTarget(blockMap.startBlock, frameState)); + appendGoto(blockMap.startBlock); } else { blockMap.startBlock.setFirstInstruction(0, lastInstr); } @@ -630,7 +630,7 @@ @Override protected void genGoto() { - appendGoto(createTarget(currentBlock.getSuccessor(0), frameState)); + appendGoto(currentBlock.getSuccessor(0)); assert currentBlock.numNormalSuccessors() == 1; } @@ -1015,7 +1015,7 @@ frameState.push(x.getKind(), x); } assert returnCount > 1; - appendGoto(createTarget(returnBlock(bci()), frameState)); + appendGoto(returnBlock(bci())); } } } @@ -1064,7 +1064,7 @@ } ConstantNode nextBciNode = getJsrConstant(nextBci); frameState.push(Kind.Int, nextBciNode); - appendGoto(createTarget(successor, frameState)); + appendGoto(successor); } @Override @@ -1080,7 +1080,7 @@ if (!successor.getJsrScope().equals(scope.pop())) { throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)"); } - appendGoto(createTarget(successor, frameState)); + appendGoto(successor); } private ConstantNode getJsrConstant(long bci) { @@ -1200,7 +1200,7 @@ firstLoopExit = loopExit; } lastLoopExit = loopExit; - Debug.log("Target %s (%s) Exits %s, scanning framestates...", targetBlock, target, loop); + Debug.log("Target %s Exits %s, scanning framestates...", targetBlock, loop); newState.insertLoopProxies(loopExit, (HIRFrameStateBuilder) loop.getEntryState(this.getCurrentDimension())); loopExit.setStateAfter(newState.create(bci)); } @@ -1271,8 +1271,9 @@ * this block again. */ FixedNode targetNode; - if (isGoto && block.getPredecessorCount() == 1) { + if (isGoto && block.getPredecessorCount() == 1 && !block.isLoopHeader && (currentBlock.loops & ~block.loops) == 0 && !(lastInstr instanceof AbstractMergeNode)) { block.setFirstInstruction(operatingDimension, lastInstr); + lastInstr = null; } else { block.setFirstInstruction(operatingDimension, currentGraph.add(new BeginNode())); } @@ -1462,7 +1463,7 @@ assert frameState.stackSize() == 1 : frameState; if (block.handler.isCatchAll()) { assert block.getSuccessorCount() == 1; - appendGoto(createTarget(block.getSuccessor(0), frameState)); + appendGoto(block.getSuccessor(0)); return; } @@ -1502,9 +1503,10 @@ } } - private void appendGoto(FixedNode target) { - if (lastInstr != null) { - lastInstr.setNext(target); + private void appendGoto(BciBlock successor) { + FixedNode targetInstr = createTarget(successor, frameState, true); + if (lastInstr != null && lastInstr != targetInstr) { + lastInstr.setNext(targetInstr); } } @@ -1602,7 +1604,7 @@ assert !block.getSuccessor(0).isExceptionEntry; assert block.numNormalSuccessors() == 1; // we fell through to the next block, add a goto and break - appendGoto(createTarget(block.getSuccessor(0), frameState)); + appendGoto(block.getSuccessor(0)); break; } } @@ -1654,7 +1656,7 @@ BciBlock trueBlock = currentBlock.getSuccessor(0); BciBlock falseBlock = currentBlock.getSuccessor(1); if (trueBlock == falseBlock) { - appendGoto(createTarget(trueBlock, frameState)); + appendGoto(trueBlock); return; } @@ -1691,7 +1693,7 @@ if (value) { nextBlock = trueBlock; } - appendGoto(createTarget(nextBlock, frameState)); + appendGoto(nextBlock); } else { ValueNode trueSuccessor = createBlockTarget(probability, trueBlock, frameState); ValueNode falseSuccessor = createBlockTarget(1 - probability, falseBlock, frameState);