[LLVMdev] Destination register needs to be valid after callee saved register restore when tail calling
Arnold Schwaighofer
arnold.schwaighofer at gmail.com
Wed Aug 8 06:12:33 PDT 2007
Hello list,
i am currently trying to implement tail call optimization in the X86
backend , so far i have it working for cases (modulo many unknown
bugs :) where the tail called function is a destination within the
source file and frame pointer elimination is performed. i implemented
it as a dagcombiner transformation running in post legalized phase
within the X86TargetLowering::PerformDAGCombine(SDNode *N,
DAGCombinerInfo &DCI). now to my problem:
When tail calling a function pointer the register the function
pointer was loaded to might be invalidated by the restored callee
saved registers.
...
movl 12(%esp), %esi << 12(%esp) contains the function pointer
movl %eax, 44(%esp)
movl 32(%esp), %esi << *!# %esi no longer contains the
function pointer to be called
addl $44, %esp
jmp *%esi # TAIL CALL jmpr
Is there a way to indicate that the register the tail call
instruction uses as destination needs to be valid after the callee
saved registers have been restored? (some X86InstrInfo.td foo magic
maybe ?)
Or do i have to insert code into PEI::saveCalleeSavedRegisters to
detect that there is a tail called function that uses a callee saved
register and move it to another (EAX).
that's how the TAILJMP instruction looks:
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
noResults = 1 in
def TAILJMPr : I<0xFF, MRM4r, (ops GR32:$dst), "jmp {*}$dst #
TAIL CALL jmpr",
[]>;
btw. i am currently working with llvm-2.0 codebase.
thanks for any help
regards arnold
More information about the llvm-dev
mailing list