changeset 7006:51b6e594b0cd

refactor EscapeAnalyzeable (remove EscapeOp)
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 20 Nov 2012 13:25:28 +0100
parents 98d691bc23da
children 94596bbec6f0
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeAnalyzable.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java
diffstat 6 files changed, 66 insertions(+), 127 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Fri Nov 16 17:21:10 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Tue Nov 20 13:25:28 2012 +0100
@@ -105,32 +105,17 @@
     }
 
     @Override
-    public EscapeOp getEscapeOp() {
+    public ObjectDesc[] getAllocations(long nextVirtualId) {
         if (length().asConstant() != null) {
             final int constantLength = length().asConstant().asInt();
             if (constantLength >= 0 && constantLength < MaximumEscapeAnalysisArrayLength) {
-                return new EscapeOp() {
-
-                    @Override
-                    public ValueNode[] fieldState() {
-                        ValueNode[] state = new ValueNode[constantLength];
-                        ConstantNode defaultForKind = constantLength == 0 ? null : ConstantNode.defaultForKind(elementType().getKind(), graph());
-                        for (int i = 0; i < constantLength; i++) {
-                            state[i] = defaultForKind;
-                        }
-                        return state;
-                    }
-
-                    @Override
-                    public VirtualObjectNode virtualObject(long virtualId) {
-                        return new VirtualArrayNode(virtualId, elementType, constantLength);
-                    }
-
-                    @Override
-                    public int lockCount() {
-                        return 0;
-                    }
-                };
+                ValueNode[] state = new ValueNode[constantLength];
+                ConstantNode defaultForKind = constantLength == 0 ? null : ConstantNode.defaultForKind(elementType().getKind(), graph());
+                for (int i = 0; i < constantLength; i++) {
+                    state[i] = defaultForKind;
+                }
+                VirtualObjectNode virtualObject = new VirtualArrayNode(nextVirtualId, elementType, constantLength);
+                return new ObjectDesc[]{new ObjectDesc(virtualObject, state, 0)};
             }
         }
         return null;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Fri Nov 16 17:21:10 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Nov 20 13:25:28 2012 +0100
@@ -83,7 +83,7 @@
         tool.getRuntime().lower(this, tool);
     }
 
-    private void fillEscapeFields(ResolvedJavaType type, List<ResolvedJavaField> escapeFields) {
+    private static void fillEscapeFields(ResolvedJavaType type, List<ResolvedJavaField> escapeFields) {
         if (type != null) {
             fillEscapeFields(type.getSuperclass(), escapeFields);
             for (ResolvedJavaField field : type.getDeclaredFields()) {
@@ -92,34 +92,24 @@
         }
     }
 
+    public static ResolvedJavaField[] getEscapeFields(ResolvedJavaType type) {
+        List<ResolvedJavaField> escapeFields = new ArrayList<>();
+        fillEscapeFields(type, escapeFields);
+        ResolvedJavaField[] fields = escapeFields.toArray(new ResolvedJavaField[escapeFields.size()]);
+        return fields;
+    }
+
     @Override
-    public EscapeOp getEscapeOp() {
+    public ObjectDesc[] getAllocations(long nextVirtualId) {
         if (instanceClass != null) {
             assert !instanceClass().isArrayClass();
-            List<ResolvedJavaField> escapeFields = new ArrayList<>();
-            fillEscapeFields(instanceClass(), escapeFields);
-            final ResolvedJavaField[] fields = escapeFields.toArray(new ResolvedJavaField[escapeFields.size()]);
-            return new EscapeOp() {
-
-                @Override
-                public ValueNode[] fieldState() {
-                    ValueNode[] state = new ValueNode[fields.length];
-                    for (int i = 0; i < state.length; i++) {
-                        state[i] = ConstantNode.defaultForKind(fields[i].getType().getKind(), graph());
-                    }
-                    return state;
-                }
-
-                @Override
-                public VirtualObjectNode virtualObject(long virtualId) {
-                    return new VirtualInstanceNode(virtualId, instanceClass(), fields);
-                }
-
-                @Override
-                public int lockCount() {
-                    return 0;
-                }
-            };
+            ResolvedJavaField[] fields = getEscapeFields(instanceClass());
+            ValueNode[] state = new ValueNode[fields.length];
+            for (int i = 0; i < state.length; i++) {
+                state[i] = ConstantNode.defaultForKind(fields[i].getType().getKind(), graph());
+            }
+            VirtualObjectNode virtualObject = new VirtualInstanceNode(nextVirtualId, instanceClass(), fields);
+            return new ObjectDesc[]{new ObjectDesc(virtualObject, state, 0)};
         }
         return null;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeAnalyzable.java	Fri Nov 16 17:21:10 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeAnalyzable.java	Tue Nov 20 13:25:28 2012 +0100
@@ -22,7 +22,23 @@
  */
 package com.oracle.graal.nodes.spi;
 
+import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.virtual.*;
+
 public interface EscapeAnalyzable {
 
-    EscapeOp getEscapeOp();
+    public static class ObjectDesc {
+
+        public final VirtualObjectNode virtualObject;
+        public final ValueNode[] entryState;
+        public final int lockCount;
+
+        public ObjectDesc(VirtualObjectNode virtualObject, ValueNode[] entryState, int lockCount) {
+            this.virtualObject = virtualObject;
+            this.entryState = entryState;
+            this.lockCount = lockCount;
+        }
+    }
+
+    ObjectDesc[] getAllocations(long nextVirtualId);
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java	Fri Nov 16 17:21:10 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.graal.nodes.spi;
-
-import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.virtual.*;
-
-public abstract class EscapeOp {
-
-    /**
-     * Returns the initial value of all fields.
-     */
-    public abstract ValueNode[] fieldState();
-
-    public abstract VirtualObjectNode virtualObject(long virtualId);
-
-    public abstract int lockCount();
-
-}
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java	Fri Nov 16 17:21:10 2012 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java	Tue Nov 20 13:25:28 2012 +0100
@@ -101,27 +101,11 @@
     }
 
     @Override
-    public EscapeOp getEscapeOp() {
-        if (!shouldRevirtualize(this)) {
-            return null;
+    public ObjectDesc[] getAllocations(long nextVirtualId) {
+        if (shouldRevirtualize(this)) {
+            return new ObjectDesc[] {new ObjectDesc(virtualObject, values.toArray(new ValueNode[values.size()]), lockCount)};
         }
-        return new EscapeOp() {
-
-            @Override
-            public ValueNode[] fieldState() {
-                return values.toArray(new ValueNode[values.size()]);
-            }
-
-            @Override
-            public VirtualObjectNode virtualObject(long virtualId) {
-                return virtualObject;
-            }
-
-            @Override
-            public int lockCount() {
-                return lockCount;
-            }
-        };
+        return null;
     }
 
     private boolean shouldRevirtualize(MaterializeObjectNode materializeObjectNode) {
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Fri Nov 16 17:21:10 2012 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Tue Nov 20 13:25:28 2012 +0100
@@ -36,6 +36,7 @@
 import com.oracle.graal.nodes.VirtualState.NodeClosure;
 import com.oracle.graal.nodes.cfg.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.spi.EscapeAnalyzable.ObjectDesc;
 import com.oracle.graal.nodes.virtual.*;
 import com.oracle.graal.phases.*;
 import com.oracle.graal.phases.graph.*;
@@ -93,29 +94,31 @@
 
         FixedWithNextNode lastFixedNode = null;
         for (Node node : nodeList) {
-            EscapeOp op = null;
+            ObjectDesc[] newAllocations = null;
             if (node instanceof EscapeAnalyzable) {
-                op = ((EscapeAnalyzable) node).getEscapeOp();
+                newAllocations = ((EscapeAnalyzable) node).getAllocations(virtualIds);
             }
 
-            if (op != null) {
-                trace("{{%s}} ", node);
-                VirtualObjectNode virtualObject = op.virtualObject(virtualIds);
-                if (virtualObject.isAlive()) {
-                    reusedVirtualObjects.add(virtualObject);
-                    state.addAndMarkAlias(virtualObject, virtualObject, usages);
-                } else {
-                    effects.addFloatingNode(virtualObject);
+            if (newAllocations != null) {
+                for (ObjectDesc desc : newAllocations) {
+                    trace("{{%s}} ", node);
+                    VirtualObjectNode virtualObject = desc.virtualObject;
+                    if (virtualObject.isAlive()) {
+                        reusedVirtualObjects.add(virtualObject);
+                        state.addAndMarkAlias(virtualObject, virtualObject, usages);
+                    } else {
+                        effects.addFloatingNode(virtualObject);
+                    }
+                    ValueNode[] fieldState = desc.entryState;
+                    for (int i = 0; i < fieldState.length; i++) {
+                        fieldState[i] = state.getScalarAlias(fieldState[i]);
+                    }
+                    state.addObject(virtualObject, new ObjectState(virtualObject, fieldState, desc.lockCount));
+                    state.addAndMarkAlias(virtualObject, (ValueNode) node, usages);
                 }
-                ValueNode[] fieldState = op.fieldState();
-                for (int i = 0; i < fieldState.length; i++) {
-                    fieldState[i] = state.getScalarAlias(fieldState[i]);
-                }
-                state.addObject(virtualObject, new ObjectState(virtualObject, fieldState, op.lockCount()));
-                state.addAndMarkAlias(virtualObject, (ValueNode) node, usages);
                 effects.deleteFixedNode((FixedWithNextNode) node);
-                virtualIds++;
-                metricAllocationRemoved.increment();
+                metricAllocationRemoved.add(newAllocations.length);
+                virtualIds += newAllocations.length;
             } else {
                 if (usages.isMarked(node)) {
                     trace("[[%s]] ", node);