< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page




 800   assert(!(adr_type->isa_aryptr() &&
 801            adr_type->offset() == arrayOopDesc::length_offset_in_bytes()),
 802          "use LoadRangeNode instead");
 803   // Check control edge of raw loads
 804   assert( ctl != NULL || C->get_alias_index(adr_type) != Compile::AliasIdxRaw ||
 805           // oop will be recorded in oop map if load crosses safepoint
 806           rt->isa_oopptr() || is_immutable_value(adr),
 807           "raw memory operations should have control edge");
 808   LoadNode* load = NULL;
 809   switch (bt) {
 810   case T_BOOLEAN: load = new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 811   case T_BYTE:    load = new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 812   case T_INT:     load = new LoadINode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 813   case T_CHAR:    load = new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 814   case T_SHORT:   load = new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 815   case T_LONG:    load = new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency); break;
 816   case T_FLOAT:   load = new LoadFNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency); break;
 817   case T_DOUBLE:  load = new LoadDNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency); break;
 818   case T_ADDRESS: load = new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(),  mo, control_dependency); break;
 819   case T_VALUETYPE:
 820   case T_VALUETYPEPTR:
 821   case T_OBJECT:
 822 #ifdef _LP64
 823     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
 824       load = new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo, control_dependency);
 825     } else
 826 #endif
 827     {
 828       assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
 829       load = new LoadPNode(ctl, mem, adr, adr_type, rt->is_ptr(), mo, control_dependency);
 830     }
 831     break;
 832   default:
 833     ShouldNotReachHere();
 834     break;
 835   }
 836   assert(load != NULL, "LoadNode should have been created");
 837   if (unaligned) {
 838     load->set_unaligned_access();
 839   }
 840   if (mismatched) {




 800   assert(!(adr_type->isa_aryptr() &&
 801            adr_type->offset() == arrayOopDesc::length_offset_in_bytes()),
 802          "use LoadRangeNode instead");
 803   // Check control edge of raw loads
 804   assert( ctl != NULL || C->get_alias_index(adr_type) != Compile::AliasIdxRaw ||
 805           // oop will be recorded in oop map if load crosses safepoint
 806           rt->isa_oopptr() || is_immutable_value(adr),
 807           "raw memory operations should have control edge");
 808   LoadNode* load = NULL;
 809   switch (bt) {
 810   case T_BOOLEAN: load = new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 811   case T_BYTE:    load = new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 812   case T_INT:     load = new LoadINode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 813   case T_CHAR:    load = new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 814   case T_SHORT:   load = new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency); break;
 815   case T_LONG:    load = new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency); break;
 816   case T_FLOAT:   load = new LoadFNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency); break;
 817   case T_DOUBLE:  load = new LoadDNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency); break;
 818   case T_ADDRESS: load = new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(),  mo, control_dependency); break;
 819   case T_VALUETYPE:

 820   case T_OBJECT:
 821 #ifdef _LP64
 822     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
 823       load = new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo, control_dependency);
 824     } else
 825 #endif
 826     {
 827       assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
 828       load = new LoadPNode(ctl, mem, adr, adr_type, rt->is_ptr(), mo, control_dependency);
 829     }
 830     break;
 831   default:
 832     ShouldNotReachHere();
 833     break;
 834   }
 835   assert(load != NULL, "LoadNode should have been created");
 836   if (unaligned) {
 837     load->set_unaligned_access();
 838   }
 839   if (mismatched) {


< prev index next >