# HG changeset patch # User Lukas Stadler # Date 1353414328 -3600 # Node ID 51b6e594b0cd258ce01221d42d16430b67107462 # Parent 98d691bc23da8073574dc0739ed8164c3bd4c54e refactor EscapeAnalyzeable (remove EscapeOp) diff -r 98d691bc23da -r 51b6e594b0cd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java --- 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; diff -r 98d691bc23da -r 51b6e594b0cd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java --- 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 escapeFields) { + private static void fillEscapeFields(ResolvedJavaType type, List escapeFields) { if (type != null) { fillEscapeFields(type.getSuperclass(), escapeFields); for (ResolvedJavaField field : type.getDeclaredFields()) { @@ -92,34 +92,24 @@ } } + public static ResolvedJavaField[] getEscapeFields(ResolvedJavaType type) { + List 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 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; } diff -r 98d691bc23da -r 51b6e594b0cd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeAnalyzable.java --- 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); } diff -r 98d691bc23da -r 51b6e594b0cd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/EscapeOp.java --- 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(); - -} diff -r 98d691bc23da -r 51b6e594b0cd graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java --- 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) { diff -r 98d691bc23da -r 51b6e594b0cd 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 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);