# HG changeset patch # User Christos Kotselidis # Date 1365447124 -7200 # Node ID 876a449f17abee33b61986e3b91a03eb607b3a1c # Parent 0369103efa145373472c9e1cbb099a7791eafb1f Merge FieldWriteBarrier into ArrayWriteBarrier diff -r 0369103efa14 -r 876a449f17ab 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 Mon Apr 08 16:43:38 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Apr 08 20:52:04 2013 +0200 @@ -573,7 +573,7 @@ FixedWithNextNode first = memoryWrite; if (field.getKind() == Kind.Object && !memoryWrite.value().objectStamp().alwaysNull()) { - FieldWriteBarrier writeBarrier = graph.add(new FieldWriteBarrier(memoryWrite.object())); + ArrayWriteBarrier writeBarrier = graph.add(new ArrayWriteBarrier(memoryWrite.object(), location, false)); graph.addAfterFixed(memoryWrite, writeBarrier); last = writeBarrier; } @@ -592,10 +592,10 @@ ResolvedJavaType type = cas.object().objectStamp().type(); if (type != null && !type.isArray() && !MetaUtil.isJavaLangObject(type)) { // Use a field write barrier since it's not an array store - graph.addAfterFixed(cas, graph.add(new FieldWriteBarrier(cas.object()))); + graph.addAfterFixed(cas, graph.add(new ArrayWriteBarrier(cas.object(), location, false))); } else { // This may be an array store so use an array write barrier - graph.addAfterFixed(cas, graph.add(new ArrayWriteBarrier(cas.object(), location))); + graph.addAfterFixed(cas, graph.add(new ArrayWriteBarrier(cas.object(), location, true))); } } } else if (n instanceof LoadIndexedNode) { @@ -639,7 +639,7 @@ graph.replaceFixedWithFixed(storeIndexed, memoryWrite); if (elementKind == Kind.Object && !value.objectStamp().alwaysNull()) { - graph.addAfterFixed(memoryWrite, graph.add(new ArrayWriteBarrier(array, arrayLocation))); + graph.addAfterFixed(memoryWrite, graph.add(new ArrayWriteBarrier(array, arrayLocation, true))); } } else if (n instanceof UnsafeLoadNode) { UnsafeLoadNode load = (UnsafeLoadNode) n; @@ -662,10 +662,10 @@ // WriteBarrier writeBarrier; if (type != null && !type.isArray() && !MetaUtil.isJavaLangObject(type)) { // Use a field write barrier since it's not an array store - graph.addAfterFixed(write, graph.add(new FieldWriteBarrier(object))); + graph.addAfterFixed(write, graph.add(new ArrayWriteBarrier(object, location, false))); } else { // This may be an array store so use an array write barrier - graph.addAfterFixed(write, graph.add(new ArrayWriteBarrier(object, location))); + graph.addAfterFixed(write, graph.add(new ArrayWriteBarrier(object, location, true))); } } } else if (n instanceof LoadHubNode) { diff -r 0369103efa14 -r 876a449f17ab graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ArrayWriteBarrier.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ArrayWriteBarrier.java Mon Apr 08 16:43:38 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ArrayWriteBarrier.java Mon Apr 08 20:52:04 2013 +0200 @@ -31,6 +31,7 @@ @Input private ValueNode object; @Input private LocationNode location; + private final boolean precise; public ValueNode getObject() { return object; @@ -40,12 +41,18 @@ return location; } - public ArrayWriteBarrier(ValueNode object, LocationNode location) { + public boolean usePrecise() { + return precise; + } + + public ArrayWriteBarrier(ValueNode object, LocationNode location, boolean precise) { super(StampFactory.forVoid()); this.object = object; this.location = location; + this.precise = precise; } + @Override public void lower(LoweringTool generator) { generator.getRuntime().lower(this, generator); } diff -r 0369103efa14 -r 876a449f17ab 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 Mon Apr 08 16:43:38 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java Mon Apr 08 20:52:04 2013 +0200 @@ -30,6 +30,7 @@ import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.replacements.*; +import com.oracle.graal.replacements.Snippet.ConstantParameter; import com.oracle.graal.replacements.Snippet.Parameter; import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; import com.oracle.graal.replacements.SnippetTemplate.Arguments; @@ -54,9 +55,14 @@ } @Snippet - public static void serialArrayWriteBarrier(@Parameter("object") Object obj, @Parameter("location") Object location) { + public static void serialArrayWriteBarrier(@Parameter("object") Object obj, @Parameter("location") Object location, @ConstantParameter("usePrecise") boolean usePrecise) { Object object = FixedValueAnchorNode.getObject(obj); - Pointer oop = Word.fromArray(object, location); + Pointer oop; + if (usePrecise) { + oop = Word.fromArray(object, location); + } else { + oop = Word.fromObject(object); + } Word base = (Word) oop.unsignedShiftRight(cardTableShift()); long startAddress = cardTableStart(); int displacement = 0; @@ -76,12 +82,13 @@ public Templates(CodeCacheProvider runtime, Replacements replacements, TargetDescription target) { super(runtime, replacements, target, WriteBarrierSnippets.class); serialFieldWriteBarrier = snippet("serialFieldWriteBarrier", Object.class); - serialArrayWriteBarrier = snippet("serialArrayWriteBarrier", Object.class, Object.class); + serialArrayWriteBarrier = snippet("serialArrayWriteBarrier", Object.class, Object.class, boolean.class); } public void lower(ArrayWriteBarrier arrayWriteBarrier, @SuppressWarnings("unused") LoweringTool tool) { ResolvedJavaMethod method = serialArrayWriteBarrier; Key key = new Key(method); + key.add("usePrecise", arrayWriteBarrier.usePrecise()); Arguments arguments = new Arguments(); arguments.add("object", arrayWriteBarrier.getObject()); arguments.add("location", arrayWriteBarrier.getLocation());