# HG changeset patch # User Andreas Woess # Date 1413286513 -7200 # Node ID df548b06c2591c6950b76624f248e3cbc49c1e81 # Parent ad62445b46b04b66e3a1a16c3ba67e2ecff21330 Truffle: always store values of primitive types as long values in the frame array. diff -r ad62445b46b0 -r df548b06c259 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 Tue Oct 14 12:12:01 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java Tue Oct 14 13:35:13 2014 +0200 @@ -104,7 +104,7 @@ private byte getByteUnsafe(FrameSlot slot) { int slotIndex = slot.getIndex(); - return CompilerDirectives.unsafeGetByte(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, + return (byte) CompilerDirectives.unsafeGetLong(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, this.getTags()[slotIndex] == FrameSlotKind.Byte.ordinal(), slot); } @@ -115,7 +115,7 @@ } private void setByteUnsafe(FrameSlot slot, byte value) { - CompilerDirectives.unsafePutByte(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); + CompilerDirectives.unsafePutLong(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); } @Override @@ -126,8 +126,8 @@ private boolean getBooleanUnsafe(FrameSlot slot) { int slotIndex = slot.getIndex(); - return CompilerDirectives.unsafeGetBoolean(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, - this.getTags()[slotIndex] == FrameSlotKind.Boolean.ordinal(), slot); + return CompilerDirectives.unsafeGetLong(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, + this.getTags()[slotIndex] == FrameSlotKind.Boolean.ordinal(), slot) != 0; } @Override @@ -137,7 +137,7 @@ } private void setBooleanUnsafe(FrameSlot slot, boolean value) { - CompilerDirectives.unsafePutBoolean(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); + CompilerDirectives.unsafePutLong(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value ? 1 : 0, slot); } @Override @@ -148,8 +148,8 @@ private float getFloatUnsafe(FrameSlot slot) { int slotIndex = slot.getIndex(); - return CompilerDirectives.unsafeGetFloat(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, - this.getTags()[slotIndex] == FrameSlotKind.Float.ordinal(), slot); + return Float.intBitsToFloat((int) CompilerDirectives.unsafeGetLong(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, + this.getTags()[slotIndex] == FrameSlotKind.Float.ordinal(), slot)); } @Override @@ -159,7 +159,7 @@ } private void setFloatUnsafe(FrameSlot slot, float value) { - CompilerDirectives.unsafePutFloat(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); + CompilerDirectives.unsafePutLong(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, Float.floatToRawIntBits(value), slot); } @Override @@ -192,7 +192,7 @@ private int getIntUnsafe(FrameSlot slot) { int slotIndex = slot.getIndex(); - return CompilerDirectives.unsafeGetInt(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, + return (int) CompilerDirectives.unsafeGetLong(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, this.getTags()[slotIndex] == FrameSlotKind.Int.ordinal(), slot); } @@ -203,7 +203,7 @@ } private void setIntUnsafe(FrameSlot slot, int value) { - CompilerDirectives.unsafePutInt(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); + CompilerDirectives.unsafePutLong(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); } @Override @@ -214,8 +214,8 @@ private double getDoubleUnsafe(FrameSlot slot) { int slotIndex = slot.getIndex(); - return CompilerDirectives.unsafeGetDouble(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, - this.getTags()[slotIndex] == FrameSlotKind.Double.ordinal(), slot); + return Double.longBitsToDouble(CompilerDirectives.unsafeGetLong(getPrimitiveLocals(), (long) slotIndex * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, + this.getTags()[slotIndex] == FrameSlotKind.Double.ordinal(), slot)); } @Override @@ -225,7 +225,7 @@ } private void setDoubleUnsafe(FrameSlot slot, double value) { - CompilerDirectives.unsafePutDouble(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, value, slot); + CompilerDirectives.unsafePutLong(getPrimitiveLocals(), (long) slot.getIndex() * Unsafe.ARRAY_LONG_INDEX_SCALE + Unsafe.ARRAY_LONG_BASE_OFFSET, Double.doubleToRawLongBits(value), slot); } @Override diff -r ad62445b46b0 -r df548b06c259 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 Tue Oct 14 12:12:01 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java Tue Oct 14 13:35:13 2014 +0200 @@ -178,10 +178,11 @@ if (frameSize > 0) { FrameDescriptor frameDescriptor = getConstantFrameDescriptor(); ConstantNode objectDefault = ConstantNode.forConstant(getSnippetReflection().forObject(frameDescriptor.getTypeConversion().getDefaultValue()), tool.getMetaAccessProvider(), graph()); + ConstantNode primitiveDefault = ConstantNode.forLong(0, graph()); ConstantNode tagDefault = ConstantNode.forByte((byte) 0, graph()); for (int i = 0; i < frameSize; i++) { objectArrayEntryState[i] = objectDefault; - primitiveArrayEntryState[i] = initialPrimitiveValue(frameDescriptor.getSlots().get(i).getKind()); + primitiveArrayEntryState[i] = primitiveDefault; tagArrayEntryState[i] = tagDefault; } tool.getAssumptions().record(new AssumptionValidAssumption((OptimizedAssumption) frameDescriptor.getVersion())); @@ -203,39 +204,6 @@ 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()) {