[GHC] #1600: Optimisation: CPR the results of IO

GHC ghc-devs at haskell.org
Wed Dec 4 09:51:51 UTC 2013


#1600: Optimisation: CPR the results of IO
-------------------------------------+-------------------------------------
        Reporter:  simonmar          |            Owner:  nomeata
            Type:  task              |           Status:  new
        Priority:  lowest            |        Milestone:  7.6.2
       Component:  Compiler          |          Version:  6.6.1
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  Runtime           |       Difficulty:  Moderate (less
  performance bug                    |  than a day)
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+-------------------------------------
Changes (by nomeata):

 * owner:   => nomeata


Comment:

 Interesting corner case: With nested CPR enabled, `GHC.TopHandler` in base
 fails to compile with:

 {{{
 ghc-stage1: panic! (the 'impossible' happened)
   (GHC version 7.7.20131203 for x86_64-unknown-linux):
         mkWWcpr:
     non-algebraic or open body type a{tv a28d} [tv] but CPR type tm1()
 }}}

 The problem is this code:
 {{{
 #!haskell
               case {__pkg_ccall_GC base shutdownHaskellAndExit
 GHC.Prim.Int#
                                             -> GHC.Prim.Int#
                                             -> GHC.Prim.State#
 GHC.Prim.RealWorld
                                             -> (# GHC.Prim.State#
 GHC.Prim.RealWorld #)}_d2VI
                      255 ds_d2VF eta_XG
               of _ [Occ=Dead, Dmd=<L,A>] { (# ds_d2VG [OS=OneShot] #) ->
               (# ds_d2VG, GHC.Tuple.() #)
 }}}
 stemming from
 {{{
 #!haskell
 foreign import ccall "shutdownHaskellAndSignal"
   shutdownHaskellAndSignal :: CInt -> CInt -> IO ()
 }}}
 which then is `unsafeCoerce#`’ed to `a`, with note explanation
 {{{
 -- we have to use unsafeCoerce# to get the 'IO a' result type, since the
 -- compiler doesn't let us declare that as the result type of a foreign
 export.
 }}}

 There are a few ways to attack this issue:

  1. We allow `a` in the return type of a foreign export (but maybe
 overkill to do that just for this code).
  2. We try to forget CPR information when things pass through
 `unsafeCoerce#` (but that is just a {{{`cast`}}} in Core, and may be hard
 to detect reliably. Maybe every coercion that has a `UnivCo
 representational` inside?)
  3. We re-write that code in base, e.g. instead of `unsafeCoerce` use `...
 >> error "I’m still alive?"`.
  4. We simply turn the `panic` into a warning.

 I guess 2. makes most sense, because we don’t want other instances of
 `unsafeCoerce#` to cause this error either. For now I’ll do 4, to not get
 stuck compiling base.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/1600#comment:25>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list