<div dir="ltr">Hi Avinash,<div><br></div><div>As previously pointed out to you, you can't compile a high level function-based language without using frames.</div><div><br></div><div>If recursion is not allowed (traditional FORTRAN or COBOL, but not C!) then the frames can be statically allocated at fixed global addreses. If you have hundreds or thousands of registers then registers could be allocated to frames. But with a normal number of registers that is not possible.</div><div><br></div><div>If recursion is allowed, then the frames will have to be stored on a heap, or a stack. It is irrelevant whether or not your hardware provides convenient stack instructions. If not, then you have to create one yourself, in software.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 20, 2015 at 12:57 PM, Avinash Bole <span dir="ltr"><<a href="mailto:boleavinash@gmail.com" target="_blank">boleavinash@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Hello!!<br><br></div>Im trying to write a C Backend using LLVM. I tried modifying the target "MSP430" to suit my backend. My target Architecture doesnt have a STACK. so i used "mem2reg" option using "OPT". Now Problem i have is..., the results produced are being written back to memory.<br><br></div>Following example should illustrate the problem<br><br></div><u><b>Intermediate file after MEM2REG pass:</b></u><br><div><br>@.str = private unnamed_addr constant [9 x i8] c"%d %d %d\00", align 1<br><br>; Function Attrs: nounwind<br>define void @main() #0 {<br>  %1 = add nsw i32 2, 10<br>  %2 = add nsw i32 %1, 3<br>  %3 = sub nsw i32 3, 2<br>  %4 = sub nsw i32 %3, 5<br>  %5 = xor i32 4, 4<br>  %6 = xor i32 %5, %5<br>  %7 = or i32 5, %4<br>  %8 = and i32 %4, 2<br>  %9 = or i32 7, 2<br>  %10 = or i32 %8, %6<br>  %11 = and i32 %9, %10<br>  %12 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 7, i32 %11, i32 %6)<br>  ret void<br>}<br><br></div><div><u><b>Assembly file in my target:</b></u><br><br>main:                                   ; @main<br>; BB#0:<br>        Mov REG[12],.L.str,4<br>        Mov 0(REG[1]), REG[12],4<br>        Mov 6(REG[1]), 0,4<br>        Mov 4(REG[1]), 0,4<br>        Mov 2(REG[1]), 7,4<br>        Call printf<br>         Nop<br>         Nop<br>        Return;<br>.Ltmp0:<br>        .size   main, .Ltmp0-main<br><br>        .type   .L.str,@object          ; @.str<br>        .section        .rodata.str1.1,"aMS",@progbits,1<br><br>.L.str:<br>        .asciz  "%d %d %d"<br>        .size   .L.str, 9<br><br><br></div><div>As you can see..., 0 is written to 6(REG[1]) in third line. here REG[1] is my frame pointer register and the compiler is writing result to memory location 6(REG[1]).<br><br></div><div>This would have been valid with a stack..,but since my target doesnt have a stack, i need to keep the results in REGISTERS ONLY. <br><br></div><div>So...,please suggest me how to prevent writing the final results to memory<br><br></div><div>Regards,<br></div><div>Avinash<br></div><div><br><br></div></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div>