Request for reviews (S): 6836054: java/util/Arrays/CopyMethods.java fails on solaris-sparc with IllegalArgumentException
Vladimir Kozlov
Vladimir.Kozlov at Sun.COM
Mon May 11 17:45:34 PDT 2009
Thanks. I fixed typo.
Vladimir
Tom Rodriguez wrote:
> Right. I get what you're saying and I think I follow it now. Looks
> good apart from the typo: accept -> except.
>
> tom
>
> On May 11, 2009, at 12:00 PM, Vladimir Kozlov wrote:
>
>> Sorry for long output. Here is the generated code which
>> loads the allocation's actual type dynamically:
>>
>> 195 ConL === 0 [[ 196 211 ]] #long:24
>> 190 CastPP === 182 11 [[ 176 196 196 206 242 ]]
>> #java/lang/Class:NotNull:exact * Oop:java/lang/Class:NotNull:exact *
>> !jvms: Array::newInstance @ bci:2 CopyMethods::makeArray @ bci:2
>> CopyMethods::fullTests @ bci:72
>> 196 AddP === _ 190 190 195 [[ 197 ]]
>> Oop:java/lang/Class:NotNull:exact+24 * !jvms: Array::newInstance @
>> bci:2 CopyMethods::makeArray @ bci:2 CopyMethods::fullTests @ bci:72
>> 197 LoadKlass === _ 7 196 [[ 198 203 ]] @rawptr:BotPTR,
>> idx=Raw; # * Klass: * !jvms: Array::newInstance @ bci:2
>> CopyMethods::makeArray @ bci:2 CopyMethods::fullTests @ bci:72
>> 203 CastPP === 202 197 [[ 211 211 234 ]] #klass
>> java/lang/Object: 0x00000000004bcd58 * Klass:klass java/lang/Object:
>> 0x00000000004bcd58 * !jvms: Array::newInstance @ bci:2
>> CopyMethods::makeArray @ bci:2 CopyMethods::fullTests @ bci:72
>> 234 AllocateArray === 202 91 92 8 1 ( 232 203 24 24 10
>> 11 68 130 24 1 1 1 1 1 1 24 11 1 1 1 1 ) [[ 235 236
>> 237 244 245 246 ]] rawptr:NotNull ( int:>=0,
>> java/lang/Object:NotNull *, bool, int ) Array::newInstance @ bci:2
>> CopyMethods::makeArray @ bci:2 CopyMethods::fullTests @ bci:72 !jvms:
>> Array::newInstance @ bci:2 CopyMethods::makeArray @ bci:2
>> CopyMethods::fullTests @ bci:72
>>
>> Vladimir
>>
>> Vladimir Kozlov wrote:
>>> We don't know statically during a method compilation the actual type
>>> because it is loaded dynamically for reflaction allocation.
>>> Escape Analysis requires to know the type statically to pass it to
>>> debug info:
>>> const Type *t = local->bottom_type();
>>> // Is it a safepoint scalar object node?
>>> if (local->is_SafePointScalarObject()) {
>>> SafePointScalarObjectNode* spobj = local->as_SafePointScalarObject();
>>> ObjectValue* sv = Compile::sv_for_node_id(objs, spobj->_idx);
>>> if (sv == NULL) {
>>> ciKlass* cik = t->is_oopptr()->klass();
>>> assert(cik->is_instance_klass() ||
>>> cik->is_array_klass(), "Not supported allocation.");
>>> sv = new ObjectValue(spobj->_idx,
>>> new ConstantOopWriteValue(cik->encoding()));
>>> Vladimir
>>> Tom Rodriguez wrote:
>>>> I have to admit I don't really follow this logic in the code. How
>>>> is it that we can allocate something but not know it's actual type?
>>>> Isn't that required to emit the allocation in the first place?
>>>>
>>>> tom
>>>>
>>>> On May 7, 2009, at 8:29 PM, Vladimir Kozlov wrote:
>>>>
>>>>>
>>>>> http://cr.openjdk.java.net/~kvn/6836054/webrev.00
>>>>>
>>>>> Fixed 6836054: java/util/Arrays/CopyMethods.java fails on
>>>>> solaris-sparc with IllegalArgumentException
>>>>>
>>>>> Problem:
>>>>> Escape Analysis requires that allocations should have
>>>>> exact type (by using CheckCastPP node) for restoring
>>>>> objects during deoptimization. But reflection allocation
>>>>> set type to j.l.Object assuming that caller will cast
>>>>> to exact type. In the failing case there is no cast
>>>>> to array type so debug info contains incorrect type
>>>>> (j.l.Object) for scalar replaced array allocation.
>>>>> It causes the Exception after deoptimization.
>>>>>
>>>>> Solution:
>>>>> Do not mark an allocation as scalar replaceable if
>>>>> it does not have exact type.
>>>>>
>>>>> Reviewed by:
>>>>>
>>>>> Fix verified (y/n): y, bugs case
>>>>>
>>>>> Other testing:
>>>>> JPRT, CTW
>>>>>
>>>>
>
More information about the hotspot-compiler-dev
mailing list