I attempted to look at heap-scoping today and ran into a couple things
> that kept me from making much progress.
>
> 1. Pre/post logic for heap scope and frame
>
> ...
> I believe we need to move more into explicit call protocols
> (instructions to push scope/frame/binding, etc) in the IR, so I can
> simply emit the right instructions. I have been unable to find any
> method that compiles with explicit call protocols so far.
>

Agreed. Look in passes/AddCallProtocolInstructions.java
Right now, it has to be explicitly enabled by adding to the list of default
passes run.

jruby -X+CIR
-Xir.passes=OptimizeTempVarsPass,LocalOptimizationPass,AddCallProtocolInstructions,LinearizeCFG
foo.rb

You can check the logic for these instructions in Interpreter.java
(PUSH/POP FRAME/BINDING operations).

Caveats:

1. I had tested this about a year back and had ironed out bugs, but I
haven't really run rubyspecs since then with all these passes enabled to
see if there are bugs, but these bug fixes should be independent of you
being able to use them.

2. This still leaves one last bit of pre/post logic that hasn't made it
into instructions (that I discovered couple months back), and that is
push/pop backtraces. It is simple to add. But for now, if you simply
ignored backtraces for now (and wait or add push/pop backtrace instructions
to IR), there is zero pre/post logic that you would need to add to IR JIT
while compiling methods.

3. These instructions are only added to Method scopes, not block scopes
because block scopes are significantly more hairy with all kinds of
argument lining up and massaging that needs to get done. Tom, you, and I
have talked about converting these to explicit instructions at different
points, but this will require more thinking and working through because
JRuby runtime code paths also call blocks directly which complicates the
picture a bit. But, this can be solved if we sit down, brainstorm and work
through it.

2. RuntimeHelperCall and related methods
>
> This logic is used for handling non-local break and return.
> Unfortunately it uses rather complicated logic that depends on having
> the original IRScope around. Encoding all the necessary information
> into the jitted output started to look pretty hairy, so I passed on it
> for now.
>
> The three methods this instructions calls should probably be stood up
> as their own operations.
>

The primary motivation for current design of non-local break/return
handling is to purge jruby's core libraries (Enumerable, Enumerator, Proc,
etc.) from all traces of needing to handle breaks and non-local returns. I
think that goal has been accomplished since the interpreter's
break/non-local return handling is completely localized to the ir
implementation without leaking into the core libraries.

With an eye towards IR JIT, I cleaned up the previous version of
break/non-local return handling in the interpreter and embedded all logic
into three runtime-helper calls (which are generated as a
RuntimeHelperInstr instruction in IR). But, looks like I did not finish up
the last bit that was required -- that is removing IRScope as an argument
to RuntimeHelperInstr.callHelper(...) which is what you are blocked by. At
first glance, it appears that IRScope that is used there should be
retrievable by looking at currDynScope.getStaticScope().getIRScope() where
you cast getStaticScope() into an IRStaticScope. I haven't tried this, but
maybe you can give this a shot in Interpreter.java /
RuntimeHelperInstr.java or in JIT directly to see if that works. If it
does, then this should solve this blocker for you.

I am busy rest of the day today, but if you dont get to it before me, I'll
give it a shot tomorrow.

Exciting to see IR JIT filling up and being able to identify blockers and
necessary IR tweaks to streamline it. I think we'll need some more
iterating over the current IR design to make it smooth both for interpreter
and the JIT, but I think we are getting quite close.

Subbu.

Reply via email to