hotspot/src/share/vm/opto/macro.cpp
changeset 371 1aacedc9db7c
parent 360 21d113ecbf6a
child 589 a44a1e70a3e4
child 1374 4c24294029a9
equal deleted inserted replaced
370:33ba64c16c1f 371:1aacedc9db7c
   582         offset = array_base + j * element_size;
   582         offset = array_base + j * element_size;
   583       }
   583       }
   584 
   584 
   585       const Type *field_type;
   585       const Type *field_type;
   586       // The next code is taken from Parse::do_get_xxx().
   586       // The next code is taken from Parse::do_get_xxx().
   587       if (basic_elem_type == T_OBJECT) {
   587       if (basic_elem_type == T_OBJECT || basic_elem_type == T_ARRAY) {
   588         if (!elem_type->is_loaded()) {
   588         if (!elem_type->is_loaded()) {
   589           field_type = TypeInstPtr::BOTTOM;
   589           field_type = TypeInstPtr::BOTTOM;
   590         } else if (field != NULL && field->is_constant()) {
   590         } else if (field != NULL && field->is_constant()) {
   591           // This can happen if the constant oop is non-perm.
   591           // This can happen if the constant oop is non-perm.
   592           ciObject* con = field->constant_value().as_object();
   592           ciObject* con = field->constant_value().as_object();
   594           // and may yield a vacuous result if the field is of interface type.
   594           // and may yield a vacuous result if the field is of interface type.
   595           field_type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
   595           field_type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
   596           assert(field_type != NULL, "field singleton type must be consistent");
   596           assert(field_type != NULL, "field singleton type must be consistent");
   597         } else {
   597         } else {
   598           field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
   598           field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
       
   599         }
       
   600         if (UseCompressedOops) {
       
   601           field_type = field_type->is_oopptr()->make_narrowoop();
       
   602           basic_elem_type = T_NARROWOOP;
   599         }
   603         }
   600       } else {
   604       } else {
   601         field_type = Type::get_const_basic_type(basic_elem_type);
   605         field_type = Type::get_const_basic_type(basic_elem_type);
   602       }
   606       }
   603 
   607 
   657             res->dump();
   661             res->dump();
   658         }
   662         }
   659 #endif
   663 #endif
   660         return false;
   664         return false;
   661       }
   665       }
       
   666       if (UseCompressedOops && field_type->isa_narrowoop()) {
       
   667         // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation
       
   668         // to be able scalar replace the allocation.
       
   669         _igvn.set_delay_transform(false);
       
   670         field_val = DecodeNNode::decode(&_igvn, field_val);
       
   671         _igvn.set_delay_transform(true);
       
   672       }
   662       sfpt->add_req(field_val);
   673       sfpt->add_req(field_val);
   663     }
   674     }
   664     JVMState *jvms = sfpt->jvms();
   675     JVMState *jvms = sfpt->jvms();
   665     jvms->set_endoff(sfpt->req());
   676     jvms->set_endoff(sfpt->req());
   666     // Now make a pass over the debug information replacing any references
   677     // Now make a pass over the debug information replacing any references