[GHC] #7367: Optimiser / Linker Problem on amd64
GHC
ghc-devs at haskell.org
Wed Aug 28 14:02:01 UTC 2013
#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):
Replying to [comment:8 simonpj]:
> I don't think `flopS` uses its continuation linearly!
> {{{
> flopS :: Perm -> (Int -> IO a) -> IO a
> flopS !xs f = do
> let go !acc = do
> k <- peekElemOff xs 0
> if k == 0 then f acc else flop (fromIntegral k) xs >> go
(acc+1)
> go 0
> }}}
Doesn't it though?
`flopS` is just a single call to `go`, so it uses `f` linearly if `go`
does.
`go` performs an action unrelated to `f`, and then either it finishes by
calling `f`, or it performs another action unrelated to `f` and then calls
itself. So any run of `go` calls `f` exactly once, as a tail call (or it
loops forever).
Ah, perhaps you've misparsed `if k == 0 then f acc else flop (fromIntegral
k) xs >> go (acc+1)` as `(if k == 0 then f acc else flop (fromIntegral k)
xs) >> go (acc+1)`?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7367#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list