uncommon trap for athrow

John Rose John.Rose at Sun.COM
Wed Sep 9 19:31:45 PDT 2009


On Sep 9, 2009, at 4:27 PM, Tom Rodriguez wrote:

> We got in a report, 6877221, complaining about the use of the  
> uncommon trap below for handling of an athrow.  Anyone understand  
> why we use an uncommon trap here to dispatch an exception?

That was a long time ago...

That code gets used when a non-call bytecode needs to raise an  
exception, and also the method itself has local exception handlers.   
So in that case the compiler needs to wire up the potential local  
transfers of control between N non-call sites and M handlers.  The  
wire-up is done by calling rethrow and then processing its result with  
catch_call_exceptions, which will eventually set up PC-to-PC mapping  
tables.

(Confusingly, the rethrow stub jumps to the nmethod's sole exception  
handler area, which itself is always just a call to the exception  
blob, which after lots of waste movement calls  
SharedRuntime::compute_compiled_exc_handler.  The PC returned by that  
guy is either an unwinder routine, or else a local PC prepared by  
catch_call_exceptions.)

I suppose it would work to remove the code the customer is complaining  
about, but it might cause catch_call_exceptions to create a large  
number of a control flow edges.  This in turn could degrade code  
quality and/or slow down compile times.  Remember that an uncommon  
trap is cheaper than a branch, because the state along the trapping  
edge goes away, and does not affect downstream optimization or  
register allocation.

It's maybe worth an experiment to remove that trap.  It would be easy  
to put the uncommon trap under a switch.

-- John


More information about the hotspot-compiler-dev mailing list