changeset 3092:f34c90b89f54

fixes to escape analysis: propagation of VirtualObject
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 28 Jun 2011 19:54:51 +0200
parents bee93b329be2
children 8551bcfbba9e 2fb14099d069 f14632d52ab3
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java
diffstat 2 files changed, 12 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Tue Jun 28 19:22:42 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Tue Jun 28 19:54:51 2011 +0200
@@ -1904,18 +1904,20 @@
         do {
             boolean found = false;
             for (int i = 0; i < escapeFields.length; i++) {
-                if (escapeFields[i] == current.field() && values[i] == null) {
-                    values[i] = toCiValue(opId, current.input());
+                if (escapeFields[i].representation() == current.field().representation()) {
+                    if (values[i] == null) {
+                        values[i] = toCiValue(opId, current.input());
+                    }
                     found = true;
                     break;
                 }
             }
-            assert found;
+            assert found : type + "." + current.field() + " not found";
             current = current.object();
         } while (current != null);
 
-        for (CiValue val : values) {
-//            assert val != null;
+        for (int i = 0; i < escapeFields.length; i++) {
+            assert values[i] != null : type + "." + escapeFields[i];
         }
 
         CiVirtualObject vobj = CiVirtualObject.get(type, values, obj.id());
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Tue Jun 28 19:22:42 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Tue Jun 28 19:54:51 2011 +0200
@@ -111,10 +111,15 @@
                     } else {
                         List<Block> predecessors = block.getPredecessors();
                         Set<EscapeField> mergedFields = new HashSet<EscapeField>();
+
+                        BlockExitState predState = exitStates.get(predecessors.get(0));
+                        state.obj = predState == null ? null : predState.obj;
+
                         for (int i = 0; i < predecessors.size(); i++) {
                             BlockExitState exitState = exitStates.get(predecessors.get(i));
                             if (exitState == null) {
                                 mergedFields.addAll(fields.values());
+                                state.obj = null;
                                 break;
                             } else {
                                 for (EscapeField field : fields.values()) {