
#13330: forkIO has inconsistent behavior under optimization -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: dfeuer Type: bug | Status: patch Priority: normal | Milestone: 8.2.1 Component: Core Libraries | Version: 8.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: Other | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D3189 Wiki Page: | -------------------------------------+------------------------------------- Comment (by rwbarton): Replying to [comment:5 dfeuer]:
To avoid getting caught in a lie, and to avoid fragile case-specific reasoning, the invariant we must maintain is that `catchException` is never called with an undefined argument. When this invariant holds, the analysis should end up being pretty much correct:
1. It's safe to evaluate the argument and/or its dependencies early, because it will not fail.
2. After the `catchException` runs, its argument will be in WHNF.
An alternative approach that smells more honest to me might be to reveal
Agreed, though we might also document what could happen if the argument actually is bottom (namely `catch#` will not catch the exception). the fact that `catch#` is actually lazy in its argument, remove the `lazy` call from `catch`, and make `catchException` actually force its argument. I don't know if that would have any negative performance or other consequences. Interesting idea. It would mean an extra `seq` in the original program, but I think GHC would normally be able to eliminate the `seq` easily. If this works it might lead to a simpler design; but not urgent. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13330#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler