Re: [GHC] #7367: Optimiser / Linker Problem on amd64

#7367: Optimiser / Linker Problem on amd64 --------------------------------------------+------------------------------ Reporter: wurmli | Owner: Type: bug | Status: new Priority: normal | Milestone: 7.8.1 Component: Build System | Version: 7.6.1 Resolution: | Keywords: Operating System: Linux | Architecture: x86_64 Type of failure: Runtime performance bug | (amd64) Test Case: | Difficulty: Unknown Blocking: | Blocked By: | Related Tickets: --------------------------------------------+------------------------------ Comment (by rwbarton): Based on an examination of the Core, GHC HEAD (and presumably 7.6 though I don't have it to test) is floating the expression `i .&. 1 == 0` out of `\f -> ...` in `checksum`, resulting in the allocation of a thunk per execution of the `go`/`upd` loop in `genPermutations`. GHC 7.4 doesn't perform this "optimization" in this particular program. Not sure why. The allocations under GHC HEAD can be eliminated with a change to the benchmark program like this: {{{ --- f-orig.hs 2013-08-26 19:42:27.000000000 -0400 +++ f.hs 2013-08-26 19:30:09.000000000 -0400 @@ -64,11 +64,11 @@ if p0 == 0 then increment perm count >> run f else do copyArray destF perm n increment perm count - flopS destF $ \ flops -> - run (f `mappend` F (checksum j flops) flops) + if j .&. 1 == 0 + then flopS destF $ \ flops -> run (f `mappend` F flops flops) + else flopS destF $ \ flops -> run (f `mappend` F (-flops) flops) let go j !f = if j >= r then return f else upd j f (go (j+1)) go l mempty - where checksum i f = if i .&. 1 == 0 then f else -f }}} **or** by building with `-fno-full-laziness` provided that `flopp` and `swap` are moved out of `flop` to the top level (otherwise, those allocate instead). -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/7367#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC