[LLVMdev] [PATCH][RFC] Add llvm.codegen Intrinsic To Support Embedded LLVM IR Code Generation
Justin Holewinski
justin.holewinski at gmail.com
Tue May 1 11:31:43 PDT 2012
On Tue, May 1, 2012 at 8:22 AM, <dag at cray.com> wrote:
> Justin Holewinski <justin.holewinski at gmail.com> writes:
>
> > I don't think the code base changes are all that bad. We have a
> number
> > of them to support generating code one function at a time rather
> than a
> > whole module together. They've been sitting around waiting for us to
> > send them upstream. It would be an easy matter to simply annotate
> each
> > function with its target. We don't currently do that because we
> never
> > write out such IR files but it seems like a simple problem to solve
> to
> > me.
> >
> > If such changes are almost ready to be up-streamed, then great!
>
> Just to clariofy, the current changes simply allow a function to be
> completely processed (including asm generation) before the next function
> is sent to codegen.
>
> > It just seems like a fairly non-trivial task to actually implement
> > function-level target selection, especially when you consider function
> > call semantics, taking the address of a function, etc.
>
> For something like PTX, runtime calls take care of the call semantics so
> it is either up to the user or the frontend to set up the runtime calls
> correctly. We don't need to completely solve this problem. Yet. :)
>
But there has to be some interface that allows an LLVM IR function from one
architecture to get at the code or name of a function from another
architecture. This could be handled in the front-end, but it seems like we
could design some abstraction.
>
> > If you have a global variable, what target "sees" it? Does it need to
> > be annotated along with the function?
>
> For a tool like llc, wouldn't it be simply a matter of changing
> TheTarget and reconstituting the various passes? The changes we have
> waiting to upstream already allow us to reconstitute passes. I
> sometimes use this to turn on/off debugging on a function-level basis.
>
> The way we've constructed our backend interface should just allow us to
> switch the target and reinitialize everything. I'm sure I'm glossing
> over tons of details but I don't see a fundamental architectural problem
> in LLVM that would prevent this.
>
Sorry, I meant global variables in the LLVM IR. Are they valid for only
one architecture in the IR module?
>
> > Can functions from two different targets share this pointer?
>
> Again, in the case of PTX it's the runtime's responsibility to ensure
> this. I agree passing pointers around complicates things in the general
> case but I also think it's a solvable problem.
>
> > For Yabin's use-case, the X86 portions need to be compiled to
> > assembly, or even an object file, while the PTX portions need to be
> > lowered to an assembly string and embedded in the X86 source (or
> > written to disk somewhere).
>
> I think it's just a matter of switching to a different AsmWriter. The
> PTX runtime can load objects from files. The code doesn't have to be a
> string in the x86 object file.
>
> > If you're targeting Cell, in contrast, you'd want to compile both down
> > to object files.
>
> I think we probably want to do that for PTX as well.
>
Maybe, maybe not. It may make sense to rely on run-time JIT'ing of the PTX.
>
> > For me, the bigger question is: do we extend the IR to support
> > multiple targets, or do we keep the one-target-per-module philosophy
> > and derive some other way of representing how the modules fit
> > together? I can see pros and cons for both approaches.
>
> Me too.
>
> > What if instead of per-function annotations, we implement something
> > like module file sections? You could organize a module file into
> > logical sections based on target architecture. I'm just throwing that
> > out there.
>
> Do we allow more than one Module per file? If not, that seems like an
> arbitrary limitation. If we allowed that we could have each module
> specify a different target.
>
That could work.
>
> -Dave
>
--
Thanks,
Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120501/b3638e1a/attachment.html>
More information about the llvm-dev
mailing list