hotspot/src/share/vm/opto/macro.cpp
changeset 360 21d113ecbf6a
parent 246 b029af7e69d3
child 371 1aacedc9db7c
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
   817 
   817 
   818 
   818 
   819 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) {
   819 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) {
   820   Node* adr = basic_plus_adr(base, offset);
   820   Node* adr = basic_plus_adr(base, offset);
   821   const TypePtr* adr_type = TypeRawPtr::BOTTOM;
   821   const TypePtr* adr_type = TypeRawPtr::BOTTOM;
   822   Node* value = LoadNode::make(C, ctl, mem, adr, adr_type, value_type, bt);
   822   Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt);
   823   transform_later(value);
   823   transform_later(value);
   824   return value;
   824   return value;
   825 }
   825 }
   826 
   826 
   827 
   827 
   828 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) {
   828 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) {
   829   Node* adr = basic_plus_adr(base, offset);
   829   Node* adr = basic_plus_adr(base, offset);
   830   mem = StoreNode::make(C, ctl, mem, adr, NULL, value, bt);
   830   mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt);
   831   transform_later(mem);
   831   transform_later(mem);
   832   return mem;
   832   return mem;
   833 }
   833 }
   834 
   834 
   835 //=============================================================================
   835 //=============================================================================
  1268     mark_node = make_load(NULL, rawmem, klass_node, Klass::prototype_header_offset_in_bytes() + sizeof(oopDesc), TypeRawPtr::BOTTOM, T_ADDRESS);
  1268     mark_node = make_load(NULL, rawmem, klass_node, Klass::prototype_header_offset_in_bytes() + sizeof(oopDesc), TypeRawPtr::BOTTOM, T_ADDRESS);
  1269   } else {
  1269   } else {
  1270     mark_node = makecon(TypeRawPtr::make((address)markOopDesc::prototype()));
  1270     mark_node = makecon(TypeRawPtr::make((address)markOopDesc::prototype()));
  1271   }
  1271   }
  1272   rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS);
  1272   rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS);
       
  1273 
       
  1274   if (UseCompressedOops) {
       
  1275     Node *zeronode = makecon(TypeInt::ZERO);
       
  1276     // store uncompressed 0 into klass ptr to zero out gap.  The gap is
       
  1277     // used for primitive fields and has to be zeroed.
       
  1278     rawmem = make_store(control, rawmem, object, oopDesc::klass_gap_offset_in_bytes(), zeronode, T_INT);
       
  1279   }
  1273   rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_OBJECT);
  1280   rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_OBJECT);
  1274   int header_size = alloc->minimum_header_size();  // conservatively small
  1281   int header_size = alloc->minimum_header_size();  // conservatively small
  1275 
  1282 
  1276   // Array length
  1283   // Array length
  1277   if (length != NULL) {         // Arrays need length field
  1284   if (length != NULL) {         // Arrays need length field
  1278     rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
  1285     rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT);
  1279     // conservatively small header size:
  1286     // conservatively small header size:
  1280     header_size = sizeof(arrayOopDesc);
  1287     header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE);
  1281     ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass();
  1288     ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass();
  1282     if (k->is_array_klass())    // we know the exact header size in most cases:
  1289     if (k->is_array_klass())    // we know the exact header size in most cases:
  1283       header_size = Klass::layout_helper_header_size(k->layout_helper());
  1290       header_size = Klass::layout_helper_header_size(k->layout_helper());
  1284   }
  1291   }
  1285 
  1292 
  1304       // We can also try to do some peephole optimizations,
  1311       // We can also try to do some peephole optimizations,
  1305       // such as combining some adjacent subword stores.
  1312       // such as combining some adjacent subword stores.
  1306       rawmem = init->complete_stores(control, rawmem, object,
  1313       rawmem = init->complete_stores(control, rawmem, object,
  1307                                      header_size, size_in_bytes, &_igvn);
  1314                                      header_size, size_in_bytes, &_igvn);
  1308     }
  1315     }
  1309 
       
  1310     // We have no more use for this link, since the AllocateNode goes away:
  1316     // We have no more use for this link, since the AllocateNode goes away:
  1311     init->set_req(InitializeNode::RawAddress, top());
  1317     init->set_req(InitializeNode::RawAddress, top());
  1312     // (If we keep the link, it just confuses the register allocator,
  1318     // (If we keep the link, it just confuses the register allocator,
  1313     // who thinks he sees a real use of the address by the membar.)
  1319     // who thinks he sees a real use of the address by the membar.)
  1314   }
  1320   }
  1703       assert(false, "unknown node type in macro list");
  1709       assert(false, "unknown node type in macro list");
  1704     }
  1710     }
  1705     assert(C->macro_count() < macro_count, "must have deleted a node from macro list");
  1711     assert(C->macro_count() < macro_count, "must have deleted a node from macro list");
  1706     if (C->failing())  return true;
  1712     if (C->failing())  return true;
  1707   }
  1713   }
       
  1714 
       
  1715   _igvn.set_delay_transform(false);
  1708   _igvn.optimize();
  1716   _igvn.optimize();
  1709   return false;
  1717   return false;
  1710 }
  1718 }