< 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 >