# HG changeset patch # User Lukas Stadler # Date 1428421970 -7200 # Node ID ca29dc4ffab06ebcb421a046c52f107c02787de3 # Parent 7ba8fb19d56dbe6b0da498578b0d91023385c715 handle ControlSinks in PEA canonicalization diff -r 7ba8fb19d56d -r ca29dc4ffab0 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java --- 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); } diff -r 7ba8fb19d56d -r ca29dc4ffab0 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java --- 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 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 diff -r 7ba8fb19d56d -r ca29dc4ffab0 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- 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;