Experimentally run ST in a fake world
Needs RevisionPublic

Authored by dfeuer on Mar 23 2017, 2:34 AM.



Currently, ST actions are instantiated at s = RealWorld when
run. We'd really like to treat ST and IO somewhat differently
for demand analysis, which means we need to have a way to distinguish
them. The most conservative option seems to be to use a different
State# token type.

This commit experimentally (and with a big hammer) adds a new
FakeWorld primitive type, a fakeWorld# :: State# FakeWorld
primitive token, and a runFW# (run in a fake world) token.
It then uses runFW# to implement runST. Let's see what happens.

Diff Detail

rGHC Glasgow Haskell Compiler
Lint WarningsExcuse: Lint
Warningcompiler/basicTypes/MkId.hs:1119TXT3Line Too Long
Warningcompiler/basicTypes/MkId.hs:1129TXT3Line Too Long
Warningcompiler/basicTypes/MkId.hs:1629TXT3Line Too Long
Warningcompiler/coreSyn/CorePrep.hs:822TXT3Line Too Long
Warningcompiler/coreSyn/CoreUnfold.hs:523TXT3Line Too Long
Warningcompiler/prelude/TysPrim.hs:177TXT3Line Too Long
Warningcompiler/prelude/TysPrim.hs:195TXT3Line Too Long
No Unit Test Coverage
Build Status
Buildable 14813
Build 23925: [GHC] Linux/amd64: Patch building
Build 23924: [GHC] OSX/amd64: Continuous Integration
Build 23923: [GHC] Windows/amd64: Continuous Integration
Build 23922: arc lint + arc unit
dfeuer created this revision.Mar 23 2017, 2:34 AM
dfeuer updated this revision to Diff 11850.Mar 23 2017, 3:11 AM
  • Change runST definition
dfeuer updated this revision to Diff 11851.Mar 23 2017, 8:37 AM
  • Change runST definition
bgamari requested changes to this revision.Mar 29 2017, 4:24 PM

What needs to happen to finish this up, @dfeuer?


It really seems like this should share code with runRWId.

2317 ↗(On Diff #11851)

It seems like ST should be mentioned here.

This revision now requires changes to proceed.Mar 29 2017, 4:24 PM

Is this still pertinent?


Is this an exact copy of the above code (except for fakeWorldPrimId)? How about a local refactoring?

Is this still pertinent?

Perhaps, but it requires a tad more work since Core Prep currently doesn't do any substitution in types (which we must do to instantiate State#'s argument) . I think we want to preserve this property, so we would likely need to do something like adding a substitution in the runFW# case in cpeApp.


I agree. @dfeuer, in my local branch where I debugged this I refactored this to,

-- Given an expression @runRW# arg arg1 .. argN@, construct
-- @arg realWorld# arg1 .. argN@, beta reducing if possible.
apply_realWorld :: CorePrepEnv -> CoreExpr -> [ArgInfo] -> Int -> UniqSM (Floats, CpeRhs)
apply_realWorld env arg args depth =
  pprTrace "apply_reawlWorld" (ppr arg $$ ppr args $$ ppr env) $
  case arg of
    Lam s body  ->
      let env'  = extendCorePrepEnv env s realWorldPrimId
      in cpe_app env' body args (depth - 1)
    _           ->
      let args' = CpeApp (Var realWorldPrimId) : args
      in cpe_app env  arg  args' depth

With the appropriate rewrites of the cases in cpe_app.

dfeuer updated this revision to Diff 12138.Apr 15 2017, 3:22 PM
dfeuer edited edge metadata.
  • Change runST definition
  • Tighten up; comment up

What about a testcase?

76 ↗(On Diff #12138)

It looks like your base commit is incorrect.


This line should really be split up at some point. I'll take care of this after merging this.

115 ↗(On Diff #12138)

Base commit again.

bgamari requested changes to this revision.Apr 17 2017, 10:23 AM
This revision now requires changes to proceed.Apr 17 2017, 10:23 AM

I realize this is kind of inconvenient to change, but I would be happier if we just called this thing stWorld#, runST#, etc. rather than having to remember the trivia that fakeWorld# is used for ST.

austin resigned from this revision.Nov 9 2017, 11:36 AM