src/share/vm/opto/escape.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/escape.cpp

Print this page




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     //


src/share/vm/opto/escape.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File