Mercurial > hg > truffle
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: |