# HG changeset patch # User Thomas Wuerthinger # Date 1424783380 -3600 # Node ID 67d16e135ac22bdd22a1241abaee5270569f88ae # Parent e7d46a5f177babbceb936908d0f1b8826ec1fec6 Remove redundant begin nodes after graph building. diff -r e7d46a5f177b -r 67d16e135ac2 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 Tue Feb 24 13:23:52 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Feb 24 14:09:40 2015 +0100 @@ -136,13 +136,24 @@ parser.connectLoopEndToBegin(); - // remove dead parameters + // Remove dead parameters. for (ParameterNode param : currentGraph.getNodes(ParameterNode.TYPE)) { if (param.hasNoUsages()) { assert param.inputs().isEmpty(); param.safeDelete(); } } + + // Remove redundant begin nodes. + for (BeginNode beginNode : currentGraph.getNodes(BeginNode.TYPE)) { + Node predecessor = beginNode.predecessor(); + if (predecessor instanceof ControlSplitNode) { + // The begin node is necessary. + } else { + GraphUtil.unlinkFixedNode(beginNode); + beginNode.safeDelete(); + } + } } finally { filter.remove(); } @@ -1405,22 +1416,21 @@ if (getFirstInstruction(block, operatingDimension) instanceof AbstractBeginNode && !(getFirstInstruction(block, operatingDimension) instanceof AbstractMergeNode)) { /* * This is the second time we see this block. Create the actual MergeNode and - * the End Node for the already existing edge. For simplicity, we leave the - * placeholder in the graph and just append the new nodes after the placeholder. + * the End Node for the already existing edge. */ - AbstractBeginNode placeholder = (AbstractBeginNode) getFirstInstruction(block, operatingDimension); + AbstractBeginNode beginNode = (AbstractBeginNode) getFirstInstruction(block, operatingDimension); // The EndNode for the already existing edge. EndNode end = currentGraph.add(new EndNode()); // The MergeNode that replaces the placeholder. AbstractMergeNode mergeNode = currentGraph.add(new MergeNode()); - FixedNode next = placeholder.next(); + FixedNode next = beginNode.next(); - if (placeholder.predecessor() instanceof ControlSplitNode) { - placeholder.setNext(end); + if (beginNode.predecessor() instanceof ControlSplitNode) { + beginNode.setNext(end); } else { - placeholder.replaceAtPredecessor(end); - placeholder.safeDelete(); + beginNode.replaceAtPredecessor(end); + beginNode.safeDelete(); } mergeNode.addForwardEnd(end);