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 } |