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>
Maybe Matching 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