mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
8024921: PPC64 (part 113): Extend Load and Store nodes to know about memory ordering
Add a field to C2 LoadNode and StoreNode classes which indicates whether the load/store should do an acquire/release on platforms which support it. Reviewed-by: kvn
This commit is contained in:
parent
d8b9e9f681
commit
13b13f5259
17 changed files with 351 additions and 255 deletions
|
@ -228,7 +228,9 @@ void Parse::do_get_xxx(Node* obj, ciField* field, bool is_field) {
|
|||
type = Type::get_const_basic_type(bt);
|
||||
}
|
||||
// Build the load.
|
||||
Node* ld = make_load(NULL, adr, type, bt, adr_type, is_vol);
|
||||
//
|
||||
MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
|
||||
Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, is_vol);
|
||||
|
||||
// Adjust Java stack
|
||||
if (type2size[bt] == 1)
|
||||
|
@ -288,6 +290,16 @@ void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
|
|||
// Round doubles before storing
|
||||
if (bt == T_DOUBLE) val = dstore_rounding(val);
|
||||
|
||||
// Conservatively release stores of object references.
|
||||
const MemNode::MemOrd mo =
|
||||
is_vol ?
|
||||
// Volatile fields need releasing stores.
|
||||
MemNode::release :
|
||||
// Non-volatile fields also need releasing stores if they hold an
|
||||
// object reference, because the object reference might point to
|
||||
// a freshly created object.
|
||||
StoreNode::release_if_reference(bt);
|
||||
|
||||
// Store the value.
|
||||
Node* store;
|
||||
if (bt == T_OBJECT) {
|
||||
|
@ -297,9 +309,9 @@ void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
|
|||
} else {
|
||||
field_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
|
||||
}
|
||||
store = store_oop_to_object( control(), obj, adr, adr_type, val, field_type, bt);
|
||||
store = store_oop_to_object(control(), obj, adr, adr_type, val, field_type, bt, mo);
|
||||
} else {
|
||||
store = store_to_memory( control(), adr, val, bt, adr_type, is_vol );
|
||||
store = store_to_memory(control(), adr, val, bt, adr_type, mo, is_vol);
|
||||
}
|
||||
|
||||
// If reference is volatile, prevent following volatiles ops from
|
||||
|
@ -414,7 +426,7 @@ Node* Parse::expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, in
|
|||
Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs);
|
||||
intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop);
|
||||
Node* eaddr = basic_plus_adr(array, offset);
|
||||
store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT);
|
||||
store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT, MemNode::unordered);
|
||||
}
|
||||
}
|
||||
return array;
|
||||
|
@ -503,7 +515,7 @@ void Parse::do_multianewarray() {
|
|||
// Fill-in it with values
|
||||
for (j = 0; j < ndimensions; j++) {
|
||||
Node *dims_elem = array_element_address(dims, intcon(j), T_INT);
|
||||
store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS);
|
||||
store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS, MemNode::unordered);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue