Mercurial > hg > truffle
comparison src/share/vm/opto/parse3.cpp @ 14429:2113136690bc
8024921: PPC64 (part 113): Extend Load and Store nodes to know about memory ordering
Summary: 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
author | goetz |
---|---|
date | Fri, 15 Nov 2013 11:05:32 -0800 |
parents | edb5ab0f3fe5 |
children | c6d7e7406136 |
comparison
equal
deleted
inserted
replaced
14427:eb178e97560c | 14429:2113136690bc |
---|---|
226 } | 226 } |
227 } else { | 227 } else { |
228 type = Type::get_const_basic_type(bt); | 228 type = Type::get_const_basic_type(bt); |
229 } | 229 } |
230 // Build the load. | 230 // Build the load. |
231 Node* ld = make_load(NULL, adr, type, bt, adr_type, is_vol); | 231 // |
232 MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered; | |
233 Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, is_vol); | |
232 | 234 |
233 // Adjust Java stack | 235 // Adjust Java stack |
234 if (type2size[bt] == 1) | 236 if (type2size[bt] == 1) |
235 push(ld); | 237 push(ld); |
236 else | 238 else |
286 // Value to be stored | 288 // Value to be stored |
287 Node* val = type2size[bt] == 1 ? pop() : pop_pair(); | 289 Node* val = type2size[bt] == 1 ? pop() : pop_pair(); |
288 // Round doubles before storing | 290 // Round doubles before storing |
289 if (bt == T_DOUBLE) val = dstore_rounding(val); | 291 if (bt == T_DOUBLE) val = dstore_rounding(val); |
290 | 292 |
293 // Conservatively release stores of object references. | |
294 const MemNode::MemOrd mo = | |
295 is_vol ? | |
296 // Volatile fields need releasing stores. | |
297 MemNode::release : | |
298 // Non-volatile fields also need releasing stores if they hold an | |
299 // object reference, because the object reference might point to | |
300 // a freshly created object. | |
301 StoreNode::release_if_reference(bt); | |
302 | |
291 // Store the value. | 303 // Store the value. |
292 Node* store; | 304 Node* store; |
293 if (bt == T_OBJECT) { | 305 if (bt == T_OBJECT) { |
294 const TypeOopPtr* field_type; | 306 const TypeOopPtr* field_type; |
295 if (!field->type()->is_loaded()) { | 307 if (!field->type()->is_loaded()) { |
296 field_type = TypeInstPtr::BOTTOM; | 308 field_type = TypeInstPtr::BOTTOM; |
297 } else { | 309 } else { |
298 field_type = TypeOopPtr::make_from_klass(field->type()->as_klass()); | 310 field_type = TypeOopPtr::make_from_klass(field->type()->as_klass()); |
299 } | 311 } |
300 store = store_oop_to_object( control(), obj, adr, adr_type, val, field_type, bt); | 312 store = store_oop_to_object(control(), obj, adr, adr_type, val, field_type, bt, mo); |
301 } else { | 313 } else { |
302 store = store_to_memory( control(), adr, val, bt, adr_type, is_vol ); | 314 store = store_to_memory(control(), adr, val, bt, adr_type, mo, is_vol); |
303 } | 315 } |
304 | 316 |
305 // If reference is volatile, prevent following volatiles ops from | 317 // If reference is volatile, prevent following volatiles ops from |
306 // floating up before the volatile write. | 318 // floating up before the volatile write. |
307 if (is_vol) { | 319 if (is_vol) { |
412 const intptr_t header = arrayOopDesc::base_offset_in_bytes(T_OBJECT); | 424 const intptr_t header = arrayOopDesc::base_offset_in_bytes(T_OBJECT); |
413 for (jint i = 0; i < length_con; i++) { | 425 for (jint i = 0; i < length_con; i++) { |
414 Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs); | 426 Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs); |
415 intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop); | 427 intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop); |
416 Node* eaddr = basic_plus_adr(array, offset); | 428 Node* eaddr = basic_plus_adr(array, offset); |
417 store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT); | 429 store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT, MemNode::unordered); |
418 } | 430 } |
419 } | 431 } |
420 return array; | 432 return array; |
421 } | 433 } |
422 | 434 |
501 dims = new_array(dims_array_klass, intcon(ndimensions), 0); | 513 dims = new_array(dims_array_klass, intcon(ndimensions), 0); |
502 | 514 |
503 // Fill-in it with values | 515 // Fill-in it with values |
504 for (j = 0; j < ndimensions; j++) { | 516 for (j = 0; j < ndimensions; j++) { |
505 Node *dims_elem = array_element_address(dims, intcon(j), T_INT); | 517 Node *dims_elem = array_element_address(dims, intcon(j), T_INT); |
506 store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS); | 518 store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS, MemNode::unordered); |
507 } | 519 } |
508 } | 520 } |
509 | 521 |
510 c = make_runtime_call(RC_NO_LEAF | RC_NO_IO, | 522 c = make_runtime_call(RC_NO_LEAF | RC_NO_IO, |
511 OptoRuntime::multianewarrayN_Type(), | 523 OptoRuntime::multianewarrayN_Type(), |