[LLVMdev] How to access llvm Types from the codegen?
Chris Lattner
sabre at nondot.org
Fri Aug 3 14:49:49 PDT 2007
On Fri, 3 Aug 2007, Rafael Espindola wrote:
> Sorry for the delay. I am back from a vacation and have been busy
> catching up....
Welcome back :)
> That is why I need the types (just for the size). This is necessary to
> implement both the current behavior and the correct ABI.
Right.
> consider the llvm code
> ---------------------------------------
> %struct.s = type { i64 }
>
> define i64 @f(%struct.s* byval %a) {
> entry:
> %tmp2 = getelementptr %struct.s* %a, i32 0, i32 0
> ; <i64*> [#uses=1]
> %tmp3 = load i64* %tmp2 ; <i64> [#uses=1]
> ret i64 %tmp3
> ---------------------------------------
>
> When the DAG is constructed it will contain a load from formal_args.
It shouldn't contain a load: the "a" argument (which represents the
address by-val arg) will be one of the results of the formal_arguments
node. Ah, you probably mean the explicit load will turn into a load
SDNode, which is right :)
> It looks like a lot of work to modify the DAG so that instead it uses
> a copy. Even if we decide to do this, we would need to pass the size
> of the structure to the DAG, which currently is not available.
Okay, you're saying that in this example, the "byval" argument is supposed
to be passed in a register, which does not have an address. Further, the
explicit load ideally becomes dead.
There are multiple steps to get optimal code for x86-64. In the short
term, I think it makes the most sense for the code generator to lower this
into a store onto a stack, and use the address of the stack slot as the
"result" value of the formal_argument. Thus you lower this "dag":
a,chain = formal_arguments (...)
into a 64-bit stack slot (e.g. frame index #1) and:
chain = store %rax -> (frameindex #1)
a = frameindex #1
This will leave the loads in the code (ugly codegen) but will work.
Going forward, we can optimize out this stuff by having the front-end
generate a simple i64 argument instead of using byval in this case.
However, it should always be *safe* to use byval, so the codegen needs to
learn how to handle this.
> I propose that structures that are passed on registers should be slip
> into many DAG level arguments (for now this would be all structs) and
> the DAG should contain copies instead of loads. The nice thing about
> this proposal is that for structures that are passed on the stack, the
> DAG doesn't need to know the size. All that we need to add to add to
> the DAG is a flag so that the code generators know that the struct
> pointer should be computed based on the stack pointer.
I don't follow, can you explain more what you mean?
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
More information about the llvm-dev
mailing list