# HG changeset patch # User Thomas Wuerthinger # Date 1373225425 -7200 # Node ID e7c2a0aa1fffd7362c41827555f6877d93410939 # Parent a71fa3b8553b0625498d2492b57b00770c62252c Fix unsafe load/store canonicalization to fields to also check accessKind. Simplify partial evaluator canonicalizer. diff -r a71fa3b8553b -r e7c2a0aa1fff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Sun Jul 07 21:01:31 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Sun Jul 07 21:30:25 2013 +0200 @@ -86,7 +86,7 @@ ResolvedJavaType receiverType = receiverStamp.type(); if (receiverStamp.nonNull() && receiverType != null) { ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement()); - if (field != null) { + if (field != null && field.getKind() == this.accessKind()) { return this.graph().add(new LoadFieldNode(object(), field)); } } diff -r a71fa3b8553b -r e7c2a0aa1fff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Sun Jul 07 21:01:31 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Sun Jul 07 21:30:25 2013 +0200 @@ -111,7 +111,7 @@ if (receiverStamp.nonNull()) { ResolvedJavaType receiverType = receiverStamp.type(); ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement()); - if (field != null) { + if (field != null && field.getKind() == this.accessKind()) { StoreFieldNode storeFieldNode = graph().add(new StoreFieldNode(object(), field, value())); storeFieldNode.setStateAfter(stateAfter()); return storeFieldNode; diff -r a71fa3b8553b -r e7c2a0aa1fff graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java Sun Jul 07 21:01:31 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java Sun Jul 07 21:30:25 2013 +0200 @@ -68,41 +68,8 @@ return ConstantNode.forObject(value, metaAccessProvider, node.graph()); } } - } else if (node instanceof UnsafeLoadNode) { - UnsafeLoadNode unsafeLoadNode = (UnsafeLoadNode) node; - if (unsafeLoadNode.offset().isConstant()) { - long offset = unsafeLoadNode.offset().asConstant().asLong() + unsafeLoadNode.displacement(); - ResolvedJavaType type = unsafeLoadNode.object().objectStamp().type(); - ResolvedJavaField field = recursiveFindFieldWithOffset(type, offset); - if (field != null) { - return node.graph().add(new LoadFieldNode(unsafeLoadNode.object(), field)); - } - } - } else if (node instanceof UnsafeStoreNode) { - UnsafeStoreNode unsafeStoreNode = (UnsafeStoreNode) node; - if (unsafeStoreNode.offset().isConstant()) { - long offset = unsafeStoreNode.offset().asConstant().asLong() + unsafeStoreNode.displacement(); - ResolvedJavaType type = unsafeStoreNode.object().objectStamp().type(); - ResolvedJavaField field = recursiveFindFieldWithOffset(type, offset); - if (field != null) { - StoreFieldNode storeFieldNode = node.graph().add(new StoreFieldNode(unsafeStoreNode.object(), field, unsafeStoreNode.value())); - storeFieldNode.setStateAfter(unsafeStoreNode.stateAfter()); - return storeFieldNode; - } - } } return node; } - - private ResolvedJavaField recursiveFindFieldWithOffset(ResolvedJavaType type, long offset) { - if (type != null) { - ResolvedJavaField field = type.findInstanceFieldWithOffset(offset); - if (field != null) { - return field; - } - return recursiveFindFieldWithOffset(type.getSuperclass(), offset); - } - return null; - } }