Mercurial > hg > truffle
diff 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 |
line wrap: on
line diff
--- a/src/share/vm/opto/macro.cpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/share/vm/opto/macro.cpp Sun Apr 13 17:43:42 2008 -0400 @@ -819,7 +819,7 @@ Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { Node* adr = basic_plus_adr(base, offset); const TypePtr* adr_type = TypeRawPtr::BOTTOM; - Node* value = LoadNode::make(C, ctl, mem, adr, adr_type, value_type, bt); + Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt); transform_later(value); return value; } @@ -827,7 +827,7 @@ Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { Node* adr = basic_plus_adr(base, offset); - mem = StoreNode::make(C, ctl, mem, adr, NULL, value, bt); + mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt); transform_later(mem); return mem; } @@ -1270,6 +1270,13 @@ mark_node = makecon(TypeRawPtr::make((address)markOopDesc::prototype())); } rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS); + + if (UseCompressedOops) { + Node *zeronode = makecon(TypeInt::ZERO); + // store uncompressed 0 into klass ptr to zero out gap. The gap is + // used for primitive fields and has to be zeroed. + rawmem = make_store(control, rawmem, object, oopDesc::klass_gap_offset_in_bytes(), zeronode, T_INT); + } rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_OBJECT); int header_size = alloc->minimum_header_size(); // conservatively small @@ -1277,7 +1284,7 @@ if (length != NULL) { // Arrays need length field rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT); // conservatively small header size: - header_size = sizeof(arrayOopDesc); + header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE); ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass(); if (k->is_array_klass()) // we know the exact header size in most cases: header_size = Klass::layout_helper_header_size(k->layout_helper()); @@ -1306,7 +1313,6 @@ rawmem = init->complete_stores(control, rawmem, object, header_size, size_in_bytes, &_igvn); } - // We have no more use for this link, since the AllocateNode goes away: init->set_req(InitializeNode::RawAddress, top()); // (If we keep the link, it just confuses the register allocator, @@ -1705,6 +1711,8 @@ assert(C->macro_count() < macro_count, "must have deleted a node from macro list"); if (C->failing()) return true; } + + _igvn.set_delay_transform(false); _igvn.optimize(); return false; }