Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/escape.cpp @ 6848:8e47bac5643a
7054512: Compress class pointers after perm gen removal
Summary: support of compress class pointers in the compilers.
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Tue, 09 Oct 2012 10:11:38 +0200 |
parents | 7eca5de9e0b6 |
children | a3ecd773a7b9 |
comparison
equal
deleted
inserted
replaced
6847:65d07d9ee446 | 6848:8e47bac5643a |
---|---|
366 break; | 366 break; |
367 } | 367 } |
368 case Op_CastPP: | 368 case Op_CastPP: |
369 case Op_CheckCastPP: | 369 case Op_CheckCastPP: |
370 case Op_EncodeP: | 370 case Op_EncodeP: |
371 case Op_DecodeN: { | 371 case Op_DecodeN: |
372 case Op_EncodePKlass: | |
373 case Op_DecodeNKlass: { | |
372 add_local_var_and_edge(n, PointsToNode::NoEscape, | 374 add_local_var_and_edge(n, PointsToNode::NoEscape, |
373 n->in(1), delayed_worklist); | 375 n->in(1), delayed_worklist); |
374 break; | 376 break; |
375 } | 377 } |
376 case Op_CMoveP: { | 378 case Op_CMoveP: { |
379 // not defined yet. | 381 // not defined yet. |
380 delayed_worklist->push(n); | 382 delayed_worklist->push(n); |
381 break; | 383 break; |
382 } | 384 } |
383 case Op_ConP: | 385 case Op_ConP: |
384 case Op_ConN: { | 386 case Op_ConN: |
387 case Op_ConNKlass: { | |
385 // assume all oop constants globally escape except for null | 388 // assume all oop constants globally escape except for null |
386 PointsToNode::EscapeState es; | 389 PointsToNode::EscapeState es; |
387 if (igvn->type(n) == TypePtr::NULL_PTR || | 390 if (igvn->type(n) == TypePtr::NULL_PTR || |
388 igvn->type(n) == TypeNarrowOop::NULL_PTR) { | 391 igvn->type(n) == TypeNarrowOop::NULL_PTR) { |
389 es = PointsToNode::NoEscape; | 392 es = PointsToNode::NoEscape; |
456 add_objload_to_connection_graph(n, delayed_worklist); | 459 add_objload_to_connection_graph(n, delayed_worklist); |
457 // fallthrough | 460 // fallthrough |
458 } | 461 } |
459 case Op_StoreP: | 462 case Op_StoreP: |
460 case Op_StoreN: | 463 case Op_StoreN: |
464 case Op_StoreNKlass: | |
461 case Op_StorePConditional: | 465 case Op_StorePConditional: |
462 case Op_CompareAndSwapP: | 466 case Op_CompareAndSwapP: |
463 case Op_CompareAndSwapN: { | 467 case Op_CompareAndSwapN: { |
464 Node* adr = n->in(MemNode::Address); | 468 Node* adr = n->in(MemNode::Address); |
465 const Type *adr_type = igvn->type(adr); | 469 const Type *adr_type = igvn->type(adr); |
466 adr_type = adr_type->make_ptr(); | 470 adr_type = adr_type->make_ptr(); |
467 if (adr_type->isa_oopptr() || | 471 if (adr_type->isa_oopptr() || |
468 (opcode == Op_StoreP || opcode == Op_StoreN) && | 472 (opcode == Op_StoreP || opcode == Op_StoreN || opcode == Op_StoreNKlass) && |
469 (adr_type == TypeRawPtr::NOTNULL && | 473 (adr_type == TypeRawPtr::NOTNULL && |
470 adr->in(AddPNode::Address)->is_Proj() && | 474 adr->in(AddPNode::Address)->is_Proj() && |
471 adr->in(AddPNode::Address)->in(0)->is_Allocate())) { | 475 adr->in(AddPNode::Address)->in(0)->is_Allocate())) { |
472 delayed_worklist->push(n); // Process it later. | 476 delayed_worklist->push(n); // Process it later. |
473 #ifdef ASSERT | 477 #ifdef ASSERT |
570 break; | 574 break; |
571 } | 575 } |
572 case Op_CastPP: | 576 case Op_CastPP: |
573 case Op_CheckCastPP: | 577 case Op_CheckCastPP: |
574 case Op_EncodeP: | 578 case Op_EncodeP: |
575 case Op_DecodeN: { | 579 case Op_DecodeN: |
580 case Op_EncodePKlass: | |
581 case Op_DecodeNKlass: { | |
576 add_local_var_and_edge(n, PointsToNode::NoEscape, | 582 add_local_var_and_edge(n, PointsToNode::NoEscape, |
577 n->in(1), NULL); | 583 n->in(1), NULL); |
578 break; | 584 break; |
579 } | 585 } |
580 case Op_CMoveP: { | 586 case Op_CMoveP: { |
644 } | 650 } |
645 ELSE_FAIL("Op_Return"); | 651 ELSE_FAIL("Op_Return"); |
646 } | 652 } |
647 case Op_StoreP: | 653 case Op_StoreP: |
648 case Op_StoreN: | 654 case Op_StoreN: |
655 case Op_StoreNKlass: | |
649 case Op_StorePConditional: | 656 case Op_StorePConditional: |
650 case Op_CompareAndSwapP: | 657 case Op_CompareAndSwapP: |
651 case Op_CompareAndSwapN: | 658 case Op_CompareAndSwapN: |
652 case Op_GetAndSetP: | 659 case Op_GetAndSetP: |
653 case Op_GetAndSetN: { | 660 case Op_GetAndSetN: { |
659 } | 666 } |
660 } | 667 } |
661 const Type *adr_type = _igvn->type(adr); | 668 const Type *adr_type = _igvn->type(adr); |
662 adr_type = adr_type->make_ptr(); | 669 adr_type = adr_type->make_ptr(); |
663 if (adr_type->isa_oopptr() || | 670 if (adr_type->isa_oopptr() || |
664 (opcode == Op_StoreP || opcode == Op_StoreN) && | 671 (opcode == Op_StoreP || opcode == Op_StoreN || opcode == Op_StoreNKlass) && |
665 (adr_type == TypeRawPtr::NOTNULL && | 672 (adr_type == TypeRawPtr::NOTNULL && |
666 adr->in(AddPNode::Address)->is_Proj() && | 673 adr->in(AddPNode::Address)->is_Proj() && |
667 adr->in(AddPNode::Address)->in(0)->is_Allocate())) { | 674 adr->in(AddPNode::Address)->in(0)->is_Allocate())) { |
668 // Point Address to Value | 675 // Point Address to Value |
669 PointsToNode* adr_ptn = ptnode_adr(adr->_idx); | 676 PointsToNode* adr_ptn = ptnode_adr(adr->_idx); |
2086 base = base->in(AddPNode::Address); | 2093 base = base->in(AddPNode::Address); |
2087 } | 2094 } |
2088 Node* uncast_base = base->uncast(); | 2095 Node* uncast_base = base->uncast(); |
2089 int opcode = uncast_base->Opcode(); | 2096 int opcode = uncast_base->Opcode(); |
2090 assert(opcode == Op_ConP || opcode == Op_ThreadLocal || | 2097 assert(opcode == Op_ConP || opcode == Op_ThreadLocal || |
2091 opcode == Op_CastX2P || uncast_base->is_DecodeN() || | 2098 opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() || |
2092 (uncast_base->is_Mem() && uncast_base->bottom_type() == TypeRawPtr::NOTNULL) || | 2099 (uncast_base->is_Mem() && uncast_base->bottom_type() == TypeRawPtr::NOTNULL) || |
2093 (uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity"); | 2100 (uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity"); |
2094 } | 2101 } |
2095 return base; | 2102 return base; |
2096 } | 2103 } |
2835 alloc_worklist.append_if_missing(addp2); | 2842 alloc_worklist.append_if_missing(addp2); |
2836 } | 2843 } |
2837 alloc_worklist.append_if_missing(use); | 2844 alloc_worklist.append_if_missing(use); |
2838 } else if (use->is_Phi() || | 2845 } else if (use->is_Phi() || |
2839 use->is_CheckCastPP() || | 2846 use->is_CheckCastPP() || |
2840 use->is_EncodeP() || | 2847 use->is_EncodeNarrowPtr() || |
2841 use->is_DecodeN() || | 2848 use->is_DecodeNarrowPtr() || |
2842 (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) { | 2849 (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) { |
2843 alloc_worklist.append_if_missing(use); | 2850 alloc_worklist.append_if_missing(use); |
2844 #ifdef ASSERT | 2851 #ifdef ASSERT |
2845 } else if (use->is_Mem()) { | 2852 } else if (use->is_Mem()) { |
2846 assert(use->in(MemNode::Address) != n, "EA: missing allocation reference path"); | 2853 assert(use->in(MemNode::Address) != n, "EA: missing allocation reference path"); |