--- a/src/hotspot/share/opto/memnode.cpp Fri Sep 27 12:46:14 2019 +0200
+++ b/src/hotspot/share/opto/memnode.cpp Tue Jul 16 08:56:08 2019 +0200
@@ -1555,6 +1555,22 @@
return phi;
}
+AllocateNode* LoadNode::is_new_object_mark_load(PhaseGVN *phase) const {
+ if (Opcode() == Op_LoadX) {
+ Node* address = in(MemNode::Address);
+ AllocateNode* alloc = AllocateNode::Ideal_allocation(address, phase);
+ Node* mem = in(MemNode::Memory);
+ if (alloc != NULL && mem->is_Proj() &&
+ mem->in(0) != NULL &&
+ mem->in(0) == alloc->initialization() &&
+ alloc->initialization()->proj_out_or_null(0) != NULL) {
+ return alloc;
+ }
+ }
+ return NULL;
+}
+
+
//------------------------------Ideal------------------------------------------
// If the load is from Field memory and the pointer is non-null, it might be possible to
// zero out the control input.
@@ -1683,6 +1699,13 @@
}
}
+ AllocateNode* alloc = is_new_object_mark_load(phase);
+ if (alloc != NULL && alloc->Opcode() == Op_Allocate && UseBiasedLocking) {
+ InitializeNode* init = alloc->initialization();
+ Node* control = init->proj_out(0);
+ return alloc->make_ideal_mark(phase, address, control, mem);
+ }
+
return progress ? this : NULL;
}
@@ -1941,6 +1964,12 @@
return Type::get_zero_type(_type->basic_type());
}
}
+
+ Node* alloc = is_new_object_mark_load(phase);
+ if (alloc != NULL && !(alloc->Opcode() == Op_Allocate && UseBiasedLocking)) {
+ return TypeX::make(markWord::prototype().value());
+ }
+
return _type;
}