# HG changeset patch # User Christos Kotselidis # Date 1361377780 -3600 # Node ID 9cf5e381df059f23e839dcf23768b5442b219193 # Parent 1567c6cc65610b466650827753e2b8d85b020616 -More Porting diff -r 1567c6cc6561 -r 9cf5e381df05 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 Feb 20 16:15:43 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Feb 20 17:29:40 2013 +0100 @@ -614,8 +614,8 @@ graph.addAfterFixed(memoryWrite, writeBarrier); last = writeBarrier; } else { - WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(memoryWrite.object())); - WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(memoryWrite.object())); + WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(memoryWrite.object(), null, true)); + WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(memoryWrite.object(), memoryWrite.value())); graph.addBeforeFixed(memoryWrite, writeBarrierPre); graph.addAfterFixed(memoryWrite, writeBarrierPost); last = writeBarrierPost; @@ -640,8 +640,8 @@ FieldWriteBarrier writeBarrier = graph.add(new FieldWriteBarrier(cas.object())); graph.addAfterFixed(cas, writeBarrier); } else { - WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(cas.object())); - WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(cas.object())); + WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(cas.object(), cas.expected(), false)); + WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(cas.object(), cas.newValue())); graph.addAfterFixed(cas, writeBarrierPre); graph.addAfterFixed(cas, writeBarrierPost); } @@ -651,8 +651,8 @@ LocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, cas.expected().kind(), cas.displacement(), cas.offset(), graph, false); graph.addAfterFixed(cas, graph.add(new ArrayWriteBarrier(cas.object(), location))); } else { - graph.addBeforeFixed(cas, graph.add(new WriteBarrierPre(cas.object()))); - graph.addAfterFixed(cas, graph.add(new WriteBarrierPost(cas.object()))); + graph.addBeforeFixed(cas, graph.add(new WriteBarrierPre(cas.object(), cas.expected(), false))); + graph.addAfterFixed(cas, graph.add(new WriteBarrierPost(cas.object(), cas.newValue()))); } } } @@ -702,8 +702,8 @@ if (!config.useG1GC) { graph.addAfterFixed(memoryWrite, graph.add(new ArrayWriteBarrier(array, arrayLocation))); } else { - graph.addBeforeFixed(memoryWrite, graph.add(new WriteBarrierPre(array))); - graph.addAfterFixed(memoryWrite, graph.add(new WriteBarrierPost(array))); + graph.addBeforeFixed(memoryWrite, graph.add(new WriteBarrierPre(array, null, true))); + graph.addAfterFixed(memoryWrite, graph.add(new WriteBarrierPost(array, value))); } } } else if (n instanceof UnsafeLoadNode) { @@ -731,8 +731,8 @@ FieldWriteBarrier writeBarrier = graph.add(new FieldWriteBarrier(object)); graph.addAfterFixed(write, writeBarrier); } else { - graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object))); - graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object))); + graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object, null, true))); + graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object, write.value()))); } } else { // This may be an array store so use an array write barrier @@ -740,8 +740,8 @@ ArrayWriteBarrier writeBarrier = graph.add(new ArrayWriteBarrier(object, location)); graph.addAfterFixed(write, writeBarrier); } else { - graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object))); - graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object))); + graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object, null, true))); + graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object, store.value()))); } } } diff -r 1567c6cc6561 -r 9cf5e381df05 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java Wed Feb 20 16:15:43 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java Wed Feb 20 17:29:40 2013 +0100 @@ -28,13 +28,19 @@ public final class WriteBarrierPost extends WriteBarrier implements Lowerable { @Input private ValueNode object; + @Input private ValueNode value; public ValueNode object() { return object; } - public WriteBarrierPost(ValueNode object) { + public ValueNode value() { + return value; + } + + public WriteBarrierPost(ValueNode object, ValueNode value) { this.object = object; + this.value = value; } public void lower(LoweringTool generator) { diff -r 1567c6cc6561 -r 9cf5e381df05 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java Wed Feb 20 16:15:43 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java Wed Feb 20 17:29:40 2013 +0100 @@ -28,13 +28,25 @@ public final class WriteBarrierPre extends WriteBarrier implements Lowerable { @Input private ValueNode object; + @Input private ValueNode previousValue; + private boolean doLoad; public ValueNode object() { return object; } - public WriteBarrierPre(ValueNode object) { + public ValueNode previousValue() { + return previousValue; + } + + public boolean doLoad() { + return doLoad; + } + + public WriteBarrierPre(ValueNode object, ValueNode previousValue, boolean doLoad) { this.object = object; + this.previousValue = previousValue; + this.doLoad = doLoad; } public void lower(LoweringTool generator) { diff -r 1567c6cc6561 -r 9cf5e381df05 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java Wed Feb 20 16:15:43 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java Wed Feb 20 17:29:40 2013 +0100 @@ -27,7 +27,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.*; @@ -40,7 +39,7 @@ public class WriteBarrierSnippets implements SnippetsInterface { @Snippet - public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("previousValue") Word previousValue, @Parameter("load") boolean doLoad) { + public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("previousValue") Word previousValue, @Parameter("doLoad") boolean doLoad) { Word thread = thread(); Pointer oop = Word.fromObject(object); Word markingAddress = thread.add(HotSpotSnippetUtils.g1SATBQueueMarkingOffset()); @@ -86,7 +85,8 @@ base = base.add(Word.unsigned(cardTableStart())); } - if (value != null) { + // if (value != null) { + if (true) { Word xorResult = (((Word) oop.xor(value)).unsignedShiftRight(HotSpotSnippetUtils.logOfHRGrainBytes())); if (xorResult.notEqual(Word.zero())) { if (value.notEqual(Word.zero())) { @@ -157,8 +157,8 @@ super(runtime, assumptions, target, WriteBarrierSnippets.class); serialFieldWriteBarrier = snippet("serialFieldWriteBarrier", Object.class); serialArrayWriteBarrier = snippet("serialArrayWriteBarrier", Object.class); - g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class); - g1PostWriteBarrier = snippet("g1PostWriteBarrier", Object.class); + g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class, Word.class, boolean.class); + g1PostWriteBarrier = snippet("g1PostWriteBarrier", Object.class, Word.class); this.useG1GC = useG1GC; } @@ -185,6 +185,8 @@ Key key = new Key(method); Arguments arguments = new Arguments(); arguments.add("object", writeBarrierPre.object()); + arguments.add("previousValue", writeBarrierPre.previousValue()); + arguments.add("doLoad", writeBarrierPre.doLoad()); SnippetTemplate template = cache.get(key, assumptions); template.instantiate(runtime, writeBarrierPre, DEFAULT_REPLACER, arguments); } @@ -194,6 +196,7 @@ Key key = new Key(method); Arguments arguments = new Arguments(); arguments.add("object", writeBarrierPost.object()); + arguments.add("value", writeBarrierPost.value()); SnippetTemplate template = cache.get(key, assumptions); template.instantiate(runtime, writeBarrierPost, DEFAULT_REPLACER, arguments); }