mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
This commit is contained in:
parent
680ecf1611
commit
4a831d45f0
273 changed files with 6585 additions and 2993 deletions
|
@ -819,7 +819,7 @@ void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_ad
|
|||
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_load(Node* ctl, Node* mem, Node* base, int offset,
|
|||
|
||||
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 @@ PhaseMacroExpand::initialize_object(AllocateNode* alloc,
|
|||
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 @@ PhaseMacroExpand::initialize_object(AllocateNode* alloc,
|
|||
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 @@ PhaseMacroExpand::initialize_object(AllocateNode* alloc,
|
|||
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 @@ bool PhaseMacroExpand::expand_macro_nodes() {
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue