[webkit-dev] LLInt without JIT

Gabor Rapcsanyi rgabor at inf.u-szeged.hu
Wed Mar 13 11:05:12 PDT 2013


Hello!

I tried to compile JSC with LLInt CLoop backend and JIT but it didn't 
work for me. I tried it on Mac and Linux as well.
When I looked into it a little I saw some strange guards like this:

Source/JavaScriptCore/llint/LLIntOpcode.h

#if ENABLE(LLINT_C_LOOP)

#define FOR_EACH_LLINT_NOJIT_NATIVE_HELPER(macro) \
     macro(getHostCallReturnValue, 1) \
     macro(ctiOpThrowNotCaught, 1)

#else // !ENABLE(LLINT_C_LOOP)

#define FOR_EACH_LLINT_NOJIT_NATIVE_HELPER(macro) \
     // Nothing to do here. Use the JIT impl instead.

#endif // !ENABLE(LLINT_C_LOOP)


It seems if we have CLoop we don't have JIT.
So is this configuration supported anyway or we just want to use CLoop 
backend if we don't have JIT support?

Regards,
   -Gabor


> Awesome, thanks for the detailed response.
>
> I did not realize that going to the assembly backend would not produce 
> a substantial improvement.  But after you explanation, I can see the 
> reasons.
>
> I'll do some more testing to see the impact.  If I see it to 
> be worthwhile and I can fix it, I'll submit a patch, otherwise a bug.
>
>
> On Fri, Mar 8, 2013 at 11:28 PM, Filip Pizlo <fpizlo at apple.com 
> <mailto:fpizlo at apple.com>> wrote:
>
>     Yes.  You can use the assembly LLInt backend without using the
>     JIT.  That's how I was running it when I first wrote it.
>
>     I think that the code in Platform.h is being conservative, in the
>     sense that it assumes that if ENABLE(JIT) is not set then you're
>     compiling for a target that the LLInt wouldn't have a backend for.
>      This makes sense, if you think about it: ENABLE_JIT is defined to
>     1 if we detect that we are on a hardware/OS configuration that the
>     JIT knows how to handle, and the LLInt has backends for strictly
>     fewer platforms than the JIT has backends for: JIT supports x86
>     (32 and 64), ARM (traditional and THUMB2), MIPS, and SH4; while
>     the LLInt currently only supports x86 (32 and 64), ARM THUMB2, and
>     MIPS.  In short, requiring the JIT to use LLInt assembly backends
>     is not a strong requirement of the LLInt; it's just an artifact of
>     Platform.h's logic.
>
>     On hardware/OS configurations where ENABLE(JIT) is set, and the
>     LLInt is compiled to assembly, it is still possible to run with
>     the JIT disabled. The JIT ends up being disabled at run-time in
>     that case. We often use this for testing - you can set the
>     JSC_useJIT environment variable to 'false' and then you're running
>     in a LLInt-only mode. This allows for quickly checking if a bug is
>     due to the JITs, or not.
>
>     But I would also note that the purpose of the LLInt assembly
>     backends is _not_ performance of the LLInt itself, but for
>     performance of the triple-tier system as a whole.  What those
>     assembly backends give us is the ability to run the LLInt using
>     the same ABI that the JSC JITs use; this in turn allows us to do
>     two things: (1) zero-cost OSR from the LLInt to the baseline JIT,
>     and (2) perform every JS function call assuming opportunistically
>     that the callee has been JITed; if it isn't then the machine code
>     entrypoint that the callee reports is just the shared LLInt
>     entrypoint.  That entrypoint, in turn, doesn't really have to do
>     anything special - it just loads the callee from the callee stack
>     frame, loads the bytecode pointer from the callee, and
>     indirect-jumps into the first bytecode instruction.  We wouldn't
>     be able to do either (1) or (2) easily with a C (or C++)
>     interpreter. I mean, we could do it, but JIT->interpreter calls
>     would be more expensive (because of the need to set up a C
>     interpreter stack frame). And OSR would take more effort - it
>     wouldn't be possible for the LLInt to just jump straight into
>     JITed code like it does now.
>
>     In summary, I don't expect the LLInt cloop backend to be any
>     slower than the LLInt assembly backends. Last I checked, it wasn't
>     slower. I would assume that a decent C compiler will take the
>     LLInt cloop code and do sufficient optimizations that it ends up
>     generating roughly the same assembly code that the LLInt assembly
>     backends generate. So, I wouldn't devote too much effort to
>     switching from the cloop to the assembly backends unless you had
>     evidence that (a) it would actually be faster on the benchmarks
>     you care about; or (b) you wanted to take advantage of the LLInt's
>     ability to rapidly tier-up to one of the JSC JITs. It is because
>     of (b), not (a), that JSC's triple tier configuration uses the
>     LLInt assembly backends instead of cloop.
>
>     But if you have reason to believe that the LLInt assembly backends
>     will be better for your purposes then I think all it will take is
>     hacking Platform.h appropriately. If this turns out to be hard,
>     then you should file a bug, or even better, I would love to see a
>     patch from you to improve the logic in Platform.h to make this use
>     case easier.
>
>     Hope this helps!
>
>     -Filip
>
>
>
>     On Mar 8, 2013, at 4:59 PM, Fritz Koenig <frkoenig at google.com
>     <mailto:frkoenig at google.com>> wrote:
>
>>     LowLevelInterpreter.asm is processed to create LLIntAssembly.h
>>     for the built platform.  It appears that if there is no jitting
>>     configured[1], this will always create the C Loop.
>>
>>     Is there any way of using the assembly backends to create
>>     LLIntAssembly.h when not jitting?
>>
>>     [1]: Source/WTF/wtf/Platform.h:815 /* If the jit is not
>>     available, enable the LLInt C Loop: */
>>     _______________________________________________
>>     webkit-dev mailing list
>>     webkit-dev at lists.webkit.org <mailto:webkit-dev at lists.webkit.org>
>>     https://lists.webkit.org/mailman/listinfo/webkit-dev
>
>
>
>
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-dev/attachments/20130313/b5736fe4/attachment.html>


More information about the webkit-dev mailing list