< prev index next >

src/hotspot/share/opto/valuetypenode.cpp

Print this page
rev 59083 : DRAFT 8236522: NonTearable marker interface for inline classes to enforce atomicity

*** 397,406 **** --- 397,407 ---- 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. + // FIXME: coordinate with ready_to_publish(kit, alloc_oop) 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());
*** 625,634 **** --- 626,636 ---- 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); + ready_to_publish(kit, obj); // 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");
*** 639,648 **** --- 641,661 ---- res->set_type(TypeValueType::make(vk, false)); res = kit->gvn().transform(res)->as_ValueType(); return res; } + void ValueTypeBaseNode::ready_to_publish(GraphKit* kit, Node* base) const { + // Do not let stores that initialize this buffer be reordered with + // a subsequent store that would make it accessible by other threads. + // Required for correct non-flat array element publication. + // (See jtreg test ValueTearing.java.) + Node* raw_address_proj = NULL; //FIXME + kit->insert_mem_bar(Op_MemBarStoreStore, raw_address_proj); + // Fails to prevent array element tearing: + //kit->insert_mem_bar_volatile(Op_MemBarStoreStore, Compile::AliasIdxRaw, raw_address_proj); + } + Node* ValueTypeNode::is_loaded(PhaseGVN* phase, ciValueKlass* vk, Node* base, int holder_offset) { if (vk == NULL) { vk = value_klass(); } if (field_count() == 0) {
< prev index next >