changeset 11638:269e6794e1ec

Truffle: Frame restructuring.
author Andreas Woess <andreas.woess@jku.at>
date Sun, 15 Sep 2013 02:39:07 +0200
parents 126e20d36563
children fe748819e31c e8dfad9a424f
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameSlotTypeSpecializationTest.java graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/ReturnTypeSpecializationTest.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotImpl.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameUtil.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultFrameTypeConversion.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadLocalNode.java graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java
diffstat 12 files changed, 89 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java	Sun Sep 15 02:39:07 2013 +0200
@@ -50,6 +50,7 @@
         this.caller = caller;
         this.arguments = arguments;
         this.locals = new Object[descriptor.getSize()];
+        Arrays.fill(locals, descriptor.getTypeConversion().getDefaultValue());
         this.primitiveLocals = new long[descriptor.getSize()];
         this.tags = new byte[descriptor.getSize()];
     }
@@ -90,8 +91,8 @@
     }
 
     @Override
-    public void setObject(FrameSlot slot, Object value) throws FrameSlotTypeException {
-        verifySet(slot, FrameSlotKind.Object);
+    public void setObject(FrameSlot slot, Object value) {
+        verifySetObject(slot);
         setObjectUnsafe(slot, value);
     }
 
@@ -242,43 +243,50 @@
         tags[slotIndex] = (byte) accessKind.ordinal();
     }
 
-    private void verifyGet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException {
-        FrameSlotKind slotKind = slot.getKind();
-        if (slotKind != accessKind) {
+    private void verifySetObject(FrameSlot slot) {
+        if (slot.getKind() != FrameSlotKind.Object) {
             CompilerDirectives.transferToInterpreter();
-            if (slotKind == FrameSlotKind.Illegal && accessKind == FrameSlotKind.Object) {
-                slot.setKind(FrameSlotKind.Object);
-                this.setObject(slot, descriptor.getTypeConversion().getDefaultValue());
-            } else {
-                throw new FrameSlotTypeException();
-            }
+            slot.setKind(FrameSlotKind.Object);
         }
         int slotIndex = slot.getIndex();
         if (slotIndex >= tags.length) {
             CompilerDirectives.transferToInterpreter();
             resize();
         }
-        if (tags[slotIndex] != accessKind.ordinal()) {
+        tags[slotIndex] = (byte) FrameSlotKind.Object.ordinal();
+    }
+
+    private void verifyGet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException {
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
             CompilerDirectives.transferToInterpreter();
-            descriptor.getTypeConversion().updateFrameSlot(this, slot, getValue(slot));
-            if (tags[slotIndex] != accessKind.ordinal()) {
-                throw new FrameSlotTypeException();
+            resize();
+        }
+        byte tag = tags[slotIndex];
+        if (accessKind == FrameSlotKind.Object ? (tag & 0xfe) != 0 : tag != accessKind.ordinal()) {
+            CompilerDirectives.transferToInterpreter();
+            if (slot.getKind() == accessKind || tag == 0) {
+                descriptor.getTypeConversion().updateFrameSlot(this, slot, getValue(slot));
+                if (tags[slotIndex] == accessKind.ordinal()) {
+                    return;
+                }
             }
+            throw new FrameSlotTypeException();
         }
     }
 
     @Override
     public Object getValue(FrameSlot slot) {
-        int index = slot.getIndex();
-        if (index >= tags.length) {
-            assert index >= 0 && index < descriptor.getSize();
-            return descriptor.getTypeConversion().getDefaultValue();
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
+            CompilerDirectives.transferToInterpreter();
+            resize();
         }
-        byte tag = tags[index];
-        if (tag == FrameSlotKind.Illegal.ordinal()) {
-            return descriptor.getTypeConversion().getDefaultValue();
-        } else if (tag == FrameSlotKind.Boolean.ordinal()) {
+        byte tag = tags[slotIndex];
+        if (tag == FrameSlotKind.Boolean.ordinal()) {
             return getBooleanUnsafe(slot);
+        } else if (tag == FrameSlotKind.Byte.ordinal()) {
+            return getByteUnsafe(slot);
         } else if (tag == FrameSlotKind.Int.ordinal()) {
             return getIntUnsafe(slot);
         } else if (tag == FrameSlotKind.Double.ordinal()) {
@@ -288,14 +296,17 @@
         } else if (tag == FrameSlotKind.Float.ordinal()) {
             return getFloatUnsafe(slot);
         } else {
+            assert tag == FrameSlotKind.Object.ordinal() || tag == FrameSlotKind.Illegal.ordinal();
             return getObjectUnsafe(slot);
         }
     }
 
     private void resize() {
+        int oldSize = tags.length;
         int newSize = descriptor.getSize();
-        if (newSize > tags.length) {
+        if (newSize > oldSize) {
             locals = Arrays.copyOf(locals, newSize);
+            Arrays.fill(locals, oldSize, newSize, descriptor.getTypeConversion().getDefaultValue());
             primitiveLocals = Arrays.copyOf(primitiveLocals, newSize);
             tags = Arrays.copyOf(tags, newSize);
         }
@@ -303,14 +314,11 @@
 
     @Override
     public boolean isInitialized(FrameSlot slot) {
-        try {
-            return tags[slot.getIndex()] != 0;
-        } catch (ArrayIndexOutOfBoundsException ex) {
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
             CompilerDirectives.transferToInterpreter();
-            if (slot.getIndex() >= 0 && slot.getIndex() < descriptor.getSize()) {
-                return false;
-            }
-            throw ex;
+            resize();
         }
+        return tags[slotIndex] != 0;
     }
 }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java	Sun Sep 15 02:39:07 2013 +0200
@@ -214,7 +214,8 @@
     }
 
     private static void verifyGet(FrameWithoutBoxing frame, FrameSlot slot, FrameSlotKind accessType) {
-        if (getTag(frame, slot) != (byte) accessType.ordinal()) {
+        byte tag = getTag(frame, slot);
+        if (accessType == FrameSlotKind.Object ? (tag & 0xfe) != 0 : tag != (byte) accessType.ordinal()) {
             DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.UnreachedCode);
         }
     }
--- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameSlotTypeSpecializationTest.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameSlotTypeSpecializationTest.java	Sun Sep 15 02:39:07 2013 +0200
@@ -116,7 +116,7 @@
                     // fall through
                 }
             }
-            FrameUtil.setObjectSafe(frame, slot, o);
+            frame.setObject(slot, o);
             this.replace(new ObjectAssignLocal(slot, value));
             return null;
         }
@@ -134,11 +134,7 @@
         @Override
         Object execute(VirtualFrame frame) {
             Object o = value.execute(frame);
-            try {
-                frame.setObject(slot, o);
-            } catch (FrameSlotTypeException e) {
-                FrameUtil.setObjectSafe(frame, slot, o);
-            }
+            frame.setObject(slot, o);
             return null;
         }
     }
--- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/ReturnTypeSpecializationTest.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/ReturnTypeSpecializationTest.java	Sun Sep 15 02:39:07 2013 +0200
@@ -120,11 +120,11 @@
                 try {
                     frame.setInt(slot, result);
                 } catch (FrameSlotTypeException e) {
-                    FrameUtil.setObjectSafe(frame, slot, result);
+                    frame.setObject(slot, result);
                     replace(new ObjectAssignLocal(slot, value));
                 }
             } catch (UnexpectedResultException e) {
-                FrameUtil.setObjectSafe(frame, slot, e.getResult());
+                frame.setObject(slot, e.getResult());
                 replace(new ObjectAssignLocal(slot, value));
             }
             return null;
@@ -143,11 +143,7 @@
         @Override
         Object execute(VirtualFrame frame) {
             Object o = value.execute(frame);
-            try {
-                frame.setObject(slot, o);
-            } catch (FrameSlotTypeException e) {
-                FrameUtil.setObjectSafe(frame, slot, o);
-            }
+            frame.setObject(slot, o);
             return null;
         }
     }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java	Sun Sep 15 02:39:07 2013 +0200
@@ -64,7 +64,7 @@
      * @param slot the slot of the local variable
      * @param value the new value of the local variable
      */
-    void setObject(FrameSlot slot, Object value) throws FrameSlotTypeException;
+    void setObject(FrameSlot slot, Object value);
 
     /**
      * Read access to a local variable of type byte.
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotImpl.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotImpl.java	Sun Sep 15 02:39:07 2013 +0200
@@ -51,9 +51,10 @@
     }
 
     public void setKind(final FrameSlotKind kind) {
-        assert this.kind != kind;
-        this.kind = kind;
-        this.descriptor.updateVersion();
+        if (this.kind != kind) {
+            this.kind = kind;
+            this.descriptor.updateVersion();
+        }
     }
 
     @Override
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameUtil.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameUtil.java	Sun Sep 15 02:39:07 2013 +0200
@@ -35,14 +35,7 @@
      * @param value the new value of the local variable
      */
     public static void setObjectSafe(Frame frame, FrameSlot slot, Object value) {
-        if (slot.getKind() != FrameSlotKind.Object) {
-            slot.setKind(FrameSlotKind.Object);
-        }
-        try {
-            frame.setObject(slot, value);
-        } catch (FrameSlotTypeException e) {
-            throw new IllegalStateException();
-        }
+        frame.setObject(slot, value);
     }
 
     /**
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultFrameTypeConversion.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultFrameTypeConversion.java	Sun Sep 15 02:39:07 2013 +0200
@@ -40,7 +40,7 @@
 
     @Override
     public void updateFrameSlot(Frame frame, FrameSlot slot, Object value) {
-        FrameUtil.setObjectSafe(frame, slot, value);
+        frame.setObject(slot, value);
     }
 
     public static DefaultFrameTypeConversion getInstance() {
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java	Sun Sep 15 02:39:07 2013 +0200
@@ -46,7 +46,7 @@
     }
 
     @Override
-    public void setObject(FrameSlot slot, Object value) throws FrameSlotTypeException {
+    public void setObject(FrameSlot slot, Object value) {
         wrapped.setObject(slot, value);
     }
 
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java	Sun Sep 15 02:39:07 2013 +0200
@@ -42,6 +42,7 @@
         this.caller = caller;
         this.arguments = arguments;
         this.locals = new Object[descriptor.getSize()];
+        Arrays.fill(locals, descriptor.getTypeConversion().getDefaultValue());
         this.tags = new byte[descriptor.getSize()];
     }
 
@@ -73,8 +74,8 @@
     }
 
     @Override
-    public void setObject(FrameSlot slot, Object value) throws FrameSlotTypeException {
-        verifySet(slot, FrameSlotKind.Object);
+    public void setObject(FrameSlot slot, Object value) {
+        verifySetObject(slot);
         locals[slot.getIndex()] = value;
     }
 
@@ -157,17 +158,11 @@
 
     @Override
     public Object getValue(FrameSlot slot) {
-        int index = slot.getIndex();
-        if (index >= tags.length) {
-            assert index >= 0 && index < descriptor.getSize();
-            return descriptor.getTypeConversion().getDefaultValue();
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
+            resize();
         }
-        byte tag = tags[index];
-        if (tag == FrameSlotKind.Illegal.ordinal()) {
-            return descriptor.getTypeConversion().getDefaultValue();
-        } else {
-            return locals[index];
-        }
+        return locals[slotIndex];
     }
 
     private void verifySet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException {
@@ -186,45 +181,50 @@
         tags[slotIndex] = (byte) accessKind.ordinal();
     }
 
-    private void verifyGet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException {
-        FrameSlotKind slotKind = slot.getKind();
-        if (slotKind != accessKind) {
-            if (slotKind == FrameSlotKind.Illegal && accessKind == FrameSlotKind.Object) {
-                slot.setKind(FrameSlotKind.Object);
-                this.setObject(slot, descriptor.getTypeConversion().getDefaultValue());
-            } else {
-                throw new FrameSlotTypeException();
-            }
+    private void verifySetObject(FrameSlot slot) {
+        if (slot.getKind() != FrameSlotKind.Object) {
+            slot.setKind(FrameSlotKind.Object);
         }
         int slotIndex = slot.getIndex();
         if (slotIndex >= tags.length) {
             resize();
         }
-        if (tags[slotIndex] != accessKind.ordinal()) {
-            descriptor.getTypeConversion().updateFrameSlot(this, slot, getValue(slot));
-            if (tags[slotIndex] != accessKind.ordinal()) {
-                throw new FrameSlotTypeException();
+        tags[slotIndex] = (byte) FrameSlotKind.Object.ordinal();
+    }
+
+    private void verifyGet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException {
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
+            resize();
+        }
+        byte tag = tags[slotIndex];
+        if (accessKind == FrameSlotKind.Object ? (tag & 0xfe) != 0 : tag != accessKind.ordinal()) {
+            if (slot.getKind() == accessKind || tag == 0) {
+                descriptor.getTypeConversion().updateFrameSlot(this, slot, getValue(slot));
+                if (tags[slotIndex] == accessKind.ordinal()) {
+                    return;
+                }
             }
+            throw new FrameSlotTypeException();
         }
     }
 
     private void resize() {
+        int oldSize = tags.length;
         int newSize = descriptor.getSize();
-        if (newSize > tags.length) {
+        if (newSize > oldSize) {
             locals = Arrays.copyOf(locals, newSize);
+            Arrays.fill(locals, oldSize, newSize, descriptor.getTypeConversion().getDefaultValue());
             tags = Arrays.copyOf(tags, newSize);
         }
     }
 
     @Override
     public boolean isInitialized(FrameSlot slot) {
-        try {
-            return tags[slot.getIndex()] != 0;
-        } catch (ArrayIndexOutOfBoundsException ex) {
-            if (slot.getIndex() >= 0 && slot.getIndex() < descriptor.getSize()) {
-                return false;
-            }
-            throw ex;
+        int slotIndex = slot.getIndex();
+        if (slotIndex >= tags.length) {
+            resize();
         }
+        return tags[slotIndex] != 0;
     }
 }
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadLocalNode.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadLocalNode.java	Sun Sep 15 02:39:07 2013 +0200
@@ -50,7 +50,7 @@
         try {
             return frame.getObject(slot);
         } catch (FrameSlotTypeException e) {
-            throw new RuntimeException("uninitialized variable " + slot.getIdentifier());
+            throw new IllegalStateException();
         }
     }
 
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java	Sat Sep 14 21:18:36 2013 +0200
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java	Sun Sep 15 02:39:07 2013 +0200
@@ -50,11 +50,7 @@
 
     @Specialization
     public Object writeGeneric(VirtualFrame frame, Object right) {
-        try {
-            frame.setObject(slot, right);
-        } catch (FrameSlotTypeException e) {
-            FrameUtil.setObjectSafe(frame, slot, right);
-        }
+        frame.setObject(slot, right);
         return right;
     }