381 // | |
381 // | |
382 // Proj #5 ( oop result ) |
382 // Proj #5 ( oop result ) |
383 // | | |
383 // | | |
384 // AddP ( base == address ) |
384 // AddP ( base == address ) |
385 // |
385 // |
386 // case #6. Constant Pool or ThreadLocal or Raw object's field reference: |
386 // case #6. Constant Pool, ThreadLocal, CastX2P or |
387 // ConP # Object from Constant Pool. |
387 // Raw object's field reference: |
|
388 // {ConP, ThreadLocal, CastX2P, raw Load} |
388 // top | |
389 // top | |
389 // \ | |
390 // \ | |
390 // AddP ( base == top ) |
391 // AddP ( base == top ) |
|
392 // |
|
393 // case #7. Klass's field reference. |
|
394 // LoadKlass |
|
395 // | | |
|
396 // AddP ( base == address ) |
391 // |
397 // |
392 Node *base = addp->in(AddPNode::Base)->uncast(); |
398 Node *base = addp->in(AddPNode::Base)->uncast(); |
393 if (base->is_top()) { // The AddP case #3 and #6. |
399 if (base->is_top()) { // The AddP case #3 and #6. |
394 base = addp->in(AddPNode::Address)->uncast(); |
400 base = addp->in(AddPNode::Address)->uncast(); |
395 assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal || |
401 assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal || |
396 base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL || |
402 base->Opcode() == Op_CastX2P || |
397 base->is_Proj() && base->in(0)->is_Allocate(), "sanity"); |
403 (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) || |
|
404 (base->is_Proj() && base->in(0)->is_Allocate()), "sanity"); |
398 } |
405 } |
399 return base; |
406 return base; |
400 } |
407 } |
401 |
408 |
402 static Node* find_second_addp(Node* addp, Node* n) { |
409 static Node* find_second_addp(Node* addp, Node* n) { |