< prev index next >

src/share/vm/opto/compile.cpp

Print this page
rev 10974 : 8155729: C2: Skip transformation of LoadConP for heap-based compressed oops
Reviewed-by:

*** 2850,2868 **** #ifdef _LP64 if ((UseCompressedOops || UseCompressedClassPointers) && addp->Opcode() == Op_ConP && addp == n->in(AddPNode::Base) && n->in(AddPNode::Offset)->is_Con()) { // Use addressing with narrow klass to load with offset on x86. ! // On sparc loading 32-bits constant and decoding it have less ! // instructions (4) then load 64-bits constant (7). // Do this transformation here since IGVN will convert ConN back to ConP. const Type* t = addp->bottom_type(); ! if (t->isa_oopptr() || t->isa_klassptr()) { Node* nn = NULL; ! int op = t->isa_oopptr() ? Op_ConN : Op_ConNKlass; // Look for existing ConN node of the same exact type. Node* r = root(); uint cnt = r->outcnt(); for (uint i = 0; i < cnt; i++) { --- 2850,2873 ---- #ifdef _LP64 if ((UseCompressedOops || UseCompressedClassPointers) && addp->Opcode() == Op_ConP && addp == n->in(AddPNode::Base) && n->in(AddPNode::Offset)->is_Con()) { + // If the transformation of ConP to ConN+DecodeN is beneficial depends + // on the platform and on the compressed oops mode. // Use addressing with narrow klass to load with offset on x86. ! // Some platforms can use the constant pool to load ConP. // Do this transformation here since IGVN will convert ConN back to ConP. const Type* t = addp->bottom_type(); ! bool is_oop = t->isa_oopptr(), ! is_klass = t->isa_klassptr(); ! ! if ((is_oop && Matcher::const_oop_prefer_decode() ) || ! (is_klass && Matcher::const_klass_prefer_decode())) { Node* nn = NULL; ! int op = is_oop ? Op_ConN : Op_ConNKlass; // Look for existing ConN node of the same exact type. Node* r = root(); uint cnt = r->outcnt(); for (uint i = 0; i < cnt; i++) {
*** 2874,2884 **** } } if (nn != NULL) { // Decode a narrow oop to match address // [R12 + narrow_oop_reg<<3 + offset] ! if (t->isa_oopptr()) { nn = new DecodeNNode(nn, t); } else { nn = new DecodeNKlassNode(nn, t); } // Check for succeeding AddP which uses the same Base. --- 2879,2889 ---- } } if (nn != NULL) { // Decode a narrow oop to match address // [R12 + narrow_oop_reg<<3 + offset] ! if (is_oop) { nn = new DecodeNNode(nn, t); } else { nn = new DecodeNKlassNode(nn, t); } // Check for succeeding AddP which uses the same Base.
< prev index next >