comparison src/share/vm/opto/escape.cpp @ 164:c436414a719e

6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions Summary: Add LoadNKlass and CMoveN nodes, use CmpN and ConN nodes to generate narrow oops compare instructions. Reviewed-by: never, rasbold
author kvn
date Wed, 21 May 2008 13:46:23 -0700
parents 885ed790ecf0
children 7793bd37a336
comparison
equal deleted inserted replaced
163:885ed790ecf0 164:c436414a719e
415 // case #7. Klass's field reference. 415 // case #7. Klass's field reference.
416 // LoadKlass 416 // LoadKlass
417 // | | 417 // | |
418 // AddP ( base == address ) 418 // AddP ( base == address )
419 // 419 //
420 // case #8. narrow Klass's field reference.
421 // LoadNKlass
422 // |
423 // DecodeN
424 // | |
425 // AddP ( base == address )
426 //
420 Node *base = addp->in(AddPNode::Base)->uncast(); 427 Node *base = addp->in(AddPNode::Base)->uncast();
421 if (base->is_top()) { // The AddP case #3 and #6. 428 if (base->is_top()) { // The AddP case #3 and #6.
422 base = addp->in(AddPNode::Address)->uncast(); 429 base = addp->in(AddPNode::Address)->uncast();
423 assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal || 430 assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal ||
424 base->Opcode() == Op_CastX2P || 431 base->Opcode() == Op_CastX2P || base->Opcode() == Op_DecodeN ||
425 (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) || 432 (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) ||
426 (base->is_Proj() && base->in(0)->is_Allocate()), "sanity"); 433 (base->is_Proj() && base->in(0)->is_Allocate()), "sanity");
427 } 434 }
428 return base; 435 return base;
429 } 436 }
1571 Node *k = call->in(AllocateNode::KlassNode); 1578 Node *k = call->in(AllocateNode::KlassNode);
1572 const TypeKlassPtr *kt; 1579 const TypeKlassPtr *kt;
1573 if (k->Opcode() == Op_LoadKlass) { 1580 if (k->Opcode() == Op_LoadKlass) {
1574 kt = k->as_Load()->type()->isa_klassptr(); 1581 kt = k->as_Load()->type()->isa_klassptr();
1575 } else { 1582 } else {
1583 // Also works for DecodeN(LoadNKlass).
1576 kt = k->as_Type()->type()->isa_klassptr(); 1584 kt = k->as_Type()->type()->isa_klassptr();
1577 } 1585 }
1578 assert(kt != NULL, "TypeKlassPtr required."); 1586 assert(kt != NULL, "TypeKlassPtr required.");
1579 ciKlass* cik = kt->klass(); 1587 ciKlass* cik = kt->klass();
1580 ciInstanceKlass* ciik = cik->as_instance_klass(); 1588 ciInstanceKlass* ciik = cik->as_instance_klass();
1809 // assume that all exception objects globally escape 1817 // assume that all exception objects globally escape
1810 add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); 1818 add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
1811 break; 1819 break;
1812 } 1820 }
1813 case Op_LoadKlass: 1821 case Op_LoadKlass:
1822 case Op_LoadNKlass:
1814 { 1823 {
1815 add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); 1824 add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
1816 break; 1825 break;
1817 } 1826 }
1818 case Op_LoadP: 1827 case Op_LoadP:
2023 { 2032 {
2024 assert(false, "Op_CreateEx"); 2033 assert(false, "Op_CreateEx");
2025 break; 2034 break;
2026 } 2035 }
2027 case Op_LoadKlass: 2036 case Op_LoadKlass:
2037 case Op_LoadNKlass:
2028 { 2038 {
2029 assert(false, "Op_LoadKlass"); 2039 assert(false, "Op_LoadKlass");
2030 break; 2040 break;
2031 } 2041 }
2032 case Op_LoadP: 2042 case Op_LoadP: