Mercurial > hg > graal-compiler
changeset 9879:bf6943c12840
allow for late lowering of MemoryCheckpoints (handle usages by FloatingReads in SnippetTemplate)
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Wed, 05 Jun 2013 12:05:27 +0200 |
parents | d0a007fb65af |
children | f7ec3ec8a03c |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InsertStateAfterPlaceholderPhase.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java |
diffstat | 2 files changed, 11 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InsertStateAfterPlaceholderPhase.java Wed Jun 05 11:50:07 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InsertStateAfterPlaceholderPhase.java Wed Jun 05 12:05:27 2013 +0200 @@ -48,6 +48,9 @@ @Override public ValueNode canonical(CanonicalizerTool tool) { + if (!usages().isEmpty()) { + return this; + } if (stateAfter() == null) { return null; }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Wed Jun 05 11:50:07 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Wed Jun 05 12:05:27 2013 +0200 @@ -34,6 +34,7 @@ import com.oracle.graal.loop.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -723,10 +724,14 @@ } else { returnValue = (ValueNode) duplicates.get(returnNode.result()); } - assert returnValue != null || replacee.usages().isEmpty(); - replacer.replace(replacee, returnValue); + Node returnDuplicate = duplicates.get(returnNode); + if (returnValue == null && replacee.usages().isNotEmpty() && replacee instanceof MemoryCheckpoint) { + replacer.replace(replacee, (ValueNode) returnDuplicate.predecessor()); + } else { + assert returnValue != null || replacee.usages().isEmpty() : this + " " + returnValue + " " + returnNode + " " + replacee.usages(); + replacer.replace(replacee, returnValue); - Node returnDuplicate = duplicates.get(returnNode); + } if (returnDuplicate.isAlive()) { returnDuplicate.clearInputs(); returnDuplicate.replaceAndDelete(next);