Mercurial > hg > truffle
comparison src/share/vm/opto/macro.cpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a8880a78d355 |
children | b130b98db9cf |
comparison
equal
deleted
inserted
replaced
110:a49a647afe9a | 113:ba764ed4b6f2 |
---|---|
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 } |