Mercurial > hg > graal-jvmci-8
changeset 21996:d333f1cf2c42
Re-enable imprecise write barriers on object access.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Wed, 17 Jun 2015 16:19:35 +0200 |
parents | 922a0438914b |
children | 5576d06db82a |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java |
diffstat | 1 files changed, 33 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java Wed Jun 17 15:42:27 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/WriteBarrierSnippets.java Wed Jun 17 16:19:35 2015 +0200 @@ -69,13 +69,11 @@ public static final LocationIdentity GC_LOG_LOCATION = NamedLocationIdentity.mutable("GC-Log"); public static final LocationIdentity GC_INDEX_LOCATION = NamedLocationIdentity.mutable("GC-Index"); - @Snippet - public static void serialWriteBarrier(Address address) { - Pointer oop = Word.fromAddress(address); + private static void serialWriteBarrier(Pointer ptr) { serialWriteBarrierCounter.inc(); int cardTableShift = (isImmutableCode() && generatePIC()) ? CardTableShiftNode.cardTableShift() : cardTableShift(); long cardTableAddress = (isImmutableCode() && generatePIC()) ? CardTableAddressNode.cardTableAddress() : cardTableStart(); - Word base = Word.fromWordBase(oop.unsignedShiftRight(cardTableShift)); + Word base = Word.fromWordBase(ptr.unsignedShiftRight(cardTableShift)); long startAddress = cardTableAddress; int displacement = 0; if (((int) startAddress) == startAddress) { @@ -87,6 +85,16 @@ } @Snippet + public static void serialImpreciseWriteBarrier(Object object) { + serialWriteBarrier(Word.fromObject(object)); + } + + @Snippet + public static void serialPreciseWriteBarrier(Address address) { + serialWriteBarrier(Word.fromAddress(address)); + } + + @Snippet public static void serialArrayRangeWriteBarrier(Object object, int startIndex, int length) { if (length == 0) { return; @@ -161,13 +169,19 @@ } @Snippet - public static void g1PostWriteBarrier(Address address, Object object, Object value, @ConstantParameter Register threadRegister, @ConstantParameter boolean trace) { + public static void g1PostWriteBarrier(Address address, Object object, Object value, @ConstantParameter boolean usePrecise, @ConstantParameter Register threadRegister, + @ConstantParameter boolean trace) { Word thread = registerAsWord(threadRegister); Object fixedValue = FixedValueAnchorNode.getObject(value); verifyOop(object); verifyOop(fixedValue); validateObject(object, fixedValue); - Word oop = Word.fromWordBase(Word.fromAddress(address)); + Word oop; + if (usePrecise) { + oop = Word.fromWordBase(Word.fromAddress(address)); + } else { + oop = Word.fromWordBase(Word.fromObject(object)); + } int gcCycle = 0; if (trace) { gcCycle = (int) Word.unsigned(HotSpotReplacementsUtil.gcTotalCollectionsAddress()).readLong(0); @@ -322,7 +336,8 @@ public static class Templates extends AbstractTemplates { - private final SnippetInfo serialWriteBarrier = snippet(WriteBarrierSnippets.class, "serialWriteBarrier", GC_CARD_LOCATION); + private final SnippetInfo serialImpreciseWriteBarrier = snippet(WriteBarrierSnippets.class, "serialImpreciseWriteBarrier", GC_CARD_LOCATION); + private final SnippetInfo serialPreciseWriteBarrier = snippet(WriteBarrierSnippets.class, "serialPreciseWriteBarrier", GC_CARD_LOCATION); private final SnippetInfo serialArrayRangeWriteBarrier = snippet(WriteBarrierSnippets.class, "serialArrayRangeWriteBarrier"); private final SnippetInfo g1PreWriteBarrier = snippet(WriteBarrierSnippets.class, "g1PreWriteBarrier", GC_INDEX_LOCATION, GC_LOG_LOCATION); private final SnippetInfo g1ReferentReadBarrier = snippet(WriteBarrierSnippets.class, "g1PreWriteBarrier", GC_INDEX_LOCATION, GC_LOG_LOCATION); @@ -338,8 +353,15 @@ } public void lower(SerialWriteBarrier writeBarrier, LoweringTool tool) { - Arguments args = new Arguments(serialWriteBarrier, writeBarrier.graph().getGuardsStage(), tool.getLoweringStage()); - args.add("address", writeBarrier.getAddress()); + Arguments args; + if (writeBarrier.usePrecise()) { + args = new Arguments(serialPreciseWriteBarrier, writeBarrier.graph().getGuardsStage(), tool.getLoweringStage()); + args.add("address", writeBarrier.getAddress()); + } else { + args = new Arguments(serialImpreciseWriteBarrier, writeBarrier.graph().getGuardsStage(), tool.getLoweringStage()); + OffsetAddressNode address = (OffsetAddressNode) writeBarrier.getAddress(); + args.add("object", address.getBase()); + } template(args).instantiate(providers.getMetaAccess(), writeBarrier, DEFAULT_REPLACER, args); } @@ -411,6 +433,7 @@ if (address instanceof OffsetAddressNode) { args.add("object", ((OffsetAddressNode) address).getBase()); } else { + assert writeBarrierPost.usePrecise() : "found imprecise barrier that's not an object access " + writeBarrierPost; args.add("object", null); } @@ -421,6 +444,7 @@ } args.add("value", value); + args.addConst("usePrecise", writeBarrierPost.usePrecise()); args.addConst("threadRegister", registers.getThreadRegister()); args.addConst("trace", traceBarrier()); template(args).instantiate(providers.getMetaAccess(), writeBarrierPost, DEFAULT_REPLACER, args);