src/share/vm/opto/macro.cpp

changeset 548
ba764ed4b6f2
parent 508
a8880a78d355
child 559
b130b98db9cf
     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  }

mercurial