1.1 --- a/src/share/vm/opto/macro.cpp Fri Apr 11 09:56:35 2008 -0400 1.2 +++ b/src/share/vm/opto/macro.cpp Sun Apr 13 17:43:42 2008 -0400 1.3 @@ -819,7 +819,7 @@ 1.4 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { 1.5 Node* adr = basic_plus_adr(base, offset); 1.6 const TypePtr* adr_type = TypeRawPtr::BOTTOM; 1.7 - Node* value = LoadNode::make(C, ctl, mem, adr, adr_type, value_type, bt); 1.8 + Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt); 1.9 transform_later(value); 1.10 return value; 1.11 } 1.12 @@ -827,7 +827,7 @@ 1.13 1.14 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { 1.15 Node* adr = basic_plus_adr(base, offset); 1.16 - mem = StoreNode::make(C, ctl, mem, adr, NULL, value, bt); 1.17 + mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt); 1.18 transform_later(mem); 1.19 return mem; 1.20 } 1.21 @@ -1270,6 +1270,13 @@ 1.22 mark_node = makecon(TypeRawPtr::make((address)markOopDesc::prototype())); 1.23 } 1.24 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS); 1.25 + 1.26 + if (UseCompressedOops) { 1.27 + Node *zeronode = makecon(TypeInt::ZERO); 1.28 + // store uncompressed 0 into klass ptr to zero out gap. The gap is 1.29 + // used for primitive fields and has to be zeroed. 1.30 + rawmem = make_store(control, rawmem, object, oopDesc::klass_gap_offset_in_bytes(), zeronode, T_INT); 1.31 + } 1.32 rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_OBJECT); 1.33 int header_size = alloc->minimum_header_size(); // conservatively small 1.34 1.35 @@ -1277,7 +1284,7 @@ 1.36 if (length != NULL) { // Arrays need length field 1.37 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT); 1.38 // conservatively small header size: 1.39 - header_size = sizeof(arrayOopDesc); 1.40 + header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE); 1.41 ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass(); 1.42 if (k->is_array_klass()) // we know the exact header size in most cases: 1.43 header_size = Klass::layout_helper_header_size(k->layout_helper()); 1.44 @@ -1306,7 +1313,6 @@ 1.45 rawmem = init->complete_stores(control, rawmem, object, 1.46 header_size, size_in_bytes, &_igvn); 1.47 } 1.48 - 1.49 // We have no more use for this link, since the AllocateNode goes away: 1.50 init->set_req(InitializeNode::RawAddress, top()); 1.51 // (If we keep the link, it just confuses the register allocator, 1.52 @@ -1705,6 +1711,8 @@ 1.53 assert(C->macro_count() < macro_count, "must have deleted a node from macro list"); 1.54 if (C->failing()) return true; 1.55 } 1.56 + 1.57 + _igvn.set_delay_transform(false); 1.58 _igvn.optimize(); 1.59 return false; 1.60 }