Mercurial > hg > graal-compiler
changeset 19588: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);