changeset 6354:6a324c13cfff

add fillContents property to New... nodes
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 11 Sep 2012 14:25:40 +0200
parents 2590d9cc3b6d
children 892d3c82febe
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MaterializeObjectNode.java 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/java/NewObjectArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java
diffstat 6 files changed, 40 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Sep 11 14:25:40 2012 +0200
@@ -663,7 +663,7 @@
     void genNewInstance(int cpi) {
         JavaType type = lookupType(cpi, NEW);
         if (type instanceof ResolvedJavaType && ((ResolvedJavaType) type).isInitialized()) {
-            NewInstanceNode n = currentGraph.add(new NewInstanceNode((ResolvedJavaType) type));
+            NewInstanceNode n = currentGraph.add(new NewInstanceNode((ResolvedJavaType) type, true));
             frameState.apush(append(n));
         } else {
             append(currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId)));
@@ -696,7 +696,7 @@
     private void genNewPrimitiveArray(int typeCode) {
         Kind kind = arrayTypeCodeToKind(typeCode);
         ResolvedJavaType elementType = runtime.getResolvedJavaType(kind);
-        NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(elementType, frameState.ipop()));
+        NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(elementType, frameState.ipop(), true));
         frameState.apush(append(nta));
     }
 
@@ -704,7 +704,7 @@
         JavaType type = lookupType(cpi, ANEWARRAY);
         ValueNode length = frameState.ipop();
         if (type instanceof ResolvedJavaType) {
-            NewArrayNode n = currentGraph.add(new NewObjectArrayNode((ResolvedJavaType) type, length));
+            NewArrayNode n = currentGraph.add(new NewObjectArrayNode((ResolvedJavaType) type, length, true));
             frameState.apush(append(n));
         } else {
             append(currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId)));
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MaterializeObjectNode.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MaterializeObjectNode.java	Tue Sep 11 14:25:40 2012 +0200
@@ -29,17 +29,17 @@
 import com.oracle.graal.nodes.type.*;
 
 @NodeInfo(nameTemplate = "Materialize {p#type/s}")
-public final class MaterializeObjectNode extends FixedWithNextNode implements Lowerable, Node.IterableNodeType {
+public final class MaterializeObjectNode extends FixedWithNextNode implements Lowerable, Node.IterableNodeType, Canonicalizable {
 
     @Input private final NodeInputList<ValueNode> values;
     private final ResolvedJavaType type;
     private final EscapeField[] fields;
 
-    public MaterializeObjectNode(ResolvedJavaType type, EscapeField[] fields, ValueNode[] values) {
+    public MaterializeObjectNode(ResolvedJavaType type, EscapeField[] fields) {
         super(StampFactory.exactNonNull(type));
         this.type = type;
         this.fields = fields;
-        this.values = new NodeInputList<>(this, values);
+        this.values = new NodeInputList<>(this, fields.length);
     }
 
     public ResolvedJavaType type() {
@@ -50,7 +50,7 @@
         return fields;
     }
 
-    public NodeInputList<ValueNode> getValues() {
+    public NodeInputList<ValueNode> values() {
         return values;
     }
 
@@ -61,9 +61,9 @@
             ResolvedJavaType element = type.componentType();
             NewArrayNode newArray;
             if (element.kind() == Kind.Object) {
-                newArray = graph.add(new NewObjectArrayNode(element, ConstantNode.forInt(fields.length, graph)));
+                newArray = graph.add(new NewObjectArrayNode(element, ConstantNode.forInt(fields.length, graph), false));
             } else {
-                newArray = graph.add(new NewPrimitiveArrayNode(element, ConstantNode.forInt(fields.length, graph)));
+                newArray = graph.add(new NewPrimitiveArrayNode(element, ConstantNode.forInt(fields.length, graph), false));
             }
             this.replaceAtUsages(newArray);
             graph.addAfterFixed(this, newArray);
@@ -77,7 +77,7 @@
 
             graph.removeFixed(this);
         } else {
-            NewInstanceNode newInstance = graph.add(new NewInstanceNode(type));
+            NewInstanceNode newInstance = graph.add(new NewInstanceNode(type, false));
             this.replaceAtUsages(newInstance);
             graph.addAfterFixed(this, newInstance);
 
@@ -91,4 +91,13 @@
             graph.removeFixed(this);
         }
     }
+
+    @Override
+    public ValueNode canonical(CanonicalizerTool tool) {
+        if (usages().isEmpty()) {
+            return null;
+        } else {
+            return this;
+        }
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Tue Sep 11 14:25:40 2012 +0200
@@ -38,6 +38,7 @@
 
     @Input private ValueNode length;
     private final ResolvedJavaType elementType;
+    private final boolean fillContents;
 
     public static final int MaximumEscapeAnalysisArrayLength = 32;
 
@@ -50,10 +51,15 @@
      * Constructs a new NewArrayNode.
      * @param length the node that produces the length for this allocation
      */
-    protected NewArrayNode(ResolvedJavaType elementType, ValueNode length) {
+    protected NewArrayNode(ResolvedJavaType elementType, ValueNode length, boolean fillContents) {
         super(StampFactory.exactNonNull(elementType.arrayOf()));
         this.length = length;
         this.elementType = elementType;
+        this.fillContents = fillContents;
+    }
+
+    public boolean fillContents() {
+        return fillContents;
     }
 
     /**
@@ -105,6 +111,7 @@
         @Override
         public EscapeField[] fields(Node node) {
             NewArrayNode x = (NewArrayNode) node;
+            assert x.elementType.arrayOf().isArrayClass();
             int length = x.dimension(0).asConstant().asInt();
             EscapeField[] fields = new EscapeField[length];
             for (int i = 0; i < length; i++) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Sep 11 14:25:40 2012 +0200
@@ -38,14 +38,16 @@
 public final class NewInstanceNode extends FixedWithNextNode implements EscapeAnalyzable, Lowerable, LIRLowerable, Node.IterableNodeType {
 
     private final ResolvedJavaType instanceClass;
+    private final boolean fillContents;
 
     /**
      * Constructs a NewInstanceNode.
      * @param type the class being allocated
      */
-    public NewInstanceNode(ResolvedJavaType type) {
+    public NewInstanceNode(ResolvedJavaType type, boolean fillContents) {
         super(StampFactory.exactNonNull(type));
         this.instanceClass = type;
+        this.fillContents = fillContents;
     }
 
     /**
@@ -56,6 +58,10 @@
         return instanceClass;
     }
 
+    public boolean fillContents() {
+        return fillContents;
+    }
+
     @Override
     public void lower(LoweringTool tool) {
         tool.getRuntime().lower(this, tool);
@@ -97,6 +103,7 @@
         @Override
         public EscapeField[] fields(Node node) {
             NewInstanceNode x = (NewInstanceNode) node;
+            assert !x.instanceClass().isArrayClass();
             List<EscapeField> escapeFields = new ArrayList<>();
             fillEscapeFields(x.instanceClass(), escapeFields);
             return escapeFields.toArray(new EscapeField[escapeFields.size()]);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java	Tue Sep 11 14:25:40 2012 +0200
@@ -38,8 +38,8 @@
      * @param elementClass the class of elements in this array
      * @param length the node producing the length of the array
      */
-    public NewObjectArrayNode(ResolvedJavaType elementClass, ValueNode length) {
-        super(elementClass, length);
+    public NewObjectArrayNode(ResolvedJavaType elementClass, ValueNode length, boolean fillContents) {
+        super(elementClass, length, fillContents);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java	Tue Sep 11 14:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java	Tue Sep 11 14:25:40 2012 +0200
@@ -31,10 +31,10 @@
  * The {@code NewPrimitiveArrayNode} class definition.
  */
 @NodeInfo(nameTemplate = "NewArray {p#elementType}")
-public final class NewPrimitiveArrayNode extends NewArrayNode implements LIRLowerable {
+public final class NewPrimitiveArrayNode extends NewArrayNode implements LIRLowerable, Node.IterableNodeType {
 
-    public NewPrimitiveArrayNode(ResolvedJavaType elementType, ValueNode length) {
-        super(elementType, length);
+    public NewPrimitiveArrayNode(ResolvedJavaType elementType, ValueNode length, boolean fillContents) {
+        super(elementType, length, fillContents);
     }
 
     @Override