< prev index next >
src/hotspot/share/gc/shared/c2/barrierSetC2.cpp
Print this page
rev 50410 : 8204331: AArch64: fix CAS not embedded in normal graph error.
Reviewed-by: duke
*** 210,219 ****
--- 210,245 ----
}
}
};
+ class C2AtomicAccessFence: public C2AccessFence {
+ C2AtomicAccess& _access;
+
+ public:
+ C2AtomicAccessFence(C2AtomicAccess& access) :
+ C2AccessFence(access), _access(access) { }
+
+ ~C2AtomicAccessFence() {
+ // ~C2AtomicAccessFence is called before ~C2AccessFence. This calling order
+ // matters here. Because SCMemProjNode should be added before memory barrier
+ // insertion (it is inserted in ~C2AccessFence).
+ if (!_access.needs_pinning()) {
+ return;
+ }
+ // SCMemProjNodes represent the memory state of a LoadStore. Their
+ // main role is to prevent LoadStore nodes from being optimized away
+ // when their results aren't used.
+ GraphKit* kit = _access.kit();
+ Node* load_store = _access.raw_access();
+ assert(load_store != NULL, "must pin atomic op");
+ Node* proj = kit->gvn().transform(new SCMemProjNode(load_store));
+ kit->set_memory(proj, _access.alias_idx());
+ }
+
+ };
+
Node* BarrierSetC2::store_at(C2Access& access, C2AccessValue& val) const {
C2AccessFence fence(access);
resolve_address(access);
return store_at_resolved(access, val);
}
*** 291,314 ****
}
}
//--------------------------- atomic operations---------------------------------
- static void pin_atomic_op(C2AtomicAccess& access) {
- if (!access.needs_pinning()) {
- return;
- }
- // SCMemProjNodes represent the memory state of a LoadStore. Their
- // main role is to prevent LoadStore nodes from being optimized away
- // when their results aren't used.
- GraphKit* kit = access.kit();
- Node* load_store = access.raw_access();
- assert(load_store != NULL, "must pin atomic op");
- Node* proj = kit->gvn().transform(new SCMemProjNode(load_store));
- kit->set_memory(proj, access.alias_idx());
- }
-
void C2AtomicAccess::set_memory() {
Node *mem = _kit->memory(_alias_idx);
_memory = mem;
}
--- 317,326 ----
*** 356,366 ****
ShouldNotReachHere();
}
}
access.set_raw_access(load_store);
- pin_atomic_op(access);
#ifdef _LP64
if (access.is_oop() && adr->bottom_type()->is_ptr_to_narrowoop()) {
return kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
}
--- 368,377 ----
*** 436,446 ****
ShouldNotReachHere();
}
}
access.set_raw_access(load_store);
- pin_atomic_op(access);
return load_store;
}
Node* BarrierSetC2::atomic_xchg_at_resolved(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
--- 447,456 ----
*** 478,488 ****
ShouldNotReachHere();
}
}
access.set_raw_access(load_store);
- pin_atomic_op(access);
#ifdef _LP64
if (access.is_oop() && adr->bottom_type()->is_ptr_to_narrowoop()) {
return kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
}
--- 488,497 ----
*** 514,550 ****
default:
ShouldNotReachHere();
}
access.set_raw_access(load_store);
- pin_atomic_op(access);
return load_store;
}
Node* BarrierSetC2::atomic_cmpxchg_val_at(C2AtomicAccess& access, Node* expected_val,
Node* new_val, const Type* value_type) const {
! C2AccessFence fence(access);
resolve_address(access);
return atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
}
Node* BarrierSetC2::atomic_cmpxchg_bool_at(C2AtomicAccess& access, Node* expected_val,
Node* new_val, const Type* value_type) const {
! C2AccessFence fence(access);
resolve_address(access);
return atomic_cmpxchg_bool_at_resolved(access, expected_val, new_val, value_type);
}
Node* BarrierSetC2::atomic_xchg_at(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
! C2AccessFence fence(access);
resolve_address(access);
return atomic_xchg_at_resolved(access, new_val, value_type);
}
Node* BarrierSetC2::atomic_add_at(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
! C2AccessFence fence(access);
resolve_address(access);
return atomic_add_at_resolved(access, new_val, value_type);
}
void BarrierSetC2::clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const {
--- 523,558 ----
default:
ShouldNotReachHere();
}
access.set_raw_access(load_store);
return load_store;
}
Node* BarrierSetC2::atomic_cmpxchg_val_at(C2AtomicAccess& access, Node* expected_val,
Node* new_val, const Type* value_type) const {
! C2AtomicAccessFence fence(access);
resolve_address(access);
return atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
}
Node* BarrierSetC2::atomic_cmpxchg_bool_at(C2AtomicAccess& access, Node* expected_val,
Node* new_val, const Type* value_type) const {
! C2AtomicAccessFence fence(access);
resolve_address(access);
return atomic_cmpxchg_bool_at_resolved(access, expected_val, new_val, value_type);
}
Node* BarrierSetC2::atomic_xchg_at(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
! C2AtomicAccessFence fence(access);
resolve_address(access);
return atomic_xchg_at_resolved(access, new_val, value_type);
}
Node* BarrierSetC2::atomic_add_at(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
! C2AtomicAccessFence fence(access);
resolve_address(access);
return atomic_add_at_resolved(access, new_val, value_type);
}
void BarrierSetC2::clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const {
< prev index next >