Is it possible to inline Functions without using LLVM JIT Framework?

Hi Everyone,

Hopefully this question is not too absurd.

Actually I created an example in LLVM, where I generate two modules, one containing the function definition and the other module calling this function.
(Question related to this was posted on this mailing list recently)

Now I want to know, whether it is possible to "inline" the definition of this function in the caller module, using some optimization pass etc?

I have previously experimented with LLVM's JIT Framework, and we can do something similar over there. But now I am interested in doing this without JIT Framework.

Any ideas/suggestions/comments on how could we accomplish this?

Thanks in advance,
Mian M. Hamayun
Grenoble, France.

Link the modules together using llvm-ld?

-eric

To do it manually, llvm-ld your modules to get a single module with both, then run opt on the result to optimize it. From source code, you can just use -O4 to the compiler on a system with a suitable linker (standard ld on OSX; binutils+gold plugin on Linux, for example).

-Jim

Hi Mian!

You have tried do it in semantical phase?

I’m in prototype of my programming language, and in it, will be possible write something like:

method Sum(a, b: Integer): Integer; inline;
begin
Result := a + b;
end;

And some like:

method UsesSum;
begin
// do something
var sum := Sum(1, 2); // Or ‘var sum := Sum 1, 2’, like Ruby :wink:
// do more things
end;

In this case, in the analysis, the Sum method, will be placed in the caller (or callers).

I hope this help you. :slight_smile:

2011/9/1 Mian M. Hamayun <mian-muhammad.hamayun@imag.fr>

Thanks Eric, Jim and Geovani for your responses.

Yes, we can combine two or more bitcode modules using llvm-ld and in this way functions can be inlined and optimized during this process.

But I am also looking into the possibility of doing the same using LLVM Pass Manager (Without using llvm-ld). This looks difficult due to the fact that the function definitions ought to be in the same module as the caller, in order to be inlined and then optimized onwards, I guess !!! (Correct me If I am Wrong at this)

Thanks Again,
Hamayun

P.S. @Geovani: "You have tried do it in semantical phase?"
Which LLVM Passes are you referring here ? Because I am working at the LLVM-IR Level, where I generate LLVM-IR modules, optimize them and then compile them for a given target.

Oh, Mian, sorry for my fool reply…

I was thinking that you do it in high-level…

Your idea is cool, 'cause allow integrate an inline methods generated from diferent languages, right?

Thanks

2011/9/2 Mian M. Hamayun <mian-muhammad.hamayun@imag.fr>

I have a system where I need to do this quite often. In my inlining
pass I open the module containing the function I wish to inline, copy
the function into the current module, then call InlineFunction.

-Jeff

Dear Jeff,

This is exactly what I am interested in. I tried this, and it works for simple functions that don't use other functions or global data.
But for functions dependent on external/global references, it poses some problems as I also need to copy/clone these references. I am still looking into this ... an example from anyone would be great ... :slight_smile:

I have found another way to tackle this problem. Your comments are still desirable on any potential side-effects. Here is what I do

- Clone input the module using CloneModule Function.
- Modify the Linkage type to GlobalValue::InternalLinkage for all function definitions.
   (So that they don't conflict with other modules at link time)
- Add my Generated function to the Cloned Module.
- Run Optimization and Inliner Passes.
   (This Inlines the functions and removes un-used functions/globals)
- Emit the Optimized BitCode Module.

Any Comments?

Thanks again,
Hamayun