RFR: 8269592: [JVMCI] Optimize c2v_iterateFrames

Andreas Woess aw at openjdk.java.net
Fri Jul 9 11:27:52 UTC 2021


On Tue, 29 Jun 2021 17:26:58 GMT, Andreas Woess <aw at openjdk.org> wrote:

> Several smaller optimizations and cleanups to JVMCI's iterateFrames:
> * Restructure the iterateFrames method for better readability and maintenance, with some parts extracted to helper functions.
> * Use vframeStream as the iterator for faster iteration in case not every vframe matches the method filter, so we can avoid creating javaVFrames for skipped vframes. We use vframeStream::asJavaVFrame() to get the current javaVFrame.
> * Extended vframeStream::asJavaVFrame() to also work with native frames, so that it works with all java frames returned by vframeStream. This way, native compiledVFrames will just work and do not need extra handling.
> Test coverage is provided via a newly added iterateFrames jtreg test that includes a JNI call on the stack.
> * Added two trivial getters to vframeStream: vframe_id() and decode_offset().
> These are used together with compiledVFrame::at_scope() to avoid going through vframeStream::asJavaVFrame() and recreating the scope objects for every matched inlined vframe of a compiled frame which would be more expensive than using javaVFrame::sender() (that shares the scope object pool).
> * Only resolve the callback interface method once per iterateFrames call.
> * Only resolve the Method* of the ResolvedJavaMethods to be matched once per iterateFrames call.
> * Only allocate localIsVirtual array if at least one local is virtual (the Java part already expects this).
> * Use matched ResolvedJavaMethod instances instead of going through JVMCIEnv::get_jvmci_method, if possible.

> My concern comes from fact that we don't treat native frame as as java frame: frame.cpp#L183. And frame::is_compiled_frame() specifically checks that compiled method is Java method.

Indeed, there's an inconsistency between `frame` and `vframe` w.r.t. native frames:
* `frame`: `is_java_frame()` and `is_compiled_frame()` return false
* `vframe`: `is_java_frame()` and `is_compiled_frame()` return true (since they're represented as `compiledVFrame`)

I can change the guarantees to asserts.

-------------

PR: https://git.openjdk.java.net/jdk/pull/4625


More information about the hotspot-dev mailing list