Request for prereviews (S): 7047954: VM crashes with assert(is_Mem()) failed: invalid node class

Vladimir Kozlov vladimir.kozlov at
Thu May 26 15:27:34 PDT 2011

Fixed 7047954: VM crashes with assert(is_Mem()) failed: invalid node class

It was exposed by is_scavengable change. Final static array pointer was replaced 
with ConP. The main problem is a constant array pointer does not alias with 
other array pointers (see Compile::flatten_alias_type()). As result the address 
of a store has different memory slice (idx=4) than calculated memory slice 
affected by the store (idx=5):

  75     StoreI  ===  61  46  73  20  [[ 95  81 ]]  @int[int:>=0]:exact+any *, 
idx=5;  Memory: @int[int:1000000]<ciTypeArray length=1000000 
type=<ciTypeArrayKlass name=[I ident=686 PERM address=0x8482d20> ident=696 
address=0x8527328>+any *, idx=4; !jvms: ReadAfterWrite::main @ bci:16

It happened because when a store to array is created the type of affected memory 
is calculated using general array type TypeAryPtr::get_array_body_type(elem_type).

So we either should allow a constant array pointer alias with other array 
pointers or check if an array ptr is constant and use its type instead of 
general one. I used second approach and fixed all places where 
get_array_body_type() was used. But I need your opinion on this. Based on 
previous Tom's comment we should not convert array pointers to constant (can we 
have arrays in Perm?). But then there is invoke dynamic case and I am not sure 
that we will not get constant arrays from it.


More information about the hotspot-compiler-dev mailing list