[GHC] #9390: Inlining prevents evaluation of ignored parts of unboxed tuples
GHC
ghc-devs at haskell.org
Mon Aug 25 09:08:12 UTC 2014
#9390: Inlining prevents evaluation of ignored parts of unboxed tuples
-------------------------------------+-------------------------------------
Reporter: snoyberg | Owner:
Type: bug | Status: merge
Priority: normal | Milestone: 7.8.4
Component: Compiler | Version: 7.8.3
Resolution: | Keywords:
Operating System: Linux | Architecture: x86_64 (amd64)
Type of failure: Incorrect | Difficulty: Unknown
result at runtime | Blocked By:
Test Case: | Related Tickets:
simplCore/should_run/T9390 |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Basically yes. Some additional thoughts:
* "...To quote the docs for pseq" This seems like a complete non-sequitur
when talking about `seq`, and in any case only documents `seq` in a
sideways kind of way. Better to quote the (brand new) documentation for
`seq`. (Add a note to say it's new if you like.)
* "...If we want to be certain of the ordering, use pseq". That's the
place to quote pseq's documentation.
* "You might think (as I did) that we can get the same guaranteed
ordering of evaluation by having a function which is only strict in one of
its arguments:" This is a bit confusing, because we don't know if `(+)`
here is overloaded. I assume you mean `(+)` at `Int`? If so, it's strict
in both arguments, so adding the strictness annotation doesn't change
anything anyway. A `!` would only have a chance of changing evaluation
order if the function was lazy. And if it was lazy then the `!` would
make it strict, and that ''would'' be preserved by inlining. So maybe my
earlier comment about inlining was a red herring.
* I think it might be helpful to articulate the baseline story for
`unsafePerformIO`, namely: use it only when you don't mind which order the
effects are performed in, relative to both the main I/O monad and other
calls to `unsafePerformIO`. You are on thin ice if you go beyond that;
and the thin ice is what this tutorial discusses.
* "to understand why unsafeInterleaveIO is semantically different from
return . unsafePerformIO, we need to drop down a layer of abstraction".
Not really. To understand ''how'', you need to drop down. But the
guarantees are perfectly well defined. Given `do { ...before...; x <-
unsafeInterleaveIO (...side...); ...after...}` then:
* Effects in `...side...` will happen after effects in `...before...`.
* But effects in `...side...` maybe occur arbitrarily interleaved with
effects in `...after...`.
* I am not sure what the `lazy` in `unsafeDupablePeformIO` is either!
Maybe Simon Marlow does?
I think it's good enough to launch on the masses though.
Thanks for doing this.
Simon
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9390#comment:29>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list