Draft: Refactor PrimRep to address #22291
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