changeset 19366:4acfeb8a0010

Prototype avoiding the creation of begin nodes for target blocks with single predecessor.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 13 Feb 2015 22:50:55 +0100
parents bef4a591e0b3
children f9ccdf258dd4
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java
diffstat 1 files changed, 16 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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);