summaryrefslogtreecommitdiff
path: root/compiler/GHC/StgToByteCode.hs
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-10-13 18:17:13 -0400
committerBen Gamari <ben@smart-cactus.org>2022-10-19 10:06:10 -0400
commit6148bd126c4602d011e7dd458288c02db1c16dc6 (patch)
tree0cebae532fef06af2374485530549273cee14bac /compiler/GHC/StgToByteCode.hs
parent1ef412dde750d4ffd01a332e555ed4503d4eda85 (diff)
downloadhaskell-wip/T22291.tar.gz
codeGen: Allow levity-polymorphic primop resultswip/T22291
Consider a program such as: ```haskell 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: ```haskell 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`. Fixes #22291.
Diffstat (limited to 'compiler/GHC/StgToByteCode.hs')
-rw-r--r--compiler/GHC/StgToByteCode.hs10
1 files changed, 4 insertions, 6 deletions
diff --git a/compiler/GHC/StgToByteCode.hs b/compiler/GHC/StgToByteCode.hs
index be2d6a82fa..879eaa1f61 100644
--- a/compiler/GHC/StgToByteCode.hs
+++ b/compiler/GHC/StgToByteCode.hs
@@ -1107,8 +1107,8 @@ layoutTuple profile start_off arg_ty reps =
usePlainReturn :: Type -> Bool
usePlainReturn t
| isUnboxedTupleType t || isUnboxedSumType t = False
- | otherwise = typePrimRep t == [LiftedRep] ||
- (typePrimRep t == [UnliftedRep] && isAlgType t)
+ | otherwise = typePrimRep t == [BoxedRep Lifted] ||
+ (typePrimRep t == [BoxedRep Unlifted] && isAlgType t)
{- Note [unboxed tuple bytecodes and tuple_BCO]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1451,8 +1451,7 @@ primRepToFFIType platform r
AddrRep -> FFIPointer
FloatRep -> FFIFloat
DoubleRep -> FFIDouble
- LiftedRep -> FFIPointer
- UnliftedRep -> FFIPointer
+ BoxedRep _ -> FFIPointer
_ -> pprPanic "primRepToFFIType" (ppr r)
where
(signed_word, unsigned_word) = case platformWordSize platform of
@@ -1477,8 +1476,7 @@ mkDummyLiteral platform pr
AddrRep -> LitNullAddr
DoubleRep -> LitDouble 0
FloatRep -> LitFloat 0
- LiftedRep -> LitNullAddr
- UnliftedRep -> LitNullAddr
+ BoxedRep _ -> LitNullAddr
_ -> pprPanic "mkDummyLiteral" (ppr pr)