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 }