Request for reviews (S): 6836054: java/util/Arrays/CopyMethods.java fails on solaris-sparc with IllegalArgumentException

Tom Rodriguez Thomas.Rodriguez at Sun.COM
Mon May 11 17:26:06 PDT 2009


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