# HG changeset patch # User Andreas Woess # Date 1414058522 -7200 # Node ID 30e03a7f91101cd47bff4a504051ca521559a057 # Parent 2d6646ca59becd972286101c9bd87fa4e59a6efe Truffle: revert to long[] in frame and initial value depending on frame slot kind diff -r 2d6646ca59be -r 30e03a7f9110 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/StoreLocalTestNode.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/StoreLocalTestNode.java Wed Oct 22 20:33:19 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/StoreLocalTestNode.java Thu Oct 23 12:02:02 2014 +0200 @@ -37,6 +37,7 @@ @Override public int execute(VirtualFrame frame) { + slot.setKind(FrameSlotKind.Int); int value = valueNode.execute(frame); frame.setInt(slot, value); return value; diff -r 2d6646ca59be -r 30e03a7f9110 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java Wed Oct 22 20:33:19 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java Thu Oct 23 12:02:02 2014 +0200 @@ -37,13 +37,13 @@ public final class FrameWithoutBoxing implements VirtualFrame, MaterializedFrame { private static final long OBJECT_BASE_OFFSET = Unsafe.ARRAY_OBJECT_BASE_OFFSET; private static final long OBJECT_INDEX_SCALE = Unsafe.ARRAY_OBJECT_INDEX_SCALE; - private static final long PRIMITIVE_BASE_OFFSET = Unsafe.ARRAY_INT_BASE_OFFSET; - private static final long PRIMITIVE_INDEX_SCALE = Unsafe.ARRAY_INT_INDEX_SCALE * 2; + private static final long PRIMITIVE_BASE_OFFSET = Unsafe.ARRAY_LONG_BASE_OFFSET; + private static final long PRIMITIVE_INDEX_SCALE = Unsafe.ARRAY_LONG_INDEX_SCALE; private final FrameDescriptor descriptor; private final Object[] arguments; private Object[] locals; - private int[] primitiveLocals; + private long[] primitiveLocals; private byte[] tags; public FrameWithoutBoxing(FrameDescriptor descriptor, Object[] arguments) { @@ -52,7 +52,7 @@ int size = descriptor.getSize(); this.locals = new Object[size]; Arrays.fill(locals, descriptor.getTypeConversion().getDefaultValue()); - this.primitiveLocals = new int[size * 2]; + this.primitiveLocals = new long[size]; this.tags = new byte[size]; } @@ -76,8 +76,8 @@ return CompilerDirectives.unsafeCast(locals, Object[].class, true, true); } - private int[] getPrimitiveLocals() { - return CompilerDirectives.unsafeCast(this.primitiveLocals, int[].class, true, true); + private long[] getPrimitiveLocals() { + return CompilerDirectives.unsafeCast(this.primitiveLocals, long[].class, true, true); } private byte[] getTags() { @@ -294,7 +294,7 @@ if (newSize > oldSize) { locals = Arrays.copyOf(locals, newSize); Arrays.fill(locals, oldSize, newSize, descriptor.getTypeConversion().getDefaultValue()); - primitiveLocals = Arrays.copyOf(primitiveLocals, newSize * 2); + primitiveLocals = Arrays.copyOf(primitiveLocals, newSize); tags = Arrays.copyOf(tags, newSize); return true; } diff -r 2d6646ca59be -r 30e03a7f9110 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java Wed Oct 22 20:33:19 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java Thu Oct 23 12:02:02 2014 +0200 @@ -168,21 +168,22 @@ VirtualObjectNode virtualFrame = VirtualOnlyInstanceNode.create(frameType, frameFields); VirtualObjectNode virtualFrameObjectArray = VirtualArrayNode.create((ResolvedJavaType) localsField.getType().getComponentType(), frameSize); - VirtualObjectNode virtualFramePrimitiveArray = VirtualArrayNode.create((ResolvedJavaType) primitiveLocalsField.getType().getComponentType(), frameSize * 2); + VirtualObjectNode virtualFramePrimitiveArray = VirtualArrayNode.create((ResolvedJavaType) primitiveLocalsField.getType().getComponentType(), frameSize); VirtualObjectNode virtualFrameTagArray = VirtualArrayNode.create((ResolvedJavaType) tagsField.getType().getComponentType(), frameSize); ValueNode[] objectArrayEntryState = new ValueNode[frameSize]; - ValueNode[] primitiveArrayEntryState = new ValueNode[frameSize * 2]; + ValueNode[] primitiveArrayEntryState = new ValueNode[frameSize]; ValueNode[] tagArrayEntryState = new ValueNode[frameSize]; if (frameSize > 0) { FrameDescriptor frameDescriptor = getConstantFrameDescriptor(); ConstantNode objectDefault = ConstantNode.forConstant(getSnippetReflection().forObject(frameDescriptor.getTypeConversion().getDefaultValue()), tool.getMetaAccessProvider(), graph()); - ConstantNode primitiveDefault = ConstantNode.forInt(0, graph()); ConstantNode tagDefault = ConstantNode.forByte((byte) 0, graph()); Arrays.fill(objectArrayEntryState, objectDefault); - Arrays.fill(primitiveArrayEntryState, primitiveDefault); Arrays.fill(tagArrayEntryState, tagDefault); + for (int i = 0; i < frameSize; i++) { + primitiveArrayEntryState[i] = initialPrimitiveValue(frameDescriptor.getSlots().get(i).getKind()); + } tool.getAssumptions().record(new AssumptionValidAssumption((OptimizedAssumption) frameDescriptor.getVersion())); } @@ -202,6 +203,39 @@ tool.replaceWithVirtual(virtualFrame); } + private ValueNode initialPrimitiveValue(FrameSlotKind kind) { + Kind graalKind = null; + switch (kind) { + case Boolean: + graalKind = Kind.Boolean; + break; + case Byte: + graalKind = Kind.Byte; + break; + case Int: + graalKind = Kind.Int; + break; + case Double: + graalKind = Kind.Double; + break; + case Float: + graalKind = Kind.Float; + break; + case Long: + graalKind = Kind.Long; + break; + case Object: + case Illegal: + // won't be stored in the primitive array, so default to long + graalKind = Kind.Long; + break; + default: + throw new IllegalStateException("Unexpected frame slot kind: " + kind); + } + + return ConstantNode.defaultForKind(graalKind, graph()); + } + @Override public Node canonical(CanonicalizerTool tool) { if (usages().isEmpty()) {