[GHC] #5916: runST isn't free

GHC ghc-devs at haskell.org
Wed Jan 8 16:36:12 UTC 2014


#5916: runST isn't free
-------------------------------------+------------------------------------
        Reporter:  tibbe             |            Owner:
            Type:  bug               |           Status:  new
        Priority:  normal            |        Milestone:  7.6.2
       Component:  Compiler          |          Version:  7.4.1
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------

Comment (by nomeata):

 Just noting down some idée fixe:

 The reason we are not inlining `runSTRep` is that we don’t want to
 expressions using the `realWorld#` token to become shared, right?

 How about `runSTRep` gets a special inlining that mentions all free
 variables of its argument, using a special token of type `stWorld# :: a ->
 RealWorld#`. So `runSTRep (f x (z x))` would get unfolded to
 {{{
 case f x (z x) (stWorld# (f,x,z)) of (# _, r #) -> r
 }}}

 The variables mentioned in `stWorld’s` argument prevent this from being
 floated out, and I believe it ouldn’t that solve tibbe’s problem, right?
 It might also enable more CPR-related optimizations.

 When generating `STG`, the argument of `stWorld#` would of course be
 ignored.

 (In fact, it seems it would be correct ot have `runSTRep e = case e
 (stWorld# e) of (# _, #r) -> r`, which could be formulated as a plain
 `RULE`, but that would blow up the core expressions during compilation too
 much, I’d expect.)

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


More information about the ghc-tickets mailing list