Mercurial > hg > truffle
diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java @ 7049:ccade022ec83
virtualization of unsafeload and unsafestore
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 27 Nov 2012 17:32:40 +0100 |
parents | 536dbb4dd212 |
children | 05ce1defa4f9 |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Tue Nov 27 17:29:42 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Tue Nov 27 17:32:40 2012 +0100 @@ -26,12 +26,13 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.virtual.*; /** * Store of a value at a location specified as an offset relative to an object. * No null check is performed before the store. */ -public class UnsafeStoreNode extends FixedWithNextNode implements StateSplit, Lowerable { +public class UnsafeStoreNode extends FixedWithNextNode implements StateSplit, Lowerable, Virtualizable { @Input private ValueNode object; @Input private ValueNode offset; @@ -96,6 +97,21 @@ tool.getRuntime().lower(this, tool); } + @Override + public void virtualize(VirtualizerTool tool) { + VirtualObjectNode virtual = tool.getVirtualState(object()); + if (virtual != null) { + ValueNode indexValue = tool.getReplacedValue(offset()); + if (indexValue.isConstant()) { + int fieldIndex = virtual.fieldIndexForOffset(indexValue.asConstant().asLong()); + if (fieldIndex != -1) { + tool.setVirtualEntry(virtual, fieldIndex, value()); + tool.delete(); + } + } + } + } + // specialized on value type until boxing/unboxing is sorted out in intrinsification @NodeIntrinsic public static native void store(Object object, @ConstantNodeParameter int displacement, long offset, Object value, @ConstantNodeParameter Kind kind);