comparison src/share/vm/opto/escape.cpp @ 5954:ed4c92f54c2d

7154997: assert(false) failed: not G1 barrier raw StoreP Summary: Skip only G1 cases and explicitly set global escape state in unsafe cases. Reviewed-by: never
author kvn
date Tue, 20 Mar 2012 13:10:13 -0700
parents ee138854b3a6
children 1d7922586cf6
comparison
equal deleted inserted replaced
5953:1a11548571e8 5954:ed4c92f54c2d
465 if (adr_type == TypeRawPtr::NOTNULL) { 465 if (adr_type == TypeRawPtr::NOTNULL) {
466 // Verify a raw address for a store captured by Initialize node. 466 // Verify a raw address for a store captured by Initialize node.
467 int offs = (int)igvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot); 467 int offs = (int)igvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
468 assert(offs != Type::OffsetBot, "offset must be a constant"); 468 assert(offs != Type::OffsetBot, "offset must be a constant");
469 } 469 }
470 #endif
470 } else { 471 } else {
471 // Ignore copy the displaced header to the BoxNode (OSR compilation). 472 // Ignore copy the displaced header to the BoxNode (OSR compilation).
472 if (adr->is_BoxLock()) 473 if (adr->is_BoxLock())
473 break; 474 break;
474 475 // Stored value escapes in unsafe access.
475 if (!adr->is_AddP()) { 476 if ((opcode == Op_StoreP) && (adr_type == TypeRawPtr::BOTTOM)) {
476 n->dump(1); 477 // Pointer stores in G1 barriers looks like unsafe access.
477 assert(adr->is_AddP(), "expecting an AddP"); 478 // Ignore such stores to be able scalar replace non-escaping
478 } 479 // allocations.
479 // Ignore G1 barrier's stores. 480 if (UseG1GC && adr->is_AddP()) {
480 if (!UseG1GC || (opcode != Op_StoreP) || 481 Node* base = get_addp_base(adr);
481 (adr_type != TypeRawPtr::BOTTOM)) { 482 if (base->Opcode() == Op_LoadP &&
482 n->dump(1); 483 base->in(MemNode::Address)->is_AddP()) {
483 assert(false, "not G1 barrier raw StoreP"); 484 adr = base->in(MemNode::Address);
484 } 485 Node* tls = get_addp_base(adr);
486 if (tls->Opcode() == Op_ThreadLocal) {
487 int offs = (int)igvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
488 if (offs == in_bytes(JavaThread::satb_mark_queue_offset() +
489 PtrQueue::byte_offset_of_buf())) {
490 break; // G1 pre barier previous oop value store.
491 }
492 if (offs == in_bytes(JavaThread::dirty_card_queue_offset() +
493 PtrQueue::byte_offset_of_buf())) {
494 break; // G1 post barier card address store.
495 }
496 }
497 }
498 }
499 delayed_worklist->push(n); // Process unsafe access later.
500 break;
501 }
502 #ifdef ASSERT
503 n->dump(1);
504 assert(false, "not unsafe or G1 barrier raw StoreP");
485 #endif 505 #endif
486 } 506 }
487 break; 507 break;
488 } 508 }
489 case Op_AryEq: 509 case Op_AryEq:
633 adr_ptn->as_Field()->is_oop(), "node should be registered"); 653 adr_ptn->as_Field()->is_oop(), "node should be registered");
634 Node *val = n->in(MemNode::ValueIn); 654 Node *val = n->in(MemNode::ValueIn);
635 PointsToNode* ptn = ptnode_adr(val->_idx); 655 PointsToNode* ptn = ptnode_adr(val->_idx);
636 assert(ptn != NULL, "node should be registered"); 656 assert(ptn != NULL, "node should be registered");
637 add_edge(adr_ptn, ptn); 657 add_edge(adr_ptn, ptn);
658 break;
659 } else if ((opcode == Op_StoreP) && (adr_type == TypeRawPtr::BOTTOM)) {
660 // Stored value escapes in unsafe access.
661 Node *val = n->in(MemNode::ValueIn);
662 PointsToNode* ptn = ptnode_adr(val->_idx);
663 assert(ptn != NULL, "node should be registered");
664 ptn->set_escape_state(PointsToNode::GlobalEscape);
665 // Add edge to object for unsafe access with offset.
666 PointsToNode* adr_ptn = ptnode_adr(adr->_idx);
667 assert(adr_ptn != NULL, "node should be registered");
668 if (adr_ptn->is_Field()) {
669 assert(adr_ptn->as_Field()->is_oop(), "should be oop field");
670 add_edge(adr_ptn, ptn);
671 }
638 break; 672 break;
639 } 673 }
640 ELSE_FAIL("Op_StoreP"); 674 ELSE_FAIL("Op_StoreP");
641 } 675 }
642 case Op_AryEq: 676 case Op_AryEq: