[9] RFR (S): 8033626: assert(ex_map->jvms()->same_calls_as(_exceptions->jvms())) failed: all collected exceptions must come from the same place

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Mon Jun 9 16:58:07 UTC 2014


https://bugs.openjdk.java.net/browse/JDK-8033626
http://cr.openjdk.java.net/~vlivanov/8033626/webrev.01/

For polymorphic case of Object::clone call site, call generator of the 
following shape is used:
   PredictedCallGenerator
     _if_hit: LibraryIntrinsic (LibraryCallKit::inline_native_clone)
     _if_missed: VirtualCallGenerator

The problem is that Object::clone intrinsic is generated with 
reexecute=true, while the branch with virtual dispatch has reexecute=false.

The fix is to bail out to interpreter if any exception is encountered.
There's no need to update exception state. When reexecuting the call, 
native version of Object::clone (JVM_Clone) will be invoked.

Controlling exception handling explicitly by passing 
deoptimize_on_exception parameters looks cleaner to me, than having a 
check (is_LibraryCallKit() or JVMS reexecute bit) burden in 
GraphKit::make_slow_call_ex.

I fixed only Object::clone case, since I don't see other places where 
similar IR shape can be produced.

Also, I didn't touch array cloning case because I don't see any 
possibility to have a polymorphic Object::clone call site for arrays 
(it's not the case for object arrays of different types and primitive 
arrays can't be intermixed with object arrays).

Testing: regression tests, jprt, CTW, manual (instrumented JVM which 
always throws OOM from OptoRuntime::new_instance_C)

Thanks!

Best regards,
Vladimir Ivanov


More information about the hotspot-compiler-dev mailing list