3 ms·
I may take this blog post and turn it into a bug report for the ghc optimizer. :-) The moment you start trying to compete against hand written assembly, any hi
by carterschonwald 13y ago
I may take this blog post and turn it into a bug report for the ghc optimizer. :-)
The moment you start trying to compete against hand written assembly, any high level lang gets a bit quirky. One nice thing about ghc Haskell is you can though! A lot of my own open source work is towards a vision of making that much easier than it is today :-)
- tenslisi 13y ago> The moment you start trying to compete against hand written assembly, any high level lang gets a bit quirky. Yes, which is why I wonder why GHC went with it's own code generator instead of using LLVM? It seems like a lot of the outputted assembly would be coalesced with LLVM's optimizer passes. Is there work on this problem within the Haskell world?
- thirsteh 13y agoGHC's -fllvm flag already makes it use LLVM, although the native code generator remains the default. This backend (usually coupled with -O2) tends to slow down compile times tremendously, but can make some math-heavy programs much faster.
- gnuvince 13y ago> Yes, which is why I wonder why GHC went with it's own code generator instead of using LLVM? LLVM didn't exist when GHC was started.
- carterschonwald 13y agoGHC has an llvm backend. If you read the blog post, you'll see Neil mentions " tried the LLVM backend, but it generated significantly worse assembly code https://github.com/ndmitchell/blogs/blob/master/inner-loop/InnerLoop.s" https://github.com/ndmitchell/blogs/blob/master/inner-loop/I... @tenslsi : theres certainly room for improving llvm, the ghc native code gen, and pretty much any compiler generally (ghc is no different). I'm actively involved in GHC dev, and i've somewhat committed to spending some volunteer time this year improving the NCG and various backend optimization tooling. anyways, the reddit discussion of the blog post is also pretty interesting
- axman6 13y ago> ... tried the LLVM backend, but it generated significantly worse assembly code. It's worth noting the LLVM version Neil tried was 2.8, from Dec 2010. LLVM has come a long way since then and I'd be surprised to see if produce such horrible code. I'm hoping Neil will do an updated post using LLVM 3.4 released last week.
- sanxiyn 13y agoMy understanding is that the main problem is translating from Haskell to LLVM IR is a lossy process, not the difference between LLVM 2.8 and LLVM 3.4. This blog post demonstrates one such issue: http://blog.omega-prime.co.uk/?p=135 http://blog.omega-prime.co.uk/?p=135 Quote: "In particular, LLVM conservatively assumes that GHC's stack and the heap may alias". LLVM has to assume that short of Haskell-specific analysis, so updating to LLVM 3.4 won't help with such issues.
- carterschonwald 13y agonot quite, I think the issue is that llvm doesn't understand ghc's stack, so which I guess is the same issue :)
- carterschonwald 13y agoanyways, heres a link to the reddit thread: http://www.reddit.com/r/haskell/comments/1ukwu1/optimising_haskell_for_a_tight_inner_loop/ http://www.reddit.com/r/haskell/comments/1ukwu1/optimising_h... its a very thoughtful, informative, thread. enjoy!