Mercurial > hg > truffle
changeset 19713:95d0385ec788
Correctly handle corner case in AbstractBeginNode#removeProxies.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Mon, 09 Mar 2015 11:33:09 +0100 |
parents | 055a095424a7 |
children | b503dd4e723c |
files | graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java |
diffstat | 2 files changed, 20 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Mon Mar 09 01:24:00 2015 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Mon Mar 09 11:33:09 2015 +0100 @@ -345,6 +345,13 @@ return this.usage0 == null; } + /** + * Checks whether this node has usages. + */ + public final boolean hasUsages() { + return this.usage0 != null; + } + void reverseUsageOrder() { List<Node> snapshot = this.usages().snapshot(); for (Node n : snapshot) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Mon Mar 09 01:24:00 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Mon Mar 09 11:33:09 2015 +0100 @@ -94,10 +94,19 @@ } public void removeProxies() { - for (ProxyNode vpn : proxies().snapshot()) { - // can not use graph.replaceFloating because vpn.value may be null during killCFG - vpn.replaceAtUsages(vpn.value()); - vpn.safeDelete(); + if (this.hasUsages()) { + outer: while (true) { + for (ProxyNode vpn : proxies().snapshot()) { + ValueNode value = vpn.value(); + vpn.replaceAtUsages(value); + vpn.safeDelete(); + if (value == this) { + // Guard proxy could have this input as value. + continue outer; + } + } + break; + } } }