< prev index next >

src/share/vm/opto/library_call.cpp

Print this page
rev 14282 : Factor out keep-alive barrier from usual pre-barrier implementations.


6216 
6217 //----------------------------inline_reference_get----------------------------
6218 // public T java.lang.ref.Reference.get();
6219 bool LibraryCallKit::inline_reference_get() {
6220   const int referent_offset = java_lang_ref_Reference::referent_offset;
6221   guarantee(referent_offset > 0, "should have already been set");
6222 
6223   // Get the argument:
6224   Node* reference_obj = null_check_receiver();
6225   if (stopped()) return true;
6226 
6227   Node* adr = basic_plus_adr(reference_obj, reference_obj, referent_offset);
6228 
6229   ciInstanceKlass* klass = env()->Object_klass();
6230   const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass);
6231 
6232   Node* no_ctrl = NULL;
6233   Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT, MemNode::unordered);
6234 
6235   // Use the pre-barrier to record the value in the referent field
6236   pre_barrier(false /* do_load */,
6237               control(),
6238               NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */,
6239               result /* pre_val */,
6240               T_OBJECT);
6241 
6242   // Add memory barrier to prevent commoning reads from this field
6243   // across safepoint since GC can change its value.
6244   insert_mem_bar(Op_MemBarCPUOrder);
6245 
6246   set_result(result);
6247   return true;
6248 }
6249 
6250 
6251 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString,
6252                                               bool is_exact=true, bool is_static=false,
6253                                               ciInstanceKlass * fromKls=NULL) {
6254   if (fromKls == NULL) {
6255     const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
6256     assert(tinst != NULL, "obj is null");
6257     assert(tinst->klass()->is_loaded(), "obj is not loaded");
6258     assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
6259     fromKls = tinst->klass()->as_instance_klass();
6260   } else {




6216 
6217 //----------------------------inline_reference_get----------------------------
6218 // public T java.lang.ref.Reference.get();
6219 bool LibraryCallKit::inline_reference_get() {
6220   const int referent_offset = java_lang_ref_Reference::referent_offset;
6221   guarantee(referent_offset > 0, "should have already been set");
6222 
6223   // Get the argument:
6224   Node* reference_obj = null_check_receiver();
6225   if (stopped()) return true;
6226 
6227   Node* adr = basic_plus_adr(reference_obj, reference_obj, referent_offset);
6228 
6229   ciInstanceKlass* klass = env()->Object_klass();
6230   const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass);
6231 
6232   Node* no_ctrl = NULL;
6233   Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT, MemNode::unordered);
6234 
6235   // Use the pre-barrier to record the value in the referent field
6236   keep_alive_barrier(control(), result);




6237 
6238   // Add memory barrier to prevent commoning reads from this field
6239   // across safepoint since GC can change its value.
6240   insert_mem_bar(Op_MemBarCPUOrder);
6241 
6242   set_result(result);
6243   return true;
6244 }
6245 
6246 
6247 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString,
6248                                               bool is_exact=true, bool is_static=false,
6249                                               ciInstanceKlass * fromKls=NULL) {
6250   if (fromKls == NULL) {
6251     const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
6252     assert(tinst != NULL, "obj is null");
6253     assert(tinst->klass()->is_loaded(), "obj is not loaded");
6254     assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
6255     fromKls = tinst->klass()->as_instance_klass();
6256   } else {


< prev index next >