2285 // 2286 // case #6. Constant Pool, ThreadLocal, CastX2P or 2287 // Raw object's field reference: 2288 // {ConP, ThreadLocal, CastX2P, raw Load} 2289 // top | 2290 // \ | 2291 // AddP ( base == top ) 2292 // 2293 // case #7. Klass's field reference. 2294 // LoadKlass 2295 // | | 2296 // AddP ( base == address ) 2297 // 2298 // case #8. narrow Klass's field reference. 2299 // LoadNKlass 2300 // | 2301 // DecodeN 2302 // | | 2303 // AddP ( base == address ) 2304 // 2305 Node *base = addp->in(AddPNode::Base); 2306 if (base->uncast()->is_top()) { // The AddP case #3 and #6. 2307 base = addp->in(AddPNode::Address); 2308 while (base->is_AddP()) { 2309 // Case #6 (unsafe access) may have several chained AddP nodes. 2310 assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only"); 2311 base = base->in(AddPNode::Address); 2312 } 2313 if (base->Opcode() == Op_CheckCastPP && 2314 base->bottom_type()->isa_rawptr() && 2315 _igvn->type(base->in(1))->isa_oopptr()) { 2316 base = base->in(1); 2317 } else { 2318 Node* uncast_base = base->uncast(); 2319 int opcode = uncast_base->Opcode(); 2320 assert(opcode == Op_ConP || opcode == Op_ThreadLocal || 2321 opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() || 2322 (uncast_base->is_Mem() && (uncast_base->bottom_type()->isa_rawptr() != NULL)) || 2323 (uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity"); 2324 } 2325 } 2326 return base; 2327 } 2328 2329 Node* ConnectionGraph::find_second_addp(Node* addp, Node* n) { 2330 assert(addp->is_AddP() && addp->outcnt() > 0, "Don't process dead nodes"); 2331 Node* addp2 = addp->raw_out(0); 2332 if (addp->outcnt() == 1 && addp2->is_AddP() && 2333 addp2->in(AddPNode::Base) == n && 2334 addp2->in(AddPNode::Address) == addp) { 2335 assert(addp->in(AddPNode::Base) == n, "expecting the same base"); 2336 // | 2285 // 2286 // case #6. Constant Pool, ThreadLocal, CastX2P or 2287 // Raw object's field reference: 2288 // {ConP, ThreadLocal, CastX2P, raw Load} 2289 // top | 2290 // \ | 2291 // AddP ( base == top ) 2292 // 2293 // case #7. Klass's field reference. 2294 // LoadKlass 2295 // | | 2296 // AddP ( base == address ) 2297 // 2298 // case #8. narrow Klass's field reference. 2299 // LoadNKlass 2300 // | 2301 // DecodeN 2302 // | | 2303 // AddP ( base == address ) 2304 // 2305 // case #9. Mixed unsafe access 2306 // {instance} 2307 // | 2308 // CheckCastPP (raw) 2309 // top | 2310 // \ | 2311 // AddP ( base == top ) 2312 // 2313 Node *base = addp->in(AddPNode::Base); 2314 if (base->uncast()->is_top()) { // The AddP case #3, #6, and #9. 2315 base = addp->in(AddPNode::Address); 2316 while (base->is_AddP()) { 2317 // Case #6 (unsafe access) may have several chained AddP nodes. 2318 assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only"); 2319 base = base->in(AddPNode::Address); 2320 } 2321 if (base->Opcode() == Op_CheckCastPP && 2322 base->bottom_type()->isa_rawptr() && 2323 _igvn->type(base->in(1))->isa_oopptr()) { 2324 base = base->in(1); // Case #9 2325 } else { 2326 Node* uncast_base = base->uncast(); 2327 int opcode = uncast_base->Opcode(); 2328 assert(opcode == Op_ConP || opcode == Op_ThreadLocal || 2329 opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() || 2330 (uncast_base->is_Mem() && (uncast_base->bottom_type()->isa_rawptr() != NULL)) || 2331 (uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity"); 2332 } 2333 } 2334 return base; 2335 } 2336 2337 Node* ConnectionGraph::find_second_addp(Node* addp, Node* n) { 2338 assert(addp->is_AddP() && addp->outcnt() > 0, "Don't process dead nodes"); 2339 Node* addp2 = addp->raw_out(0); 2340 if (addp->outcnt() == 1 && addp2->is_AddP() && 2341 addp2->in(AddPNode::Base) == n && 2342 addp2->in(AddPNode::Address) == addp) { 2343 assert(addp->in(AddPNode::Base) == n, "expecting the same base"); 2344 // |