# HG changeset patch # User Lukas Stadler # Date 1403770579 -7200 # Node ID db5b41891078dd25731a2b47240728009c8f0ba3 # Parent 0e5e4628fca76618c168fe5cf97d13b748946844 let ArrayLengthNode implement Canonicalizable.Binary diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILNewObjectSnippets.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILNewObjectSnippets.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILNewObjectSnippets.java Thu Jun 26 10:16:19 2014 +0200 @@ -313,12 +313,13 @@ Arguments args = new Arguments(allocateArray, graph.getGuardsStage(), tool.getLoweringStage()); args.add("hub", hub); - args.add("length", newArrayNode.length()); + ValueNode length = newArrayNode.length(); + args.add("length", length.isAlive() ? length : graph.addOrUniqueWithInputs(length)); args.add("prototypeMarkWord", arrayType.prototypeMarkWord()); args.addConst("headerSize", headerSize); args.addConst("log2ElementSize", log2ElementSize); args.addConst("fillContents", newArrayNode.fillContents()); - args.addConst("maybeUnroll", newArrayNode.length().isConstant()); + args.addConst("maybeUnroll", length.isConstant()); args.addConst("typeContext", MetaUtil.toJavaName(arrayType, false)); SnippetTemplate template = template(args); diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Thu Jun 26 10:16:19 2014 +0200 @@ -420,13 +420,14 @@ Arguments args = new Arguments(allocateArray, graph.getGuardsStage(), tool.getLoweringStage()); args.add("hub", hub); - args.add("length", newArrayNode.length()); + ValueNode length = newArrayNode.length(); + args.add("length", length.isAlive() ? length : graph.addOrUniqueWithInputs(length)); args.add("prototypeMarkWord", arrayType.prototypeMarkWord()); args.addConst("headerSize", headerSize); args.addConst("log2ElementSize", log2ElementSize); args.addConst("fillContents", newArrayNode.fillContents()); args.addConst("threadRegister", registers.getThreadRegister()); - args.addConst("maybeUnroll", newArrayNode.length().isConstant()); + args.addConst("maybeUnroll", length.isConstant()); args.addConst("typeContext", ProfileAllocations.getValue() ? toJavaName(arrayType, false) : ""); SnippetTemplate template = template(args); @@ -445,9 +446,11 @@ } public void lower(DynamicNewArrayNode newArrayNode, HotSpotRegistersProvider registers, LoweringTool tool) { + StructuredGraph graph = newArrayNode.graph(); Arguments args = new Arguments(allocateArrayDynamic, newArrayNode.graph().getGuardsStage(), tool.getLoweringStage()); args.add("elementType", newArrayNode.getElementType()); - args.add("length", newArrayNode.length()); + ValueNode length = newArrayNode.length(); + args.add("length", length.isAlive() ? length : graph.addOrUniqueWithInputs(length)); args.addConst("fillContents", newArrayNode.fillContents()); args.addConst("threadRegister", registers.getThreadRegister()); diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java Thu Jun 26 10:16:19 2014 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -33,7 +32,7 @@ /** * The {@code ArrayLength} instruction gets the length of an array. */ -public final class ArrayLengthNode extends FixedWithNextNode implements Canonicalizable, Lowerable, Virtualizable { +public final class ArrayLengthNode extends FixedWithNextNode implements Canonicalizable.Unary, Lowerable, Virtualizable { @Input private ValueNode array; @@ -41,14 +40,17 @@ return array; } + public ValueNode getValue() { + return array; + } + public ArrayLengthNode(ValueNode array) { super(StampFactory.positiveInt()); this.array = array; } - @Override - public Node canonical(CanonicalizerTool tool) { - ValueNode length = readArrayLength(graph(), array(), tool.getConstantReflection()); + public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) { + ValueNode length = readArrayLength(forValue, tool.getConstantReflection()); if (length != null) { return length; } @@ -60,7 +62,7 @@ * * @return a node representing the length of {@code array} or null if it is not available */ - public static ValueNode readArrayLength(StructuredGraph graph, ValueNode originalArray, ConstantReflectionProvider constantReflection) { + public static ValueNode readArrayLength(ValueNode originalArray, ConstantReflectionProvider constantReflection) { ArrayLengthProvider foundArrayLengthProvider = null; ValueNode result = originalArray; while (true) { @@ -87,7 +89,7 @@ if (constantValue != null && constantValue.isNonNull()) { Integer constantLength = constantReflection.readArrayLength(constantValue); if (constantLength != null) { - return ConstantNode.forInt(constantLength, graph); + return ConstantNode.forInt(constantLength); } } } diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/DynamicNewArrayNode.java Thu Jun 26 10:16:19 2014 +0200 @@ -58,7 +58,8 @@ if (isAlive() && elementType.isConstant()) { ResolvedJavaType javaType = tool.getConstantReflection().asJavaType(elementType.asConstant()); if (javaType != null && !javaType.equals(tool.getMetaAccess().lookupJavaType(void.class))) { - NewArrayNode newArray = graph().add(new NewArrayNode(javaType, length(), fillContents())); + ValueNode length = length(); + NewArrayNode newArray = graph().add(new NewArrayNode(javaType, length.isAlive() ? length : graph().addOrUniqueWithInputs(length), fillContents())); List snapshot = inputs().snapshot(); graph().replaceFixedWithFixed(this, newArray); for (Node input : snapshot) { diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Thu Jun 26 10:16:19 2014 +0200 @@ -146,6 +146,6 @@ } public ValueNode length() { - return ConstantNode.forInt(length, graph()); + return ConstantNode.forInt(length); } } diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Thu Jun 26 10:16:19 2014 +0200 @@ -626,13 +626,15 @@ protected GuardingNode createBoundsCheck(AccessIndexedNode n, LoweringTool tool) { StructuredGraph graph = n.graph(); ValueNode array = n.array(); - ValueNode arrayLength = readArrayLength(n.graph(), array, tool.getConstantReflection()); + ValueNode arrayLength = readArrayLength(array, tool.getConstantReflection()); if (arrayLength == null) { Stamp stamp = StampFactory.positiveInt(); ReadNode readArrayLength = graph.add(new ReadNode(array, ConstantLocationNode.create(ARRAY_LENGTH_LOCATION, Kind.Int, arrayLengthOffset(), graph), stamp, BarrierType.NONE)); graph.addBeforeFixed(n, readArrayLength); readArrayLength.setGuard(createNullCheck(array, readArrayLength, tool)); arrayLength = readArrayLength; + } else { + arrayLength = arrayLength.isAlive() ? arrayLength : graph.addOrUniqueWithInputs(arrayLength); } if (arrayLength.isConstant() && n.index().isConstant()) { diff -r 0e5e4628fca7 -r db5b41891078 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Jun 26 09:53:59 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Jun 26 10:16:19 2014 +0200 @@ -365,7 +365,7 @@ } public ValueNode length() { - return ConstantNode.forInt(varargs.length, graph()); + return ConstantNode.forInt(varargs.length); } }