# HG changeset patch # User Christos Kotselidis # Date 1375446414 -7200 # Node ID a03d31fa01d97488e5ee689247e72fc2fafb5765 # Parent 3a9f3ec8efc6e3989a3d36f3a0c2bceb31e7172d Writes with always null stamps omit only post barriers diff -r 3a9f3ec8efc6 -r a03d31fa01d9 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 Fri Aug 02 14:10:04 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Aug 02 14:26:54 2013 +0200 @@ -885,7 +885,7 @@ private static BarrierType getFieldStoreBarrierType(StoreFieldNode storeField) { BarrierType barrierType = BarrierType.NONE; - if (storeField.field().getKind() == Kind.Object && !storeField.value().objectStamp().alwaysNull()) { + if (storeField.field().getKind() == Kind.Object) { barrierType = BarrierType.IMPRECISE; } return barrierType; @@ -893,7 +893,7 @@ private static BarrierType getArrayStoreBarrierType(StoreIndexedNode store) { BarrierType barrierType = BarrierType.NONE; - if (store.elementKind() == Kind.Object && !store.value().objectStamp().alwaysNull()) { + if (store.elementKind() == Kind.Object) { barrierType = BarrierType.PRECISE; } return barrierType; @@ -901,7 +901,7 @@ private static BarrierType getUnsafeStoreBarrierType(UnsafeStoreNode store) { BarrierType barrierType = BarrierType.NONE; - if (store.value().kind() == Kind.Object && !store.value().objectStamp().alwaysNull()) { + if (store.value().kind() == Kind.Object) { ResolvedJavaType type = store.object().objectStamp().type(); if (type != null && type.isArray()) { barrierType = BarrierType.PRECISE; @@ -914,7 +914,7 @@ private static BarrierType getCompareAndSwapBarrier(CompareAndSwapNode cas) { BarrierType barrierType = BarrierType.NONE; - if (cas.expected().kind() == Kind.Object && !cas.newValue().objectStamp().alwaysNull()) { + if (cas.expected().kind() == Kind.Object) { ResolvedJavaType type = cas.object().objectStamp().type(); if (type != null && type.isArray()) { barrierType = BarrierType.PRECISE; diff -r 3a9f3ec8efc6 -r a03d31fa01d9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java Fri Aug 02 14:10:04 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java Fri Aug 02 14:26:54 2013 +0200 @@ -75,7 +75,7 @@ } graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.value(), node.location(), true))); } else { - graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.location(), true))); + graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.value(), node.location(), true))); } } else if (barrierType == BarrierType.IMPRECISE) { if (useG1GC()) { @@ -85,7 +85,7 @@ graph.addBeforeFixed(node, preBarrier); graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.value(), node.location(), false))); } else { - graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.location(), false))); + graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.value(), node.location(), false))); } } else { assert barrierType == BarrierType.NONE; @@ -100,14 +100,14 @@ graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.getExpectedValue(), node.getLocation(), false, false))); graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), true))); } else { - graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getLocation(), true))); + graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), true))); } } else if (barrierType == BarrierType.IMPRECISE) { if (useG1GC()) { graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.getExpectedValue(), node.getLocation(), false, false))); graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), false))); } else { - graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getLocation(), false))); + graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), false))); } } else { assert barrierType == BarrierType.NONE; diff -r 3a9f3ec8efc6 -r a03d31fa01d9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java Fri Aug 02 14:10:04 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java Fri Aug 02 14:26:54 2013 +0200 @@ -52,7 +52,11 @@ private static final SnippetCounter serialArrayWriteBarrierCounter = new SnippetCounter(countersWriteBarriers, "serialArrayWriteBarrier", "Number of Serial Array Write Barriers"); @Snippet - public static void serialWriteBarrier(Object object, Object location, @ConstantParameter boolean usePrecise) { + public static void serialWriteBarrier(Object object, Object location, @ConstantParameter boolean usePrecise, @ConstantParameter boolean alwaysNull) { + // No barriers are added if we are always storing a null. + if (alwaysNull) { + return; + } Object fixedObject = FixedValueAnchorNode.getObject(object); Pointer oop; if (usePrecise) { @@ -146,7 +150,11 @@ } @Snippet - public static void g1PostWriteBarrier(Object object, Object value, Object location, @ConstantParameter boolean usePrecise, @ConstantParameter boolean trace) { + public static void g1PostWriteBarrier(Object object, Object value, Object location, @ConstantParameter boolean usePrecise, @ConstantParameter boolean alwaysNull, @ConstantParameter boolean trace) { + // No barriers are added if we are always storing a null. + if (alwaysNull) { + return; + } Word thread = thread(); Object fixedObject = FixedValueAnchorNode.getObject(object); Object fixedValue = FixedValueAnchorNode.getObject(value); @@ -313,6 +321,7 @@ args.add("object", writeBarrier.getObject()); args.add("location", writeBarrier.getLocation()); args.addConst("usePrecise", writeBarrier.usePrecise()); + args.addConst("alwaysNull", writeBarrier.getValue().objectStamp().alwaysNull()); template(args).instantiate(runtime, writeBarrier, DEFAULT_REPLACER, args); } @@ -352,6 +361,7 @@ args.add("value", writeBarrierPost.getValue()); args.add("location", writeBarrierPost.getLocation()); args.addConst("usePrecise", writeBarrierPost.usePrecise()); + args.addConst("alwaysNull", writeBarrierPost.getValue().objectStamp().alwaysNull()); args.addConst("trace", traceBarrier()); template(args).instantiate(runtime, writeBarrierPost, DEFAULT_REPLACER, args); } diff -r 3a9f3ec8efc6 -r a03d31fa01d9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SerialWriteBarrier.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SerialWriteBarrier.java Fri Aug 02 14:10:04 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SerialWriteBarrier.java Fri Aug 02 14:26:54 2013 +0200 @@ -26,7 +26,14 @@ public class SerialWriteBarrier extends WriteBarrier { - public SerialWriteBarrier(ValueNode object, LocationNode location, boolean precise) { + @Input private ValueNode value; + + public ValueNode getValue() { + return value; + } + + public SerialWriteBarrier(ValueNode object, ValueNode value, LocationNode location, boolean precise) { super(object, location, precise); + this.value = value; } }