src/share/vm/opto/memnode.cpp

changeset 670
9c2ecc2ffb12
parent 631
d1605aabd0a1
parent 658
1dd146f17531
child 682
02a35ad4adf8
     1.1 --- a/src/share/vm/opto/memnode.cpp	Thu Jul 03 11:01:32 2008 -0700
     1.2 +++ b/src/share/vm/opto/memnode.cpp	Fri Jul 11 01:14:44 2008 -0700
     1.3 @@ -91,7 +91,7 @@
     1.4  
     1.5  Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
     1.6    const TypeOopPtr *tinst = t_adr->isa_oopptr();
     1.7 -  if (tinst == NULL || !tinst->is_instance_field())
     1.8 +  if (tinst == NULL || !tinst->is_known_instance_field())
     1.9      return mchain;  // don't try to optimize non-instance types
    1.10    uint instance_id = tinst->instance_id();
    1.11    Node *prev = NULL;
    1.12 @@ -125,7 +125,7 @@
    1.13  
    1.14  Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
    1.15    const TypeOopPtr *t_oop = t_adr->isa_oopptr();
    1.16 -  bool is_instance = (t_oop != NULL) && t_oop->is_instance_field();
    1.17 +  bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field();
    1.18    PhaseIterGVN *igvn = phase->is_IterGVN();
    1.19    Node *result = mchain;
    1.20    result = optimize_simple_memory_chain(result, t_adr, phase);
    1.21 @@ -134,8 +134,8 @@
    1.22      assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
    1.23      const TypePtr *t = mphi->adr_type();
    1.24      if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
    1.25 -        t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
    1.26 -        t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop) {
    1.27 +        t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
    1.28 +        t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) {
    1.29        // clone the Phi with our address type
    1.30        result = mphi->split_out_instance(t_adr, igvn);
    1.31      } else {
    1.32 @@ -470,7 +470,7 @@
    1.33          return mem;         // let caller handle steps (c), (d)
    1.34        }
    1.35  
    1.36 -    } else if (addr_t != NULL && addr_t->is_instance_field()) {
    1.37 +    } else if (addr_t != NULL && addr_t->is_known_instance_field()) {
    1.38        // Can't use optimize_simple_memory_chain() since it needs PhaseGVN.
    1.39        if (mem->is_Proj() && mem->in(0)->is_Call()) {
    1.40          CallNode *call = mem->in(0)->as_Call();
    1.41 @@ -769,15 +769,8 @@
    1.42    case T_OBJECT:
    1.43  #ifdef _LP64
    1.44      if (adr->bottom_type()->is_ptr_to_narrowoop()) {
    1.45 -      const TypeNarrowOop* narrowtype;
    1.46 -      if (rt->isa_narrowoop()) {
    1.47 -        narrowtype = rt->is_narrowoop();
    1.48 -      } else {
    1.49 -        narrowtype = rt->is_oopptr()->make_narrowoop();
    1.50 -      }
    1.51 -      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype));
    1.52 -
    1.53 -      return DecodeNNode::decode(&gvn, load);
    1.54 +      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop()));
    1.55 +      return new (C, 2) DecodeNNode(load, load->bottom_type()->make_ptr());
    1.56      } else
    1.57  #endif
    1.58      {
    1.59 @@ -923,7 +916,7 @@
    1.60        in(MemNode::Address)->is_AddP() ) {
    1.61      const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr();
    1.62      // Only instances.
    1.63 -    if( t_oop != NULL && t_oop->is_instance_field() &&
    1.64 +    if( t_oop != NULL && t_oop->is_known_instance_field() &&
    1.65          t_oop->offset() != Type::OffsetBot &&
    1.66          t_oop->offset() != Type::OffsetTop) {
    1.67        return true;
    1.68 @@ -1146,7 +1139,7 @@
    1.69    const TypeOopPtr *t_oop = addr_t->isa_oopptr();
    1.70  
    1.71    assert(mem->is_Phi() && (t_oop != NULL) &&
    1.72 -         t_oop->is_instance_field(), "invalide conditions");
    1.73 +         t_oop->is_known_instance_field(), "invalide conditions");
    1.74  
    1.75    Node *region = mem->in(0);
    1.76    if (region == NULL) {
    1.77 @@ -1314,7 +1307,7 @@
    1.78      }
    1.79      const TypeOopPtr *t_oop = addr_t->isa_oopptr();
    1.80      if (can_reshape && opt_mem->is_Phi() &&
    1.81 -        (t_oop != NULL) && t_oop->is_instance_field()) {
    1.82 +        (t_oop != NULL) && t_oop->is_known_instance_field()) {
    1.83        // Split instance field load through Phi.
    1.84        Node* result = split_through_phi(phase);
    1.85        if (result != NULL) return result;
    1.86 @@ -1549,7 +1542,7 @@
    1.87    }
    1.88  
    1.89    const TypeOopPtr *tinst = tp->isa_oopptr();
    1.90 -  if (tinst != NULL && tinst->is_instance_field()) {
    1.91 +  if (tinst != NULL && tinst->is_known_instance_field()) {
    1.92      // If we have an instance type and our memory input is the
    1.93      // programs's initial memory state, there is no matching store,
    1.94      // so just return a zero of the appropriate type
    1.95 @@ -1631,9 +1624,8 @@
    1.96    assert(adr_type != NULL, "expecting TypeOopPtr");
    1.97  #ifdef _LP64
    1.98    if (adr_type->is_ptr_to_narrowoop()) {
    1.99 -    const TypeNarrowOop* narrowtype = tk->is_oopptr()->make_narrowoop();
   1.100 -    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, narrowtype));
   1.101 -    return DecodeNNode::decode(&gvn, load_klass);
   1.102 +    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop()));
   1.103 +    return new (C, 2) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr());
   1.104    }
   1.105  #endif
   1.106    assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
   1.107 @@ -1843,15 +1835,10 @@
   1.108  //------------------------------Value------------------------------------------
   1.109  const Type *LoadNKlassNode::Value( PhaseTransform *phase ) const {
   1.110    const Type *t = klass_value_common(phase);
   1.111 -
   1.112 -  if (t == TypePtr::NULL_PTR) {
   1.113 -    return TypeNarrowOop::NULL_PTR;
   1.114 -  }
   1.115 -  if (t != Type::TOP && !t->isa_narrowoop()) {
   1.116 -    assert(t->is_oopptr(), "sanity");
   1.117 -    t = t->is_oopptr()->make_narrowoop();
   1.118 -  }
   1.119 -  return t;
   1.120 +  if (t == Type::TOP)
   1.121 +    return t;
   1.122 +
   1.123 +  return t->make_narrowoop();
   1.124  }
   1.125  
   1.126  //------------------------------Identity---------------------------------------
   1.127 @@ -1864,7 +1851,7 @@
   1.128    if( t == Type::TOP ) return x;
   1.129    if( t->isa_narrowoop()) return x;
   1.130  
   1.131 -  return EncodePNode::encode(phase, x);
   1.132 +  return phase->transform(new (phase->C, 2) EncodePNode(x, t->make_narrowoop()));
   1.133  }
   1.134  
   1.135  //------------------------------Value-----------------------------------------
   1.136 @@ -1930,14 +1917,13 @@
   1.137      if (adr->bottom_type()->is_ptr_to_narrowoop() ||
   1.138          (UseCompressedOops && val->bottom_type()->isa_klassptr() &&
   1.139           adr->bottom_type()->isa_rawptr())) {
   1.140 -      const TypePtr* type = val->bottom_type()->is_ptr();
   1.141 -      Node* cp = EncodePNode::encode(&gvn, val);
   1.142 -      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp);
   1.143 +      val = gvn.transform(new (C, 2) EncodePNode(val, val->bottom_type()->make_narrowoop()));
   1.144 +      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, val);
   1.145      } else
   1.146  #endif
   1.147 -      {
   1.148 -        return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
   1.149 -      }
   1.150 +    {
   1.151 +      return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
   1.152 +    }
   1.153    }
   1.154    ShouldNotReachHere();
   1.155    return (StoreNode*)NULL;
   1.156 @@ -2151,7 +2137,7 @@
   1.157    const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr();
   1.158    if (adr_oop == NULL)
   1.159      return false;
   1.160 -  if (!adr_oop->is_instance_field())
   1.161 +  if (!adr_oop->is_known_instance_field())
   1.162      return false; // if not a distinct instance, there may be aliases of the address
   1.163    for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) {
   1.164      Node *use = adr->fast_out(i);

mercurial