changeset 18160:30e03a7f9110

Truffle: revert to long[] in frame and initial value depending on frame slot kind
author Andreas Woess <andreas.woess@jku.at>
date Thu, 23 Oct 2014 12:02:02 +0200
parents 2d6646ca59be
children 94f16a759646
files graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/StoreLocalTestNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java
diffstat 3 files changed, 46 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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;
         }
--- 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()) {