Hi,
I write a backend and come cross an abnormal problem. Here I give a example
to describe it:
///////////////////////////////////////////////////////////////////////////////////////////
// A simple C function
int foo()
{
return 1234;
}
/////////////////////////////////////////////////////////////////////////////////////////
When compiling foo() into my target ISA, I would expect codes like:
/////////////////////////////////////////////////////////////////////////////////////////
...
movi r0, #1234 // prepare r0 to return value 1234.
...
ret // return to caller.
////////////////////////////////////////////////////////////////////////////////////////
The headache is when I pass option -O0 to llc, the generated codes are
correct. However, if I omit -O0 and use default compiling options, the
instruction "movi r0, #1234" does not show.
I have already checked DAGs using options -view-xxxxx-dags and they all
seem OK.
I do not have any clue right now. Please help me.
Thank you.
--
杨勇勇 (Yang Yong-Yong)
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20130709/a42f9ee2/attachment.html>
Hi,> The headache is when I pass option -O0 to llc, the generated codes are > correct. However, if I omit -O0 and use default compiling options, the > instruction "movi r0, #1234" does not show.It's probably being eliminated as dead code. You want to make sure that during ISelLowering your RET instruction has %R0 as one of its operands (check in the -view-isel-dags step). That's the most likely cause anyway. If not, posting the DAG might help, or the output of "llc -debug" on an equivalent .ll file. Cheers. Tim.
Thank you, this is very instructive. I soon realized I forgot to add SDNPVariadic in my node definition of return operator. And thus even though the LowerReturn() is implemented properly, the instructions for passing return value is eliminated. Regards. 2013/7/9 Tim Northover <t.p.northover at gmail.com>> Hi, > > > The headache is when I pass option -O0 to llc, the generated codes are > > correct. However, if I omit -O0 and use default compiling options, the > > instruction "movi r0, #1234" does not show. > > It's probably being eliminated as dead code. You want to make sure > that during ISelLowering your RET instruction has %R0 as one of its > operands (check in the -view-isel-dags step). > > That's the most likely cause anyway. If not, posting the DAG might > help, or the output of "llc -debug" on an equivalent .ll file. > > Cheers. > > Tim. >-- 杨勇勇 (Yang Yong-Yong) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130709/ab4ebf28/attachment.html>
Apparently Analagous Threads
- [LLVMdev] A problem on returning value for functions
- [LLVMdev] basic block missing after MachineInstr packetizing
- [LLVMdev] Register Class assignment for integer and pointer types
- [LLVMdev] Register Class assignment for integer and pointer types
- [LLVMdev] Register Class assignment for integer and pointer types