< prev index next >

src/hotspot/share/opto/valuetypenode.cpp

Print this page

        

@@ -394,10 +394,17 @@
     kit->kill_dead_locals();
     ciValueKlass* vk = value_klass();
     Node* klass_node = kit->makecon(TypeKlassPtr::make(vk));
     Node* alloc_oop  = kit->new_instance(klass_node, NULL, NULL, /* deoptimize_on_exception */ true, this);
     store(kit, alloc_oop, alloc_oop, vk, 0);
+
+    // Do not let stores that initialize this buffer be reordered with a subsequent
+    // store that would make this buffer accessible by other threads.
+    AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_oop, &kit->gvn());
+    assert(alloc != NULL, "must have an allocation node");
+    kit->insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress));
+
     region->init_req(2, kit->control());
     oop   ->init_req(2, alloc_oop);
     io    ->init_req(2, kit->i_o());
     mem   ->init_req(2, kit->merged_memory());
   }

@@ -417,10 +424,11 @@
   vt->set_oop(res_oop);
   vt = kit->gvn().transform(vt)->as_ValueTypeBase();
   if (safe_for_replace) {
     kit->replace_in_map(this, vt);
   }
+  assert(vt->is_allocated(&kit->gvn()), "must be allocated");
   return vt;
 }
 
 bool ValueTypeBaseNode::is_allocated(PhaseGVN* phase) const {
   Node* oop = get_oop();

@@ -606,20 +614,27 @@
     store(kit, alloc_oop, alloc_oop, vk, 0);
     res->set_oop(alloc_oop);
   }
   res->set_type(TypeValueType::make(vk, true));
   res = kit->gvn().transform(res)->as_ValueType();
+  assert(!allocate || res->is_allocated(&kit->gvn()), "must be allocated");
   return res;
 }
 
 ValueTypeNode* ValueTypeNode::finish_larval(GraphKit* kit) const {
   Node* obj = get_oop();
   Node* mark_addr = kit->basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
   Node* mark = kit->make_load(NULL, mark_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
   mark = kit->gvn().transform(new AndXNode(mark, kit->MakeConX(~markWord::larval_mask_in_place)));
   kit->store_to_memory(kit->control(), mark_addr, mark, TypeX_X->basic_type(), kit->gvn().type(mark_addr)->is_ptr(), MemNode::unordered);
 
+  // Do not let stores that initialize this buffer be reordered with a subsequent
+  // store that would make this buffer accessible by other threads.
+  AllocateNode* alloc = AllocateNode::Ideal_allocation(obj, &kit->gvn());
+  assert(alloc != NULL, "must have an allocation node");
+  kit->insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress));
+
   ciValueKlass* vk = value_klass();
   ValueTypeNode* res = clone()->as_ValueType();
   res->set_type(TypeValueType::make(vk, false));
   res = kit->gvn().transform(res)->as_ValueType();
   return res;
< prev index next >