hotspot/src/share/vm/opto/macro.cpp
changeset 22845 d8812d0ff387
parent 19979 ebe1dbb6e1aa
child 22872 b6902ee5bc8d
equal deleted inserted replaced
22843:b245fac3b6a4 22845:d8812d0ff387
  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