# HG changeset patch # User Lukas Stadler # Date 1347366340 -7200 # Node ID 6a324c13cfff37d2262a9d57eec2fab5609f6c5b # Parent 2590d9cc3b6d32c3c8643c1910f1b8a89bbd5f25 add fillContents property to New... nodes diff -r 2590d9cc3b6d -r 6a324c13cfff graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- 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))); diff -r 2590d9cc3b6d -r 6a324c13cfff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MaterializeObjectNode.java --- 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 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 getValues() { + public NodeInputList 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; + } + } } diff -r 2590d9cc3b6d -r 6a324c13cfff 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 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++) { diff -r 2590d9cc3b6d -r 6a324c13cfff 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 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 escapeFields = new ArrayList<>(); fillEscapeFields(x.instanceClass(), escapeFields); return escapeFields.toArray(new EscapeField[escapeFields.size()]); diff -r 2590d9cc3b6d -r 6a324c13cfff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java --- 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 diff -r 2590d9cc3b6d -r 6a324c13cfff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java --- 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