< prev index next >

src/share/vm/opto/library_call.cpp

Print this page

        

*** 2634,2645 **** // Try to categorize the address. If it comes up as TypeJavaPtr::BOTTOM, // there was not enough information to nail it down. Compile::AliasType* alias_type = C->alias_type(adr_type); assert(alias_type->index() != Compile::AliasIdxBot, "no bare pointers here"); ! assert(alias_type->adr_type() == TypeRawPtr::BOTTOM || alias_type->adr_type() == TypeOopPtr::BOTTOM || ! alias_type->basic_type() != T_ILLEGAL, "field, array element or unknown"); bool mismatched = false; BasicType bt = alias_type->basic_type(); if (bt != T_ILLEGAL) { if (bt == T_BYTE && adr_type->isa_aryptr()) { // Alias type doesn't differentiate between byte[] and boolean[]). --- 2634,2650 ---- // Try to categorize the address. If it comes up as TypeJavaPtr::BOTTOM, // there was not enough information to nail it down. Compile::AliasType* alias_type = C->alias_type(adr_type); assert(alias_type->index() != Compile::AliasIdxBot, "no bare pointers here"); ! // Only field, array element or unknown locations are supported. ! if (alias_type->adr_type() != TypeRawPtr::BOTTOM && ! alias_type->adr_type() != TypeOopPtr::BOTTOM && ! alias_type->basic_type() == T_ILLEGAL) { ! return false; ! } ! bool mismatched = false; BasicType bt = alias_type->basic_type(); if (bt != T_ILLEGAL) { if (bt == T_BYTE && adr_type->isa_aryptr()) { // Alias type doesn't differentiate between byte[] and boolean[]).
*** 2958,2973 **** offset = argument(2); // type: long oldval = NULL; newval = argument(4); // type: oop, int, or long } - // Null check receiver. - receiver = null_check(receiver); - if (stopped()) { - return true; - } - // Build field offset expression. // We currently rely on the cookies produced by Unsafe.xxxFieldOffset // to be plain byte offsets, which are also the same as those accepted // by oopDesc::field_base. assert(Unsafe_field_offset_to_byte_offset(11) == 11, "fieldOffset must be byte-scaled"); --- 2963,2972 ----
*** 2975,2986 **** offset = ConvL2X(offset); Node* adr = make_unsafe_address(base, offset); const TypePtr *adr_type = _gvn.type(adr)->isa_ptr(); Compile::AliasType* alias_type = C->alias_type(adr_type); - assert(alias_type->adr_type() == TypeRawPtr::BOTTOM || alias_type->adr_type() == TypeOopPtr::BOTTOM || - alias_type->basic_type() != T_ILLEGAL, "field, array element or unknown"); BasicType bt = alias_type->basic_type(); if (bt != T_ILLEGAL && ((bt == T_OBJECT || bt == T_ARRAY) != (type == T_OBJECT))) { // Don't intrinsify mismatched object accesses. return false; --- 2974,2983 ----
*** 2996,3005 **** --- 2993,3008 ---- if (tjp != NULL) { value_type = tjp; } } + // Null check receiver. + receiver = null_check(receiver); + if (stopped()) { + return true; + } + int alias_idx = C->get_alias_index(adr_type); // Memory-model-wise, a LoadStore acts like a little synchronized // block, so needs barriers on each side. These don't translate // into actual barriers on most machines, but we still need rest of
< prev index next >