comparison src/share/vm/opto/compile.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
1966 case Op_StoreN: 1966 case Op_StoreN:
1967 case Op_LoadB: 1967 case Op_LoadB:
1968 case Op_LoadC: 1968 case Op_LoadC:
1969 case Op_LoadI: 1969 case Op_LoadI:
1970 case Op_LoadKlass: 1970 case Op_LoadKlass:
1971 case Op_LoadNKlass:
1971 case Op_LoadL: 1972 case Op_LoadL:
1972 case Op_LoadL_unaligned: 1973 case Op_LoadL_unaligned:
1973 case Op_LoadPLocked: 1974 case Op_LoadPLocked:
1974 case Op_LoadLLocked: 1975 case Op_LoadLLocked:
1975 case Op_LoadP: 1976 case Op_LoadP:
1995 addp->in(AddPNode::Base)->is_top() || // Top OK for allocation 1996 addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
1996 addp->in(AddPNode::Base) == n->in(AddPNode::Base), 1997 addp->in(AddPNode::Base) == n->in(AddPNode::Base),
1997 "Base pointers must match" ); 1998 "Base pointers must match" );
1998 break; 1999 break;
1999 } 2000 }
2001
2002 #ifdef _LP64
2003 case Op_CmpP:
2004 if( n->in(1)->Opcode() == Op_DecodeN ) {
2005 Compile* C = Compile::current();
2006 Node* in2 = NULL;
2007 if( n->in(2)->Opcode() == Op_DecodeN ) {
2008 in2 = n->in(2)->in(1);
2009 } else if ( n->in(2)->Opcode() == Op_ConP ) {
2010 const Type* t = n->in(2)->bottom_type();
2011 if (t == TypePtr::NULL_PTR) {
2012 Node *in1 = n->in(1);
2013 uint i = 0;
2014 for (; i < in1->outcnt(); i++) {
2015 if (in1->raw_out(i)->is_AddP())
2016 break;
2017 }
2018 if (i >= in1->outcnt()) {
2019 // Don't replace CmpP(o ,null) if 'o' is used in AddP
2020 // to generate implicit NULL check.
2021 in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR);
2022 }
2023 } else if (t->isa_oopptr()) {
2024 in2 = ConNode::make(C, t->is_oopptr()->make_narrowoop());
2025 }
2026 }
2027 if( in2 != NULL ) {
2028 Node* cmpN = new (C, 3) CmpNNode(n->in(1)->in(1), in2);
2029 n->replace_by( cmpN );
2030 }
2031 }
2032 #endif
2000 2033
2001 case Op_ModI: 2034 case Op_ModI:
2002 if (UseDivMod) { 2035 if (UseDivMod) {
2003 // Check if a%b and a/b both exist 2036 // Check if a%b and a/b both exist
2004 Node* d = n->find_similar(Op_DivI); 2037 Node* d = n->find_similar(Op_DivI);