1082 |
1082 |
1083 |
1083 |
1084 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { |
1084 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { |
1085 Node* adr = basic_plus_adr(base, offset); |
1085 Node* adr = basic_plus_adr(base, offset); |
1086 const TypePtr* adr_type = adr->bottom_type()->is_ptr(); |
1086 const TypePtr* adr_type = adr->bottom_type()->is_ptr(); |
1087 Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt); |
1087 Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt, MemNode::unordered); |
1088 transform_later(value); |
1088 transform_later(value); |
1089 return value; |
1089 return value; |
1090 } |
1090 } |
1091 |
1091 |
1092 |
1092 |
1093 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { |
1093 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { |
1094 Node* adr = basic_plus_adr(base, offset); |
1094 Node* adr = basic_plus_adr(base, offset); |
1095 mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt); |
1095 mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt, MemNode::unordered); |
1096 transform_later(mem); |
1096 transform_later(mem); |
1097 return mem; |
1097 return mem; |
1098 } |
1098 } |
1099 |
1099 |
1100 //============================================================================= |
1100 //============================================================================= |
1270 } |
1270 } |
1271 |
1271 |
1272 // Load(-locked) the heap top. |
1272 // Load(-locked) the heap top. |
1273 // See note above concerning the control input when using a TLAB |
1273 // See note above concerning the control input when using a TLAB |
1274 Node *old_eden_top = UseTLAB |
1274 Node *old_eden_top = UseTLAB |
1275 ? new (C) LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM) |
1275 ? new (C) LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered) |
1276 : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr); |
1276 : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire); |
1277 |
1277 |
1278 transform_later(old_eden_top); |
1278 transform_later(old_eden_top); |
1279 // Add to heap top to get a new heap top |
1279 // Add to heap top to get a new heap top |
1280 Node *new_eden_top = new (C) AddPNode(top(), old_eden_top, size_in_bytes); |
1280 Node *new_eden_top = new (C) AddPNode(top(), old_eden_top, size_in_bytes); |
1281 transform_later(new_eden_top); |
1281 transform_later(new_eden_top); |
1318 // StorePConditional produces flags for a test PLUS a modified raw |
1318 // StorePConditional produces flags for a test PLUS a modified raw |
1319 // memory state. |
1319 // memory state. |
1320 if (UseTLAB) { |
1320 if (UseTLAB) { |
1321 Node* store_eden_top = |
1321 Node* store_eden_top = |
1322 new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr, |
1322 new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr, |
1323 TypeRawPtr::BOTTOM, new_eden_top); |
1323 TypeRawPtr::BOTTOM, new_eden_top, MemNode::unordered); |
1324 transform_later(store_eden_top); |
1324 transform_later(store_eden_top); |
1325 fast_oop_ctrl = needgc_false; // No contention, so this is the fast path |
1325 fast_oop_ctrl = needgc_false; // No contention, so this is the fast path |
1326 fast_oop_rawmem = store_eden_top; |
1326 fast_oop_rawmem = store_eden_top; |
1327 } else { |
1327 } else { |
1328 Node* store_eden_top = |
1328 Node* store_eden_top = |
1698 |
1698 |
1699 Node *eden_pf_adr = new (C) AddPNode( top()/*not oop*/, thread, |
1699 Node *eden_pf_adr = new (C) AddPNode( top()/*not oop*/, thread, |
1700 _igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) ); |
1700 _igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) ); |
1701 transform_later(eden_pf_adr); |
1701 transform_later(eden_pf_adr); |
1702 |
1702 |
1703 Node *old_pf_wm = new (C) LoadPNode( needgc_false, |
1703 Node *old_pf_wm = new (C) LoadPNode(needgc_false, |
1704 contended_phi_rawmem, eden_pf_adr, |
1704 contended_phi_rawmem, eden_pf_adr, |
1705 TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); |
1705 TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, |
|
1706 MemNode::unordered); |
1706 transform_later(old_pf_wm); |
1707 transform_later(old_pf_wm); |
1707 |
1708 |
1708 // check against new_eden_top |
1709 // check against new_eden_top |
1709 Node *need_pf_cmp = new (C) CmpPNode( new_eden_top, old_pf_wm ); |
1710 Node *need_pf_cmp = new (C) CmpPNode( new_eden_top, old_pf_wm ); |
1710 transform_later(need_pf_cmp); |
1711 transform_later(need_pf_cmp); |
1724 Node *new_pf_wmt = new (C) AddPNode( top(), old_pf_wm, |
1725 Node *new_pf_wmt = new (C) AddPNode( top(), old_pf_wm, |
1725 _igvn.MakeConX(AllocatePrefetchDistance) ); |
1726 _igvn.MakeConX(AllocatePrefetchDistance) ); |
1726 transform_later(new_pf_wmt ); |
1727 transform_later(new_pf_wmt ); |
1727 new_pf_wmt->set_req(0, need_pf_true); |
1728 new_pf_wmt->set_req(0, need_pf_true); |
1728 |
1729 |
1729 Node *store_new_wmt = new (C) StorePNode( need_pf_true, |
1730 Node *store_new_wmt = new (C) StorePNode(need_pf_true, |
1730 contended_phi_rawmem, eden_pf_adr, |
1731 contended_phi_rawmem, eden_pf_adr, |
1731 TypeRawPtr::BOTTOM, new_pf_wmt ); |
1732 TypeRawPtr::BOTTOM, new_pf_wmt, |
|
1733 MemNode::unordered); |
1732 transform_later(store_new_wmt); |
1734 transform_later(store_new_wmt); |
1733 |
1735 |
1734 // adding prefetches |
1736 // adding prefetches |
1735 pf_phi_abio->init_req( fall_in_path, i_o ); |
1737 pf_phi_abio->init_req( fall_in_path, i_o ); |
1736 |
1738 |