# HG changeset patch # User Andreas Woess # Date 1379205547 -7200 # Node ID 269e6794e1ec9b5f20378ed992c0b4aa83471447 # Parent 126e20d365636d58d8d5a184a9c57cbaf2e0d8cd Truffle: Frame restructuring. diff -r 126e20d36563 -r 269e6794e1ec 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 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; } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/FrameWithoutBoxingSubstitutions.java --- 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); } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameSlotTypeSpecializationTest.java --- 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; } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/ReturnTypeSpecializationTest.java --- 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; } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java --- 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. diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotImpl.java --- 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 diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameUtil.java --- 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); } /** diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultFrameTypeConversion.java --- 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() { diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java --- 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); } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java --- 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; } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadLocalNode.java --- 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(); } } diff -r 126e20d36563 -r 269e6794e1ec graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java --- 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; }