Mercurial > hg > graal-compiler
changeset 20179:ca29dc4ffab0
handle ControlSinks in PEA canonicalization
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Tue, 07 Apr 2015 17:52:50 +0200 |
parents | 7ba8fb19d56d |
children | 2c6fb59b484f |
files | graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java |
diffstat | 3 files changed, 24 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Tue Apr 07 14:07:03 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Tue Apr 07 17:52:50 2015 +0200 @@ -166,6 +166,9 @@ if (node instanceof FixedWithNextNode) { lastFixedNode = (FixedWithNextNode) node; } + if (state.isDead()) { + break; + } } VirtualUtil.trace(")\n end state: %s\n", state); }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java Tue Apr 07 14:07:03 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java Tue Apr 07 17:52:50 2015 +0200 @@ -152,6 +152,19 @@ }); } + public void replaceWithSink(FixedWithNextNode node, ControlSinkNode sink) { + add("kill if branch", new Effect() { + public void apply(StructuredGraph graph, ArrayList<Node> obsoleteNodes) { + node.replaceAtPredecessor(sink); + GraphUtil.killCFG(node); + } + + public boolean isCfgKill() { + return true; + } + }); + } + /** * Replaces the given node at its usages without deleting it. If the current node is a fixed * node it will be disconnected from the control flow, so that it will be deleted by a
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Apr 07 14:07:03 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Apr 07 17:52:50 2015 +0200 @@ -206,9 +206,14 @@ VirtualUtil.trace("replacement via canonicalization too complex: %s -> %s", node, canonicalizedValue); return false; } - effects.ensureAdded(canonicalizedValue, insertBefore); - effects.replaceAtUsages(node, canonicalizedValue); - addScalarAlias(node, canonicalizedValue); + if (canonicalizedValue instanceof ControlSinkNode) { + effects.replaceWithSink((FixedWithNextNode) node, (ControlSinkNode) canonicalizedValue); + state.markAsDead(); + } else { + effects.ensureAdded(canonicalizedValue, insertBefore); + effects.replaceAtUsages(node, canonicalizedValue); + addScalarAlias(node, canonicalizedValue); + } } VirtualUtil.trace("replaced via canonicalization: %s -> %s", node, canonicalizedValue); return true;