< prev index next >

src/share/vm/opto/macro.cpp

Print this page

        

@@ -22,10 +22,11 @@
  *
  */
 
 #include "precompiled.hpp"
 #include "compiler/compileLog.hpp"
+#include "gc/shenandoah/brooksPointer.hpp"
 #include "libadt/vectset.hpp"
 #include "opto/addnode.hpp"
 #include "opto/arraycopynode.hpp"
 #include "opto/callnode.hpp"
 #include "opto/castnode.hpp"

@@ -40,10 +41,11 @@
 #include "opto/node.hpp"
 #include "opto/opaquenode.hpp"
 #include "opto/phaseX.hpp"
 #include "opto/rootnode.hpp"
 #include "opto/runtime.hpp"
+#include "opto/shenandoahSupport.hpp"
 #include "opto/subnode.hpp"
 #include "opto/type.hpp"
 #include "runtime/sharedRuntime.hpp"
 
 

@@ -931,10 +933,13 @@
           field_val = field_val->in(1);
         } else {
           field_val = transform_later(new DecodeNNode(field_val, field_val->get_ptr_type()));
         }
       }
+      if (field_val->isa_ShenandoahBarrier()) {
+        field_val = field_val->in(ShenandoahBarrierNode::ValueIn);
+      }
       sfpt->add_req(field_val);
     }
     JVMState *jvms = sfpt->jvms();
     jvms->set_endoff(sfpt->req());
     // Now make a pass over the debug information replacing any references

@@ -1409,10 +1414,17 @@
       ? new LoadPNode      (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered)
       : new LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire);
 
     transform_later(old_eden_top);
     // Add to heap top to get a new heap top
+
+    if (UseShenandoahGC) {
+      // Allocate one word more for the Shenandoah brooks pointer.
+      size_in_bytes = new AddLNode(size_in_bytes, _igvn.MakeConX(8));
+      transform_later(size_in_bytes);
+    }
+
     Node *new_eden_top = new AddPNode(top(), old_eden_top, size_in_bytes);
     transform_later(new_eden_top);
     // Check for needing a GC; compare against heap end
     Node *needgc_cmp = new CmpPNode(new_eden_top, eden_end);
     transform_later(needgc_cmp);

@@ -1499,10 +1511,17 @@
       transform_later(new_alloc_bytes);
       fast_oop_rawmem = make_store(fast_oop_ctrl, store_eden_top, alloc_bytes_adr,
                                    0, new_alloc_bytes, T_LONG);
     }
 
+    if (UseShenandoahGC) {
+      // Bump up object by one word. The preceding word is used for
+      // the Shenandoah brooks pointer.
+      fast_oop = new AddPNode(top(), fast_oop, _igvn.MakeConX(8));
+      transform_later(fast_oop);
+    }
+
     InitializeNode* init = alloc->initialization();
     fast_oop_rawmem = initialize_object(alloc,
                                         fast_oop_ctrl, fast_oop_rawmem, fast_oop,
                                         klass_node, length, size_in_bytes);
 

@@ -1776,10 +1795,15 @@
     ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass();
     if (k->is_array_klass())    // we know the exact header size in most cases:
       header_size = Klass::layout_helper_header_size(k->layout_helper());
   }
 
+  if (UseShenandoahGC) {
+    // Initialize Shenandoah brooks pointer to point to the object itself.
+    rawmem = make_store(control, rawmem, object, BrooksPointer::BYTE_OFFSET, object, T_OBJECT);
+  }
+
   // Clear the object body, if necessary.
   if (init == NULL) {
     // The init has somehow disappeared; be cautious and clear everything.
     //
     // This can happen if a node is allocated but an uncommon trap occurs
< prev index next >