Replace (State# RealWorld) with Void# where we just want a 0-bit value
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Nov 2013 15:23:22 +0000 (15:23 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Nov 2013 18:59:28 +0000 (18:59 +0000)
commitf438464754ad9abd885acf3529606ca57945edc2
treee2edaf1078865f544a55153c02bb1906099586c0
parentb83666d4813b62b0b2da9b8238af6909c9f1dae0
Replace (State# RealWorld) with Void# where we just want a 0-bit value

We were re-using the super-magical "state token" type (which has
VoidRep and is zero bits wide) for situations in which we simply want
to lambda-abstract over a zero-bit argument. For example, join points:

   case (case x of { True -> e1; False -> e2 }) of
      Red  -> f1
      Blue -> True

==>

  let $j1 = \voidArg::Void# -> f1
  in
  case x of
    True -> case e1 of
              Red -> $j1 void
              Blue -> True
    False -> case e2 of
              Red -> $j1 void
              Blue -> True

This patch introduces

   * The new primitive type GHC.Prim.Void#, with PrimRep = VoidRep

   * A new global Id GHC.Prim.voidPrimId :: Void#.
     This has no binding because the code generator drops it,
     but is used as an argument (eg in the call of $j1)

   * A new local Id, MkId.voidArgId, which can be lambda-bound
     when you need to lambda-abstract over it.

and uses them throughout.

Now the State# thing is used only when we need state!
compiler/basicTypes/MkId.lhs
compiler/deSugar/DsUtils.lhs
compiler/prelude/PrelNames.lhs
compiler/prelude/TysPrim.lhs
compiler/simplCore/Simplify.lhs
compiler/specialise/Specialise.lhs
compiler/stranal/WwLib.lhs
compiler/types/Type.lhs