<div dir="ltr"><div><div><div><div><div><div>Hello,<br><br></div>I'm implementing a custom Haskell-to-LLVM compiler, and in my experimentation, noticed that GHC is much slower than clang certain examples, such as the ackermann function. However, from reading their respective IRs (Cmm for GHC and LLVM for clang), I don't really see much of a difference. <a href="https://gist.github.com/bgamari/bd424e82d96ddb7b9e67c5e51cdcc5ec">Here is a link to the numbers. (n, m) are the parameters to the ackermann function</a><br><br></div>One major difference is that GHC uses a "stack-in-the-heap", in the sense that the a is a chunk of heap memory that functions effectively as call stack. It is managed explicitly by GHC. GHC does not use the native call stack _at all_. This is to implement continuation passing, in a sense.<br><br></div><div>I want to check that the difference in the performance is truly from this "stack inĀ  the heap" behavior, so I want to teach a backend to generate code that looks like this.<br><br></div>Is code generatingĀ  like this something that I could reasonably teach the backend? To be specific, I wish to teach the backend to manipulate a "custom stack". I assume this would affect codegen, because one can no longer use <span style="font-family:monospace">push/pop/call/ret</span>.<br></div><br><br></div>Thanks,<br></div>Siddharth<br></div><div dir="ltr">-- <br></div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Sending this from my phone, please excuse any typos!</div></div>