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;