[LLVMdev] Scheme + LLVM JIT
Chris Lattner
sabre at nondot.org
Tue May 10 07:49:00 PDT 2005
On Tue, 10 May 2005, Greg Pettyjohn wrote:
> I bumped into Alex Friedman in the hall today and by coincidence
> he mentioned that they were switching to LLVM for their PLT Scheme
> JIT project. I had evaluated LLVM a few weeks ago for my own purposes,
> but decided that it was too C/C++ centered and that critical features
> such as tail call optimization and other stack manipulation features
> were likely stagnant. So naturally I asked Alex about tail calls:
>
> "LLVM? What are you going to do about tail calls?"
>
> He replied that they would likely be supported soon and he pointed
> me to this discussion. Naturally, this has rekindled my interest in LLVM.
Indeed, I have been working on them recently. :)
> So what's the ETA for tail calls?
All of the LLVM pieces for it are now in place: it is just up to the
target maintainers to implement the target-specific support in the codegen
for it. I hope to get X86 done before the 1.5 release (due out in a
couple of weeks), the other targets may not have support until the next
release.
-Chris
> On May 5, 2005, at 12:41 PM, Chris Lattner wrote:
>
>> On Thu, 5 May 2005, Misha Brukman wrote:
>>> On Thu, May 05, 2005 at 03:46:58AM -0400, Alexander Friedman wrote:
>>>> On May 5, Misha Brukman wrote:
>>>>> To the best of my knowledge, this has not been done and no one has
>>>>> announced their intent to work on it, so if you are interested,
>>>>> you'd be more than welcome to do so.
>>>>
>>>> My C++ knowledge is completely non-existant, but so far I've had a
>>>> surprisingly easy time reading the source. This change seems somewhat
>>>> involved - I will have to implement different calling conventions -
>>>> ie, passing a return-address to the callee, etc. Who is the right
>>>> person to talk to abot this?
>>>
>>> The notes you refer to belong to Chris Lattner, but you should just post
>>> your questions on llvmdev and someone will answer them. The benefits
>>> are that you may get your response faster than emailing someone
>>> directly, you may get multiple perspectives, and the discussion is
>>> archived for future LLVMers who are looking for some similar advice.
>>
>> I agree with misha. This should definately be discussed on-list if
>> possible.
>>
>>>> Ok, this makes sense. However, am I correct in assuming that the
>>>> interaprocedural optimizations performed in gccas will make it
>>>> problematic to call 'JIT::recompileAndRelinkFunction()' . For example,
>>>> suppose I run run some module that looks like
>>
>> ...
>>
>>>> through all of those optimizations. Will the result nessisarily have a
>>>> bar() function?
>>>
>>> You are correct, it may get inlined.
>>>
>>>> If inlining is enabled, replacing bar might have no effect if it's
>>>> inlined in foo.
>>>
>>> True.
>>
>> Yes, this is an important point.
>>
>> We build LLVM to be as modular as possible, which means that you get to
>> choose exactly which pieces you want to put together into your program. If
>> you're interested in doing function-level replacement, you basically have
>> to avoid *all interprocedural optimizations*. There may be ways around
>> this in specific cases, but anything that assumes something about a
>> function that has been replaced will need to be updated. I don't think
>> there is anything LLVM-specific about this problem though.
>>
>>> However, let's step back for a second. I am talking about what effect
>>> gccas/gccld will have on code generated by some front-end. Presumably,
>>> you want to write a single stand-alone JIT that will take scheme -> LLVM
>>> -> native code via JIT. Hence, gccas/gccld optimization selection
>>> doesn't really apply to you. You can write your own "tool" that will
>>> use the JIT libraries and the optimizations of your choosing, if you so
>>> desire.
>>
>> Yup exactly, you get to choose exactly what you want to use :)
>>
>>>> If there are complications like this, how much of a performance gain
>>>> do the interprocedural opts give?
>>
>> This is impossible to say: it totally depends on the program. I know that
>> some real-world C codes are sped up by 30-50% in some cases, but others are
>> not sped up at all. I can't say for scheme programs, but I expect that the
>> situation would be similar.
>>
>>>> Also, compileAndRelink (F) seems to update references in call sites of
>>>> F. Does this mean that every function call incurs an extra 'load' , or
>>>> is there some cleverer solution?
>>>
>>> We don't track all the call sites. Instead, what recompile and relink
>>> does is adds an unconditional branch from the old function (in native
>>> code) to the new one (in native code again), so what this does is add an
>>> extra indirection to all subsequent calls to that function, but not an
>>> extra load.
>>>
>>> One cleverer solution would be to actually track all the call sites, but
>>> then if recompile-and-relink is called rarely, it would be an extra
>>> overhead, not a gain, so it would slow down the common case.
>>
>> Actually this is not clear, it might be a win to do this. I don't think
>> anyone has pounded on the replace function functionality enough for this to
>> show up though.
>>
>>> Another cleverer solution would be to overwrite the machine code
>>> in-place with the code for the new function, but then the problem is
>>> that we lay out the code for functions sequentially in memory so as to
>>> not waste space, and hence, each recompilation of the function better
>>> fit into the place of the old one, or else we might run into the code
>>> region of the next function. This means that we then have to break up
>>> the code region for a function into multiple code sections, possibly
>>> quite far apart in memory, and this leads to more issues.
>>
>> Also, if the function is currently being executed by a stack frame higher
>> up on the stack, when we got back to that function, chaos would be
>> unleashed :)
>>
>>>> Finally, if I jit-compile several modules, can they reference each
>>>> other's functions? If this is answered somewhere in the docs, I
>>>> appologize.
>>>
>>> At present, I am not quite sure that the JIT will accept two different
>>> Modules, most tools (except the linkers) assume a single Module that is
>>> given to them. I have not used two Modules with the JIT and I haven't
>>> seen anyone else do that, so it maybe a limitation or it just may need
>>> some extention to support it, I'm not sure.
>>
>> I don't think lli supports this (yet!), but there is no fundamental reason
>> why it could not be extended, and the JIT library might already work. I'm
>> not sure.
>>
>>>> It's not the linking/relocating that's the problem. The problem is
>>>> that each binary winds up being rather large. However, since these
>>>> tools don't need to be distributed or compiled for my purposes, I
>>>> guess i'm not really worried about it.
>>>
>>> Compiling optimized binaries rather than debug build would save quite a
>>> bit of space in the binaries. Other than that, I'm not really sure,
>>> except maybe to compile LLVM with LLVM and then use its aggressive
>>> optimizations and dead-code elimination transformations? :)
>>
>> Like misha said, please try compiling with 'make ENABLE_OPTIMIZED=1'. This
>> will produce files in the llvm/Release/bin directory which much smaller
>> than the debug files (e.g. opt goes from 72M -> 4M without debug info).
>>
>> -Chris
>>
>> --
>> http://nondot.org/sabre/
>> http://llvm.cs.uiuc.edu/
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-Chris
--
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/
More information about the llvm-dev
mailing list