changeset 19581:67d16e135ac2

Remove redundant begin nodes after graph building.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 24 Feb 2015 14:09:40 +0100
parents e7d46a5f177b
children da62d18a9da0
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java
diffstat 1 files changed, 19 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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);