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);