changeset 9804:79d65c694a3b

Make escape analysis and phi nodes more robust with additional assertions.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 23 May 2013 16:49:01 +0200
parents 8e33b4ebfef1
children 53bc0557baaf
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java
diffstat 3 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Thu May 23 13:14:08 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Thu May 23 16:49:01 2013 +0200
@@ -199,6 +199,7 @@
 
     public void addInput(ValueNode x) {
         assert !(x instanceof PhiNode) || ((PhiNode) x).merge() instanceof LoopBeginNode || ((PhiNode) x).merge() != this.merge();
+        assert x.kind() == kind() || type != PhiType.Value;
         values.add(x);
     }
 
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Thu May 23 13:14:08 2013 +0200
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Thu May 23 16:49:01 2013 +0200
@@ -521,7 +521,13 @@
                             for (int i = 1; i < states.size(); i++) {
                                 ValueNode[] fields = objStates[i].getEntries();
                                 if (phis[index] == null && values[index] != fields[index]) {
-                                    phis[index] = new PhiNode(values[index].kind(), merge);
+                                    Kind kind = values[index].kind();
+                                    if (kind == Kind.Illegal) {
+                                        // Can happen if one of the values is virtual and is only
+                                        // materialized in the following loop.
+                                        kind = Kind.Object;
+                                    }
+                                    phis[index] = new PhiNode(kind, merge);
                                 }
                             }
                         }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java	Thu May 23 13:14:08 2013 +0200
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java	Thu May 23 16:49:01 2013 +0200
@@ -91,11 +91,12 @@
         if (valueState == null) {
             obj.setEntry(index, getReplacedValue(value));
         } else {
-            if (valueState.getState() == EscapeState.Virtual) {
-                obj.setEntry(index, value);
-            } else {
-                obj.setEntry(index, valueState.getMaterializedValue());
+            ValueNode newValue = value;
+            if (valueState.getState() != EscapeState.Virtual) {
+                newValue = valueState.getMaterializedValue();
             }
+            assert obj.getEntry(index) == null || obj.getEntry(index).kind() == newValue.kind();
+            obj.setEntry(index, newValue);
         }
     }