[LLVMdev] Runtime optimization of C++ code with virtual functions
Chris Lattner
sabre at nondot.org
Wed Jun 20 16:35:02 PDT 2007
On Wed, 20 Jun 2007, Maurizio Vitale wrote:
>>> Is there any possible method using LLVM that would help in this case?
>>
>> LLVM won't help in this case.
>
> Is that so or it means that LLVM wouldn't have a prebuilt solution?
It means that LLVM doesn't have any trivial builtin solution.
> I'm asking because (without having ever looked seriously into LLVM) I
> was thinking to experiment along these lines:
>
> class Source {
> void send (T data) {
> invoke_jit_magic();
> transport (data);
> }
> }
>
> transport() would be a virtual method like the original posting. In my
> case send() would be part of the framework, so it is not a problem to
> add the invoke_jit_magic. In other case it might be trickier.
Ok.
> On the first call, invoke_jit_magic gains control, traverse the binary
> converting (a subset of) what it finds to LLVM IR, until it gets to the
> concrete target. It may have to do a bit of work to understand how
> parameters are passed to the transport code (it is a virtual function
> call and might be messy in presence of multiple/virtual inheritance.
> After that LLVM jit can be used to replace the original binary fragment
> with something faster.
Ok.
> I agree with the suggestion of using templates when possible. In my case
> it is not doable because transport would be propietary and the code
> containing it distributed only as binary.
Ok.
> I understand that the disassemblying portion need to be rewritten. Is
> there anything else that would prevent this approach from working?
> Again, haven't looked into LLVM yet, so I can immagine there might be
> problems in describing physical registers in the IR and at some point
> stuff must be exactly where the pre-existing code expects it. I don;t
> want to take your time, but if you could elaborate a bit it might
> prevent me from going down the wrong path.
This should work, I don't expect you to run into any significant problems.
When you're rewriting the LLVM IR for the indirect call, you can just
replace it with a direct call to the native code.
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
More information about the llvm-dev
mailing list