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