# HG changeset patch # User Gilles Duboscq # Date 1340804403 -7200 # Node ID f96e7b39e9fe0b0a074f6bdf6969cfdca5cc6731 # Parent 0a249ed5566a94af3e60ac75a11efab96720c03b Be more strict on isInt check in CAS lowering when index is constant Use array write barrier for UnsafeStore if we can't be sure we're not storing to an array diff -r 0a249ed5566a -r f96e7b39e9fe graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/ControlFlowOptimizer.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/ControlFlowOptimizer.java Wed Jun 27 14:15:32 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/ControlFlowOptimizer.java Wed Jun 27 15:40:03 2012 +0200 @@ -27,7 +27,6 @@ import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.lir.*; -import com.oracle.graal.lir.StandardOp.FallThroughOp; import com.oracle.graal.lir.cfg.*; /** diff -r 0a249ed5566a -r f96e7b39e9fe graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jun 27 14:15:32 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jun 27 15:40:03 2012 +0200 @@ -610,7 +610,7 @@ Address address; int displacement = node.displacement(); Value index = operand(node.offset()); - if (isConstant(index) && NumUtil.isInt(asConstant(index).asLong())) { + if (isConstant(index) && NumUtil.isInt(asConstant(index).asLong() + displacement)) { displacement += (int) asConstant(index).asLong(); address = new Address(kind, load(operand(node.object())), displacement); } else { diff -r 0a249ed5566a -r f96e7b39e9fe graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Jun 27 14:15:32 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Jun 27 15:40:03 2012 +0200 @@ -345,12 +345,21 @@ } else if (n instanceof UnsafeStoreNode) { UnsafeStoreNode store = (UnsafeStoreNode) n; IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, store.storeKind(), store.displacement(), store.offset(), graph, false); - WriteNode write = graph.add(new WriteNode(store.object(), store.value(), location)); + ValueNode object = store.object(); + WriteNode write = graph.add(new WriteNode(object, store.value(), location)); write.setStateAfter(store.stateAfter()); graph.replaceFixedWithFixed(store, write); if (write.value().kind() == Kind.Object && !write.value().isNullConstant()) { - FieldWriteBarrier barrier = graph.add(new FieldWriteBarrier(write.object())); - graph.addBeforeFixed(write, barrier); + ResolvedJavaType type = object.objectStamp().type(); + WriteBarrier writeBarrier; + if (type != null && !type.isArrayClass() && type.toJava() != Object.class) { + // Use a field write barrier since it's not an array store + writeBarrier = graph.add(new FieldWriteBarrier(object)); + } else { + // This may be an array store so use an array write barrier + writeBarrier = graph.add(new ArrayWriteBarrier(object, location)); + } + graph.addAfterFixed(write, writeBarrier); } } else if (n instanceof ReadHubNode) { ReadHubNode objectClassNode = (ReadHubNode) n; diff -r 0a249ed5566a -r f96e7b39e9fe graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Wed Jun 27 14:15:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Wed Jun 27 15:40:03 2012 +0200 @@ -150,6 +150,7 @@ } public boolean verifyStamp(Class stampClass) { + assert stamp != null; assert stampClass.isInstance(stamp) : this + " (" + GraphUtil.approxSourceLocation(this) + ") has unexpected stamp type: expected " + stampClass.getName() + ", got " + stamp.getClass().getName(); return true; diff -r 0a249ed5566a -r f96e7b39e9fe 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 Wed Jun 27 14:15:32 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Jun 27 15:40:03 2012 +0200 @@ -85,6 +85,13 @@ } @Override + public boolean verify() { + assertTrue(storeKind != null, "UnsafeStoreNode must have a store kind"); + assertTrue(object != null, "UnsafeStoreNode should have an object"); + return super.verify(); + } + + @Override public void lower(CiLoweringTool tool) { tool.getRuntime().lower(this, tool); }