changeset 8499:96a337d307bd

-More progress in G1 WBs
author Christos Kotselidis <christos.kotselidis@oracle.com>
date Mon, 04 Mar 2013 16:46:37 +0100
parents c158d128fae9
children 992f62c457b0
files graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeArrayNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeObjectNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java src/cpu/x86/vm/c1_Runtime1_x86.cpp src/cpu/x86/vm/graalRuntime_x86.cpp src/share/vm/gc_implementation/g1/g1_globals.hpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/graal/graalRuntime.cpp src/share/vm/graal/graalRuntime.hpp src/share/vm/memory/cardTableModRefBS.hpp src/share/vm/opto/graphKit.cpp src/share/vm/prims/jni.cpp src/share/vm/prims/unsafe.cpp src/share/vm/utilities/debug.hpp
diffstat 19 files changed, 124 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java	Mon Mar 04 16:46:37 2013 +0100
@@ -38,6 +38,7 @@
 import static com.oracle.graal.hotspot.nodes.VerifyOopStubCall.*;
 import static com.oracle.graal.hotspot.nodes.WriteBarrierPreStubCall.*;
 import static com.oracle.graal.hotspot.nodes.WriteBarrierPostStubCall.*;
+import static com.oracle.graal.hotspot.nodes.VerOopStubCall.*;
 import static com.oracle.graal.hotspot.snippets.AESCryptSubstitutions.DecryptBlockStubCall.*;
 import static com.oracle.graal.hotspot.snippets.AESCryptSubstitutions.EncryptBlockStubCall.*;
 import static com.oracle.graal.hotspot.snippets.CipherBlockChainingSubstitutions.DecryptAESCryptStubCall.*;
@@ -93,6 +94,11 @@
                 /*        temps */ null,
                 /*          ret */ ret(Kind.Void),
                 /* arg0: object */ javaCallingConvention(Kind.Object));
+       
+       addRuntimeCall(VEROOPCALL, config.verOopStub,
+                       /*        temps */ null,
+                       /*          ret */ ret(Kind.Void),
+                       /* arg0: object */ javaCallingConvention(Kind.Object));
 
        addRuntimeCall(WBPOSTCALL, config.wbPostCallStub,
                 /*        temps */ null,
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Mon Mar 04 16:46:37 2013 +0100
@@ -328,6 +328,7 @@
     public long monitorExitStub;
     public long wbPreCallStub;
     public long wbPostCallStub;
+    public long verOopStub;
     public long verifyOopStub;
     public long vmErrorStub;
     public long deoptimizeStub;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeArrayNode.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeArrayNode.java	Mon Mar 04 16:46:37 2013 +0100
@@ -23,6 +23,7 @@
 package com.oracle.graal.hotspot.nodes;
 
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.hotspot.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
@@ -72,7 +73,7 @@
     }
 
     public boolean fillContents() {
-        return fillContents;
+        return HotSpotGraalRuntime.getInstance().getConfig().useG1GC ? true : fillContents;
     }
 
     public boolean locked() {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeObjectNode.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeObjectNode.java	Mon Mar 04 16:46:37 2013 +0100
@@ -23,6 +23,7 @@
 package com.oracle.graal.hotspot.nodes;
 
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.hotspot.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
@@ -56,7 +57,7 @@
     }
 
     public boolean fillContents() {
-        return fillContents;
+        return HotSpotGraalRuntime.getInstance().getConfig().useG1GC ? true : fillContents;
     }
 
     public boolean locked() {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java	Mon Mar 04 16:46:37 2013 +0100
@@ -25,8 +25,9 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.type.*;
 
-public final class WriteBarrierPost extends WriteBarrier implements Lowerable {
+public final class WriteBarrierPost extends FixedWithNextNode implements Lowerable {
 
     @Input private ValueNode object;
     @Input private ValueNode value;
@@ -45,6 +46,7 @@
     }
 
     public WriteBarrierPost(ValueNode object, ValueNode value, LocationNode location) {
+        super(StampFactory.forVoid());
         this.object = object;
         this.value = value;
         this.location = location;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java	Mon Mar 04 16:46:37 2013 +0100
@@ -25,8 +25,9 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.type.*;
 
-public final class WriteBarrierPre extends WriteBarrier implements Lowerable {
+public final class WriteBarrierPre extends FixedWithNextNode implements Lowerable {
 
     @Input private ValueNode object;
     @Input private LocationNode location;
@@ -46,6 +47,7 @@
     }
 
     public WriteBarrierPre(ValueNode object, LocationNode location, boolean doLoad) {
+        super(StampFactory.forVoid());
         this.object = object;
         this.doLoad = doLoad;
         this.location = location;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java	Mon Mar 04 16:46:37 2013 +0100
@@ -42,8 +42,9 @@
     public static final Descriptor JAVA_TIME_MILLIS = new Descriptor("javaTimeMillis", false, long.class);
     public static final Descriptor JAVA_TIME_NANOS = new Descriptor("javaTimeNanos", false, long.class);
 
-    @MacroSubstitution(macro = ArrayCopyNode.class)
-    public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
+    // @MacroSubstitution(macro = ArrayCopyNode.class)
+    // public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int
+// length);
 
     @MethodSubstitution
     public static long currentTimeMillis() {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java	Thu Feb 28 17:39:48 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java	Mon Mar 04 16:46:37 2013 +0100
@@ -55,24 +55,22 @@
     }
 
     @Snippet
-    public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("location") Object location, @ConstantParameter("doLoad") boolean doLoad, @ConstantParameter("kind") int kind,
-                    @Parameter("fieldName") String fn) {
+    public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("location") Object location, @ConstantParameter("doLoad") boolean doLoad) {
         Word thread = thread();
+
         trace(WriteBarrierSnippets.TRACE, "---------------G1 PRE Enter: %lu\n", Word.unsigned(g1PreCounter.value()));
         Pointer oop = Word.fromObject(object);
         Pointer field = Word.fromArray(object, location);
         Pointer previousOop = field.readWord(0);
 
+        VerOopStubCall.call(oop);
+
         byte markingValue = thread.readByte(HotSpotSnippetUtils.g1SATBQueueMarkingOffset());
 
         Word bufferAddress = thread.readWord(HotSpotSnippetUtils.g1SATBQueueBufferOffset());
         Word indexAddress = thread.add(HotSpotSnippetUtils.g1SATBQueueIndexOffset());
         Word indexValue = thread.readWord(HotSpotSnippetUtils.g1SATBQueueIndexOffset());
 
-        Log.print(fn);
-        traceObject(WriteBarrierSnippets.TRACE, "In PRE WB", object);
-        // traceObject(WriteBarrierSnippets.TRACE, "WriteField" + fn, object);
-        trace(WriteBarrierSnippets.TRACE, "      G1 PRE KIND: %d\n", Word.signed(kind));
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE thread address: 0x%16lx\n", thread);
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE oop: 0x%16lx\n", oop);
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE field: 0x%16lx\n", field);
@@ -81,7 +79,6 @@
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE QueueBufferOffset: 0x%016lx\n", Word.signed(HotSpotSnippetUtils.g1SATBQueueBufferOffset()));
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE QueueIndexOffset: 0x%016lx\n", Word.signed(HotSpotSnippetUtils.g1SATBQueueIndexOffset()));
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE markingValue: 0x%016lx\n", Word.signed((int) markingValue));
-
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE bufferAddress: 0x%016lx\n", bufferAddress);
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE indexAddress: 0x%016lx\n", indexAddress);
         trace(WriteBarrierSnippets.TRACE, "      G1 PRE indexValue: 0x%016lx\n", indexValue);// in
@@ -95,9 +92,14 @@
                 if (indexValue.notEqual(Word.zero())) {
                     Word nextIndex = indexValue.subtract(HotSpotSnippetUtils.wordSize());
                     Word logAddress = bufferAddress.add(nextIndex);
+                    trace(WriteBarrierSnippets.TRACE, "      G1 PRE logAddress: 0x%016lx\n", logAddress);
+
                     logAddress.writeWord(0, previousOop);
                     indexAddress.writeWord(0, nextIndex);
-                    trace(WriteBarrierSnippets.TRACE, "      G1 PRE nextIndexindex: 0x%016lx\n", nextIndex);
+
+                    trace(WriteBarrierSnippets.TRACE, "      G1 PRE nextIndex: 0x%016lx\n", indexAddress.readWord(0));
+                    trace(WriteBarrierSnippets.TRACE, "      G1 PRE writtenLogValue: 0x%016lx\n", logAddress.readWord(0));
+
                 } else {
                     WriteBarrierPreStubCall.call(previousOop);
                 }
@@ -113,11 +115,12 @@
     public static void g1PostWriteBarrier(@Parameter("object") Object object, @Parameter("value") Object value, @Parameter("location") Object location) {
         Word thread = thread();
         trace(WriteBarrierSnippets.TRACE, "---------------G1 POST Enter: %lu\n", Word.unsigned(g1PostCounter.value()));
-
         Pointer oop = Word.fromObject(object);
         Pointer field = Word.fromArray(object, location);
         Pointer writtenValue = Word.fromObject(value);
 
+        VerOopStubCall.call(oop);
+
         Word bufferAddress = thread.readWord(HotSpotSnippetUtils.g1CardQueueBufferOffset());
         Word indexAddress = thread.add(HotSpotSnippetUtils.g1CardQueueIndexOffset());
         Word indexValue = thread.readWord(HotSpotSnippetUtils.g1CardQueueIndexOffset());
@@ -152,7 +155,6 @@
 
         if (xorResult.notEqual(Word.zero())) {
             if (writtenValue.notEqual(Word.zero())) {
-                // Word cardValue = base.readWord(displacement);
                 byte cardByte = cardAddress.readByte(0);
                 trace(WriteBarrierSnippets.TRACE, "     G1 POST cardAddress: 0x%016lx\n", cardAddress);
                 trace(WriteBarrierSnippets.TRACE, "     G1 POST cardValue:  %d\n", Word.signed(cardByte));
@@ -177,7 +179,6 @@
         // }
         trace(WriteBarrierSnippets.TRACE, "---------------G1 POST EXIT: %lu\n", Word.unsigned(g1PostCounter.value()));
         g1PostCounter.inc();
-
     }
 
     private static void trace(boolean enabled, String format, WordBase value) {
@@ -188,8 +189,6 @@
 
     @Snippet
     public static void serialFieldWriteBarrier(@Parameter("object") Object object) {
-        assert true;
-        verifyOop(object);
         Pointer oop = Word.fromObject(object);
         Word base = (Word) oop.unsignedShiftRight(cardTableShift());
         long startAddress = cardTableStart();
@@ -204,8 +203,6 @@
 
     @Snippet
     public static void serialArrayWriteBarrier(@Parameter("object") Object object, @Parameter("location") Object location) {
-        assert true;
-
         Pointer oop = Word.fromArray(object, location);
         Word base = (Word) oop.unsignedShiftRight(cardTableShift());
         long startAddress = cardTableStart();
@@ -230,12 +227,10 @@
             super(runtime, assumptions, target, WriteBarrierSnippets.class);
             serialFieldWriteBarrier = snippet("serialFieldWriteBarrier", Object.class);
             serialArrayWriteBarrier = snippet("serialArrayWriteBarrier", Object.class, Object.class);
-            g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class, Object.class, boolean.class, int.class, String.class);
+            g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class, Object.class, boolean.class);
             g1PostWriteBarrier = snippet("g1PostWriteBarrier", Object.class, Object.class, Object.class);
             this.useG1GC = useG1GC;
             System.out.println("  useG1GC? " + (useG1GC ? "true" : "false"));
-            System.out.println("logHRBytes " + HotSpotSnippetUtils.logOfHRGrainBytes());
-            System.out.println("wordsize " + HotSpotSnippetUtils.wordSize());
         }
 
         public void lower(ArrayWriteBarrier arrayWriteBarrier, @SuppressWarnings("unused") LoweringTool tool) {
@@ -261,12 +256,10 @@
             ResolvedJavaMethod method = g1PreWriteBarrier;
             Key key = new Key(method);
             key.add("doLoad", writeBarrierPre.doLoad());
-            key.add("kind", writeBarrierPre.location().getValueKind().ordinal());
 
             Arguments arguments = new Arguments();
             arguments.add("object", writeBarrierPre.object());
             arguments.add("location", writeBarrierPre.location());
-            arguments.add("fieldName", writeBarrierPre.getName());
 
             SnippetTemplate template = cache.get(key, assumptions);
             template.instantiate(runtime, writeBarrierPre, DEFAULT_REPLACER, arguments);
--- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -1745,6 +1745,7 @@
         __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
 #endif
 
+        tty->print_cr("Intepreter WB");
         __ cmpb(Address(card_addr, 0), 0);
         __ jcc(Assembler::equal, done);
 
--- a/src/cpu/x86/vm/graalRuntime_x86.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/cpu/x86/vm/graalRuntime_x86.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -1195,17 +1195,17 @@
    case graal_wb_pre_call_id: {
       Register obj = j_rarg0;
       {
-       // GraalStubFrame f(sasm, "graal_wb_pre_call", dont_gc_arguments);
-        //OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
+        GraalStubFrame f(sasm, "graal_wb_pre_call", dont_gc_arguments);
+        OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
 
         // note: really a leaf routine but must setup last java sp
         //       => use call_RT for now (speed can be improved by
         //       doing last java sp setup manually)
         int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_wb_pre_call), obj);
 
-        //oop_maps = new OopMapSet();
-        //oop_maps->add_gc_map(call_offset, map);
-        //restore_live_registers(sasm, save_fpu_registers);
+        oop_maps = new OopMapSet();
+        oop_maps->add_gc_map(call_offset, map);
+        restore_live_registers(sasm, save_fpu_registers);
       }
       __ ret(0);
       break;
@@ -1213,21 +1213,39 @@
    case graal_wb_post_call_id: {
       Register obj = j_rarg0;
       {
-       // GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments);
-        //OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
+        GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments);
+        OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
 
         // note: really a leaf routine but must setup last java sp
         //       => use call_RT for now (speed can be improved by
         //       doing last java sp setup manually)
         int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_wb_post_call), obj);
 
-        //oop_maps = new OopMapSet();
-        //oop_maps->add_gc_map(call_offset, map);
-       // restore_live_registers(sasm, save_fpu_registers);
+        oop_maps = new OopMapSet();
+        oop_maps->add_gc_map(call_offset, map);
+       restore_live_registers(sasm, save_fpu_registers);
       }
       __ ret(0);
       break;
    }
+   case graal_ver_oop_id: {
+         Register obj = j_rarg0;
+         {
+           GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments);
+           OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
+
+           // note: really a leaf routine but must setup last java sp
+           //       => use call_RT for now (speed can be improved by
+           //       doing last java sp setup manually)
+           int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_ver_oop), obj);
+
+           oop_maps = new OopMapSet();
+           oop_maps->add_gc_map(call_offset, map);
+           restore_live_registers(sasm, save_fpu_registers);
+         }
+         __ ret(0);
+         break;
+      }
    case graal_identity_hash_code_id: {
       Register obj = j_rarg0; // Incoming
       __ set_info("identity_hash_code", dont_gc_arguments);
--- a/src/share/vm/gc_implementation/g1/g1_globals.hpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/gc_implementation/g1/g1_globals.hpp	Mon Mar 04 16:46:37 2013 +0100
@@ -41,10 +41,10 @@
   develop(intx, G1MarkingVerboseLevel, 0,                                   \
           "Level (0-4) of verboseness of the marking code")                 \
                                                                             \
-  develop(bool, G1PrintReachableAtInitialMark, false,                       \
+  develop(bool, G1PrintReachableAtInitialMark, true,                       \
           "Reachable object dump at the initial mark pause")                \
                                                                             \
-  develop(bool, G1VerifyDuringGCPrintReachable, false,                      \
+  develop(bool, G1VerifyDuringGCPrintReachable, true,                      \
           "If conc mark verification fails, dump reachable objects")        \
                                                                             \
   develop(ccstr, G1PrintReachableBaseFile, NULL,                            \
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -723,6 +723,7 @@
   set_long("monitorExitStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_monitorexit_id)));
   set_long("wbPreCallStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_wb_pre_call_id)));
   set_long("wbPostCallStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_wb_post_call_id)));
+  set_long("verOopStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_ver_oop_id)));
   set_long("verifyOopStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_verify_oop_id)));
   set_long("vmErrorStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_vm_error_id)));
   set_long("deoptimizeStub", VmIds::addStub(SharedRuntime::deopt_blob()->uncommon_trap()));
--- a/src/share/vm/graal/graalRuntime.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/graal/graalRuntime.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -29,7 +29,7 @@
 #include "prims/jvm.h"
 #include "runtime/biasedLocking.hpp"
 #include "runtime/interfaceSupport.hpp"
-
+#include "utilities/debug.hpp"
 // Implementation of GraalStubAssembler
 
 GraalStubAssembler::GraalStubAssembler(CodeBuffer* code, const char * name, int stub_id) : MacroAssembler(code) {
@@ -483,14 +483,32 @@
   }
 JRT_END
 
+static const bool TRACE_WB=true;
+
 JRT_LEAF(void, GraalRuntime::graal_wb_pre_call(JavaThread* thread, oopDesc* obj))
-    tty->print_cr("HELLO PRE WRITE BARRIER");
+if(TRACE_WB) tty->print_cr("HELLO PRE WRITE BARRIER");
     SharedRuntime::g1_wb_pre(obj, thread);
 JRT_END
 
 JRT_LEAF(void, GraalRuntime::graal_wb_post_call(JavaThread* thread, oopDesc* obj, void* card_addr))
-    tty->print_cr("HELLO POST WRITE BARRIER Card address 0x%016lx", card_addr);
+    if(TRACE_WB) tty->print_cr("HELLO POST WRITE BARRIER Card address 0x%016lx", card_addr);
     thread->dirty_card_queue().enqueue(card_addr);
+//if(!((CardTableModRefBS*)(Universe::heap()->barrier_set()))->is_valid_card_address(obj,(signed char*)card_addr)) {
+//  tty->print_cr("Invalid worker start card");
+//}
+
+
+JRT_END
+
+JRT_LEAF(void, GraalRuntime::graal_ver_oop(JavaThread* thread, oopDesc* obj))
+if(!TRACE_WB) return;
+if(obj==NULL) tty->print_cr("ERROR NULL in verifyoop G1 in method  obj " INTPTR_FORMAT, obj);
+if (obj!=NULL &&!obj->is_oop()) {
+  tty->print_cr("ERROR in verifyoop G1 in method  obj " INTPTR_FORMAT, obj);
+
+}else {
+  tty->print_cr("PASS in verifyoop G1 in method  obj " INTPTR_FORMAT, obj);
+}
 JRT_END
 
 JRT_LEAF(void, GraalRuntime::graal_monitorexit(JavaThread* thread, oopDesc* obj, BasicLock* lock))
@@ -526,6 +544,14 @@
 JRT_END
 
 JRT_ENTRY(void, GraalRuntime::graal_log_object(JavaThread* thread, oop obj, jint flags))
+if (!obj->is_oop()) {
+  tty->print_cr("ERROR in verifyoop G1 in method  obj " INTPTR_FORMAT, obj);
+
+}else {
+  tty->print_cr("WIN in verifyoop G1 in method  obj " INTPTR_FORMAT, obj);
+}
+
+if(obj==NULL) return;
   bool string =  mask_bits_are_true(flags, LOG_OBJECT_STRING);
   bool address = mask_bits_are_true(flags, LOG_OBJECT_ADDRESS);
   bool newline = mask_bits_are_true(flags, LOG_OBJECT_NEWLINE);
--- a/src/share/vm/graal/graalRuntime.hpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/graal/graalRuntime.hpp	Mon Mar 04 16:46:37 2013 +0100
@@ -105,6 +105,7 @@
   stub(graal_thread_is_interrupted)   \
   stub(graal_wb_pre_call)             \
   stub(graal_wb_post_call)             \
+  stub(graal_ver_oop)             \
   last_entry(number_of_ids)
 
 #define DECLARE_STUB_ID(x)       x ## _id ,
@@ -142,8 +143,11 @@
 
   static address exception_handler_for_pc(JavaThread* thread);
 
+  static void graal_verify_oop(JavaThread* thread, oopDesc* obj);
   static void graal_wb_pre_call(JavaThread* thread, oopDesc* obj);
+
   static void graal_wb_post_call(JavaThread* thread, oopDesc* obj,void* obj);
+  static void graal_ver_oop(JavaThread* thread, oopDesc* obj);
   static void graal_create_null_exception(JavaThread* thread);
   static void graal_create_out_of_bounds_exception(JavaThread* thread, jint index);
   static void graal_monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock);
--- a/src/share/vm/memory/cardTableModRefBS.hpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/memory/cardTableModRefBS.hpp	Mon Mar 04 16:46:37 2013 +0100
@@ -267,6 +267,15 @@
     card_size_in_words          = card_size / sizeof(HeapWord)
   };
 
+   bool is_valid_card_address(void* p, jbyte* addr) {
+     size_t ind=index_for(p);
+     tty->print_cr("C cardValue? %d cardAddress 0x%08x offset %d", _byte_map[ind], addr, ind);
+    //for(size_t i=0;i<30000;i++) {
+    //  tty->print_cr("C cardIndex %d val %d",i, _byte_map[i]);
+
+    //}
+     return (addr >= _byte_map) && (addr < _byte_map + _byte_map_size);
+   }
   static int clean_card_val()      { return clean_card; }
   static int clean_card_mask_val() { return clean_card_mask; }
   static int dirty_card_val()      { return dirty_card; }
--- a/src/share/vm/opto/graphKit.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/opto/graphKit.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -3761,12 +3761,14 @@
         Node* card_val = __ load(__ ctrl(), card_adr, TypeInt::INT, T_BYTE, Compile::AliasIdxRaw);
 
         __ if_then(card_val, BoolTest::ne, zero); {
+          tty->print_cr("Object hotspot mark card");
           g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
         } __ end_if();
       } __ end_if();
     } __ end_if();
   } else {
     // Object.clone() instrinsic uses this path.
+    tty->print_cr("Object clone mark card");
     g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
   }
 
--- a/src/share/vm/prims/jni.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/prims/jni.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -2670,6 +2670,7 @@
 
     if (needs_barrier) {
       oop referent = JNIHandles::resolve(ret);
+      tty->print_cr("ENQUEUE in jni");
       G1SATBCardTableModRefBS::enqueue(referent);
     }
   }
--- a/src/share/vm/prims/unsafe.cpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/prims/unsafe.cpp	Mon Mar 04 16:46:37 2013 +0100
@@ -208,6 +208,8 @@
     }
 
     if (needs_barrier) {
+      tty->print_cr("GENERATE PRE BARRIER UNSAFE");
+
       oop referent = JNIHandles::resolve(ret);
       G1SATBCardTableModRefBS::enqueue(referent);
     }
@@ -266,6 +268,8 @@
     }
 
     if (needs_barrier) {
+      tty->print_cr("GENERATE PRE BARRIER UNSAFE");
+
       oop referent = JNIHandles::resolve(ret);
       G1SATBCardTableModRefBS::enqueue(referent);
     }
--- a/src/share/vm/utilities/debug.hpp	Thu Feb 28 17:39:48 2013 +0100
+++ b/src/share/vm/utilities/debug.hpp	Mon Mar 04 16:46:37 2013 +0100
@@ -160,6 +160,16 @@
 } while (0)
 #endif // #ifndef USE_REPEATED_ASSERTS
 
+#define assert1(p, msg)
+do {                                                                         \
+  for (int __i = 0; __i < AssertRepeat; __i++) {                             \
+    if (!(p)) {                                                              \
+      report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", msg);     \
+      BREAKPOINT;                                                            \
+    }                                                                        \
+  }                                                                          \
+} while (0)
+
 // This version of assert is for use with checking return status from
 // library calls that return actual error values eg. EINVAL,
 // ENOMEM etc, rather than returning -1 and setting errno.