Skip to content

Draft: Refactor PrimRep to address #22291

Ben Gamari requested to merge wip/T22291 into master

Consider a program such as:

foo :: forall (lev :: Levity) (a :: TYPE (BoxedRep lev)). Addr# -> (# a #)
foo x = addrToAny# x

While this program is accepted by the type-checker, the code generator would previously choke on it due the levity polymorphism of foo's result. Specifically, boxedRepDataCon would fail as it was unable to determine the result's PrimRep while trying to identify its Cmm type:

<no location info>: error:
    panic! (the 'impossible' happened)
  GHC version 9.5.20220906:
        boxedRepDataCon
  [lev_ayH]
  Call stack:
      CallStack (from HasCallStack):
        callStackDoc, called at compiler/GHC/Utils/Panic.hs:188:37 in ghc:GHC.Utils.Panic
        pprPanic, called at compiler/GHC/Builtin/Types.hs:1629:9 in ghc:GHC.Builtin.Types
        prim_rep_fun, called at compiler/GHC/Builtin/Types.hs:1618:44 in ghc:GHC.Builtin.Types
        fun, called at compiler/GHC/Types/RepType.hs:615:5 in ghc:GHC.Types.RepType
        runtimeRepPrimRep, called at compiler/GHC/Builtin/Types.hs:1660:20 in ghc:GHC.Builtin.Types
        prim_rep_fun, called at compiler/GHC/Builtin/Types.hs:1655:64 in ghc:GHC.Builtin.Types
        fun, called at compiler/GHC/Types/RepType.hs:615:5 in ghc:GHC.Types.RepType
        runtimeRepPrimRep, called at compiler/GHC/Types/RepType.hs:585:5 in ghc:GHC.Types.RepType
        kindPrimRep, called at compiler/GHC/Types/RepType.hs:537:18 in ghc:GHC.Types.RepType
        typePrimRep, called at compiler/GHC/StgToCmm/Utils.hs:305:58 in ghc:GHC.StgToCmm.Utils
        newUnboxedTupleRegs, called at compiler/GHC/StgToCmm/Prim.hs:1701:33 in ghc:GHC.StgToCmm.Prim

Here we fix this by modifying PrimRep to reflect the fact that we may know that a value is boxed without knowing its particular levity:

data PrimRep = BoxedRep Levity | IntRep | ...

This allows kindPrimRep (TYPE (BoxedRep lev)) to return BoxedRep _|_, which is enough information for the code generator to compile foo.

Edited by Ben Gamari

Merge request reports