[GHC] #13142: GHC emits enormous core starting with 'Arity decrease'

#13142: GHC emits enormous core starting with 'Arity decrease' ----------------------------------------+--------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Keywords: | Operating System: Windows Architecture: Unknown/Multiple | Type of failure: None/Unknown Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: ----------------------------------------+--------------------------------- I discovered this when building [https://github.com/commercialhaskell/stack/commit/f117ffb034658e3e1c3fea2a88... stack] by stack on windows 10. I want to find problem area, but I can't even catch a clue. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: GHC emits enormous core starting with 'Arity decrease' ---------------------------------+---------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Operating System: Windows | Architecture: Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | ---------------------------------+---------------------------------------- Changes (by jeiea): * Attachment "error.7z" added. stack verbose output -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: Core simplifier crashes while building stack. -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Operating System: Windows | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * cc: Simonpj (added) * failure: None/Unknown => Compile-time crash or panic Comment: Thanks for the report, It would be nice if you had a smaller example or one that didn't use stack to reproduce this. I don't know if this is triggered by an issue in stack, but the simplifier shouldn't be crashing. Any ideas Simon? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: Core simplifier crashes while building stack. -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * os: Windows => Unknown/Multiple Comment: A couple of clarifications: 1. This isn't OS-specific - I can also reproduce it on Windows. 2. This has nothing to do with `stack` in particular, but rather one of its dependencies, `store`. (Aside: `store` is gaining a reputation for causing GHC bugs. See also #13059.) 3. This relies on building `store` with a debugging compiler (In fact, why is `stack` using a debugging compiler in the first place? Weird.) I tried to trim `store` down into as small of an example as I possibly could. Here's what I came up with: {{{#!hs {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE EmptyCase #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE UndecidableInstances #-} module StoreBug () where import Data.Foldable (foldl') import Data.Proxy import Data.Word import Foreign.Storable (Storable, sizeOf) import GHC.Generics import GHC.Types (Int(..)) import GHC.TypeLits newtype Type = VarT Name deriving Generic data Name = Name OccName NameFlavour deriving Generic data NameFlavour = NameS | NameQ ModName | NameU !Int | NameL !Int | NameG PkgName ModName deriving Generic newtype ModName = ModName String deriving Generic newtype PkgName = PkgName String deriving Generic newtype OccName = OccName String deriving Generic instance Store Type instance Store Name instance Store NameFlavour instance Store ModName instance Store OccName instance Store PkgName instance Store Char where {-# INLINE size #-} size = sizeStorableTy "Foreign.Storable.Storable GHC.Types.Char" instance Store Int where {-# INLINE size #-} size = undefined instance Store a => Store [a] where size = sizeSequence {-# INLINE size #-} sizeSequence :: forall a. Store a => Size [a] sizeSequence = VarSize $ \t -> case size :: Size a of ConstSize n -> n * (length t) + sizeOf (undefined :: Int) VarSize f -> foldl' (\acc x -> acc + f x) (sizeOf (undefined :: Int)) t {-# INLINE sizeSequence #-} class Store a where size :: Size a default size :: (Generic a, GStoreSize (Rep a)) => Size a size = genericSize {-# INLINE size #-} data Size a = VarSize (a -> Int) | ConstSize !Int getSizeWith :: Size a -> a -> Int getSizeWith (VarSize f) x = f x getSizeWith (ConstSize n) _ = n {-# INLINE getSizeWith #-} contramapSize :: (a -> b) -> Size b -> Size a contramapSize f (VarSize g) = VarSize (g . f) contramapSize _ (ConstSize n) = ConstSize n {-# INLINE contramapSize #-} combineSizeWith :: forall a b c. (c -> a) -> (c -> b) -> Size a -> Size b -> Size c combineSizeWith toA toB sizeA sizeB = case (sizeA, sizeB) of (VarSize f, VarSize g) -> VarSize (\x -> f (toA x) + g (toB x)) (VarSize f, ConstSize m) -> VarSize (\x -> f (toA x) + m) (ConstSize n, VarSize g) -> VarSize (\x -> n + g (toB x)) (ConstSize n, ConstSize m) -> ConstSize (n + m) {-# INLINE combineSizeWith #-} sizeStorableTy :: forall a. Storable a => String -> Size a sizeStorableTy ty = ConstSize (sizeOf (error msg :: a)) where msg = "In Data.Store.storableSize: " ++ ty ++ "'s sizeOf evaluated its argument." {-# INLINE sizeStorableTy #-} genericSize :: (Generic a, GStoreSize (Rep a)) => Size a genericSize = contramapSize from gsize {-# INLINE genericSize #-} type family SumArity (a :: * -> *) :: Nat where SumArity (C1 c a) = 1 SumArity (x :+: y) = SumArity x + SumArity y class GStoreSize f where gsize :: Size (f a) instance GStoreSize f => GStoreSize (M1 i c f) where gsize = contramapSize unM1 gsize {-# INLINE gsize #-} instance Store a => GStoreSize (K1 i a) where gsize = contramapSize unK1 size {-# INLINE gsize #-} instance GStoreSize U1 where gsize = ConstSize 0 {-# INLINE gsize #-} instance GStoreSize V1 where gsize = ConstSize 0 {-# INLINE gsize #-} instance (GStoreSize a, GStoreSize b) => GStoreSize (a :*: b) where gsize = combineSizeWith (\(x :*: _) -> x) (\(_ :*: y) -> y) gsize gsize {-# INLINE gsize #-} instance (SumArity (a :+: b) <= 255, GStoreSizeSum 0 (a :+: b)) => GStoreSize (a :+: b) where gsize = VarSize $ \x -> sizeOf (undefined :: Word8) + gsizeSum x (Proxy :: Proxy 0) {-# INLINE gsize #-} class KnownNat n => GStoreSizeSum (n :: Nat) (f :: * -> *) where gsizeSum :: f a -> Proxy n -> Int instance (GStoreSizeSum n a, GStoreSizeSum (n + SumArity a) b, KnownNat n) => GStoreSizeSum n (a :+: b) where gsizeSum (L1 l) _ = gsizeSum l (Proxy :: Proxy n) gsizeSum (R1 r) _ = gsizeSum r (Proxy :: Proxy (n + SumArity a)) {-# INLINE gsizeSum #-} instance (GStoreSize a, KnownNat n) => GStoreSizeSum n (C1 c a) where gsizeSum x _ = getSizeWith gsize x {-# INLINE gsizeSum #-} }}} And here's the panic I get when I compile it with a debug-enabled GHC HEAD: {{{ $ ~/Software/ghc5/inplace/bin/ghc-stage2 -fforce-recomp -O2 StoreBug.hs [1 of 1] Compiling StoreBug ( StoreBug.hs, StoreBug.o ) WARNING: file compiler/simplCore/SimplCore.hs, line 666 Simplifier bailing out after 4 iterations [3866, 755, 220, 8] Size = {terms: 1,490, types: 7,176, coercions: 4,808} ghc-stage2: panic! (the 'impossible' happened) (GHC version 8.1.20170121 for x86_64-unknown-linux): ASSERT failed! in_scope InScope {wild_00 wild_X25 g1_a33l g2_a33m $cfrom_a47d $cto_a47F $cfrom_a48a $cto_a48C $cfrom_a496 $cto_a4bk $cfrom_a4dA $cto_a4e2 $cfrom_a4ew $cto_a4fb $cfrom_a4fS $cto_a4gk $cp1GStoreSizeSum_a4gV $cgsizeSum_a4gX $cp1GStoreSizeSum_a4hh $cgsizeSum_a4hj $cgsize_a4hV $cgsize_a4ix $csize_a4iU $csize_a4j2 $csize_a4jb $csize_a4jj $csize_a4jw $csize_a4jJ $csize_a4jW $csize_a4k9 $csize_a4km $cgsize_a4kD $cgsize_a4kY $cgsize_a4l6 $cgsize_a4li $dGStoreSize_a4qQ $dGStoreSize_a4qW $dGStoreSize_a4r2 $dGStoreSize_a4r8 $dGStoreSize_a4BJ $dGStoreSize_a4BS ww2_a5CX sizeSequence genericSize $tc'ModName $tcModName $tc'PkgName $tcPkgName $tc'NameS $tc'NameQ $tc'NameU $tc'NameL $tc'NameG $tcNameFlavour $tc'OccName $tcOccName $tc'Name $tcName $tc'VarT $tcType $tc'VarSize $tc'ConstSize $tcSize $tcGStoreSize $tc'C:GStoreSize $fGStoreSize:*: $fGStoreSizeV1 $fGStoreSizeU1 $fGStoreSizeM1 $tcStore $dmsize $tc'C:Store $fGStoreSizeK1 $fStore[] $fStoreInt $fStoreChar $fStorePkgName $fStoreOccName $fStoreModName $fStoreNameFlavour $fStoreName $fStoreType $tcGStoreSizeSum $tc'C:GStoreSizeSum $fGStoreSizeSumnM1 $fGStoreSizeSumn:+: $fGStoreSize:+: $fGenericModName $fGenericPkgName $fGenericNameFlavour $fGenericOccName $fGenericName $fGenericType $trModule $cto_s4Pr $cfrom_s4Ps $cfrom_s4Pv $cto_s4Pw $cfrom_s4Px $cfrom_s4PF $cto_s4PG $cfrom_s4PH $cto_s4PI $cfrom_s4PJ $trModule_s50k $trModule_s50l $trModule_s50m $trModule_s50n $tc'ModName_s50o $tc'ModName_s50p $tcModName_s50q $tcModName_s50r $tc'PkgName_s50s $tc'PkgName_s50t $tcPkgName_s50u $tcPkgName_s50v $tc'NameG_s50w $tc'NameG_s50x $tc'NameL_s50y $tc'NameL_s50z $tc'NameU_s50A $tc'NameU_s50B $tc'NameQ_s50C $tc'NameQ_s50D $tc'NameS_s50E $tc'NameS_s50F $tcNameFlavour_s50G $tcNameFlavour_s50H $tc'OccName_s50I $tc'OccName_s50J $tcOccName_s50K $tcOccName_s50L $tc'Name_s50M $tc'Name_s50N $tcName_s50O $tcName_s50P $tc'VarT_s50Q $tc'VarT_s50R $tcType_s50S $tcType_s50T $tc'ConstSize_s50U $tc'ConstSize_s50V $tc'VarSize_s50W $tc'VarSize_s50X $tcSize_s50Y $tcSize_s50Z $tc'C:GStoreSize_s510 $tc'C:GStoreSize_s511 $tcGStoreSize_s512 $tcGStoreSize_s513 $tc'C:Store_s514 $tc'C:Store_s515 $tcStore_s516 $tcStore_s517 $tc'C:GStoreSizeSum_s518 $tc'C:GStoreSizeSum_s519 $tcGStoreSizeSum_s51a $tcGStoreSizeSum_s51b $sgenericSize_s59c $sgenericSize_s59f $sgenericSize_s59i $sgenericSize_s59l $sgenericSize_s59o $sgenericSize_s59r $sgsize_s59B $sgsize_s59D $sgsize_s59F $sgsize_s59H $sgsize_s59J $sgsize_s59L lvl_s5bw lvl_s5bx $csize_s5i3 $dGStoreSize_s5jy $dGStoreSize_s5jM $dGStoreSize_s5k0 $dGStoreSize_s5kc $dGStoreSize_s5lQ $dGStoreSize_s5od $dGStoreSize_s5rC g_s5tx g_s5tA g_s5tD $dGStoreSize_s5u4 g_s5u5 $dGStoreSize_s5uv $dGStoreSize_s5uZ $sgenericSize_s5v0 $csize_s5v2 g_s5vy $sgenericSize_s5vA $csize_s5vF $w$j_s5Wr a_s5Ws ww_s5Ww ww_s5Wx $wg_s5WC $w$dGStoreSize_s5WI $wg_s5WT lvl_s65L lvl_s65M lvl_s65N lvl_s65O lvl_s65P lvl_s65Q lvl_s65R lvl_s65S lvl_s65T lvl_s65U lvl_s65W lvl_s65X lvl_s65Y lvl_s65Z lvl_s660 lvl_s661 lvl_s662 lvl_s663 lvl_s664 lvl_s665 lvl_s666 lvl_s667 lvl_s66c lvl_s66d lvl_s66e lvl_s66f lvl_s66g lvl_s66h lvl_s66i lvl_s66j lvl_s66k lvl_s66l lvl_s66m lvl_s66n lvl_s66s lvl_s66t lvl_s66u lvl_s66v lvl_s66w lvl_s66x lvl_s66y lvl_s66z lvl_s66A lvl_s66B lvl_s66C lvl_s66D lvl_s66I lvl_s66J lvl_s66K lvl_s66L $s$w$j_s69S $s$w$j_s69T $s$w$j_s69U} tenv [] tenvFVs [] cenv [s69R :-> sg_s69R] cenvFVs [s69R :-> sg_s69R] tys [R] cos [] Call stack: CallStack (from HasCallStack): prettyCurrentCallStack, called at compiler/utils/Outputable.hs:1166:58 in ghc:Outputable callStackDoc, called at compiler/utils/Outputable.hs:1215:22 in ghc:Outputable assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in ghc:TyCoRep checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in ghc:TyCoRep substTy, called at compiler/types/OptCoercion.hs:345:12 in ghc:OptCoercion Call stack: CallStack (from HasCallStack): prettyCurrentCallStack, called at compiler/utils/Outputable.hs:1166:58 in ghc:Outputable callStackDoc, called at compiler/utils/Outputable.hs:1170:37 in ghc:Outputable pprPanic, called at compiler/utils/Outputable.hs:1213:5 in ghc:Outputable assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in ghc:TyCoRep checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in ghc:TyCoRep substTy, called at compiler/types/OptCoercion.hs:345:12 in ghc:OptCoercion }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: Substitution invariant failure arising from OptCoercion -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Determinism Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by mpickering): * keywords: => Determinism @@ -1,5 +1,315 @@ - I discovered this when building - [https://github.com/commercialhaskell/stack/commit/f117ffb034658e3e1c3fea2a88... - stack] by stack on windows 10. - - I want to find problem area, but I can't even catch a clue. + When built with a debugging compiler, the following snippet fails because + of the substitution invariant. + + {{{ + {-# LANGUAGE BangPatterns #-} + {-# LANGUAGE DataKinds #-} + {-# LANGUAGE DefaultSignatures #-} + {-# LANGUAGE DeriveFunctor #-} + {-# LANGUAGE DeriveGeneric #-} + {-# LANGUAGE EmptyCase #-} + {-# LANGUAGE FlexibleContexts #-} + {-# LANGUAGE FlexibleInstances #-} + {-# LANGUAGE KindSignatures #-} + {-# LANGUAGE MagicHash #-} + {-# LANGUAGE MultiParamTypeClasses #-} + {-# LANGUAGE RankNTypes #-} + {-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE TypeFamilies #-} + {-# LANGUAGE TypeOperators #-} + {-# LANGUAGE UnboxedTuples #-} + {-# LANGUAGE UndecidableInstances #-} + module StoreBug () where + + import Data.Foldable (foldl') + import Data.Proxy + import Data.Word + import Foreign.Storable (Storable, sizeOf) + import GHC.Generics + import GHC.Types (Int(..)) + import GHC.TypeLits + + newtype Type = VarT Name + deriving Generic + + data Name = Name OccName NameFlavour + deriving Generic + + data NameFlavour + = NameS + | NameQ ModName + | NameU !Int + | NameL !Int + | NameG PkgName ModName + deriving Generic + + newtype ModName = ModName String + deriving Generic + + newtype PkgName = PkgName String + deriving Generic + + newtype OccName = OccName String + deriving Generic + + instance Store Type + instance Store Name + instance Store NameFlavour + instance Store ModName + instance Store OccName + instance Store PkgName + + instance Store Char where + {-# INLINE size #-} + size = sizeStorableTy "Foreign.Storable.Storable GHC.Types.Char" + + instance Store Int where + {-# INLINE size #-} + size = undefined + + instance Store a => Store [a] where + size = sizeSequence + {-# INLINE size #-} + + sizeSequence :: forall a. Store a => Size [a] + sizeSequence = VarSize $ \t -> + case size :: Size a of + ConstSize n -> n * (length t) + sizeOf (undefined :: Int) + VarSize f -> foldl' (\acc x -> acc + f x) (sizeOf (undefined :: + Int)) t + {-# INLINE sizeSequence #-} + + class Store a where + size :: Size a + + default size :: (Generic a, GStoreSize (Rep a)) => Size a + size = genericSize + {-# INLINE size #-} + + data Size a + = VarSize (a -> Int) + | ConstSize !Int + + getSizeWith :: Size a -> a -> Int + getSizeWith (VarSize f) x = f x + getSizeWith (ConstSize n) _ = n + {-# INLINE getSizeWith #-} + + contramapSize :: (a -> b) -> Size b -> Size a + contramapSize f (VarSize g) = VarSize (g . f) + contramapSize _ (ConstSize n) = ConstSize n + {-# INLINE contramapSize #-} + + combineSizeWith :: forall a b c. (c -> a) -> (c -> b) -> Size a -> Size b + -> Size c + combineSizeWith toA toB sizeA sizeB = + case (sizeA, sizeB) of + (VarSize f, VarSize g) -> VarSize (\x -> f (toA x) + g (toB x)) + (VarSize f, ConstSize m) -> VarSize (\x -> f (toA x) + m) + (ConstSize n, VarSize g) -> VarSize (\x -> n + g (toB x)) + (ConstSize n, ConstSize m) -> ConstSize (n + m) + {-# INLINE combineSizeWith #-} + + sizeStorableTy :: forall a. Storable a => String -> Size a + sizeStorableTy ty = ConstSize (sizeOf (error msg :: a)) + where + msg = "In Data.Store.storableSize: " ++ ty ++ "'s sizeOf evaluated its + argument." + {-# INLINE sizeStorableTy #-} + + genericSize :: (Generic a, GStoreSize (Rep a)) => Size a + genericSize = contramapSize from gsize + {-# INLINE genericSize #-} + + type family SumArity (a :: * -> *) :: Nat where + SumArity (C1 c a) = 1 + SumArity (x :+: y) = SumArity x + SumArity y + + class GStoreSize f where gsize :: Size (f a) + + instance GStoreSize f => GStoreSize (M1 i c f) where + gsize = contramapSize unM1 gsize + {-# INLINE gsize #-} + + instance Store a => GStoreSize (K1 i a) where + gsize = contramapSize unK1 size + {-# INLINE gsize #-} + + instance GStoreSize U1 where + gsize = ConstSize 0 + {-# INLINE gsize #-} + + instance GStoreSize V1 where + gsize = ConstSize 0 + {-# INLINE gsize #-} + + instance (GStoreSize a, GStoreSize b) => GStoreSize (a :*: b) where + gsize = combineSizeWith (\(x :*: _) -> x) (\(_ :*: y) -> y) gsize + gsize + {-# INLINE gsize #-} + + instance (SumArity (a :+: b) <= 255, GStoreSizeSum 0 (a :+: b)) + => GStoreSize (a :+: b) where + gsize = VarSize $ \x -> sizeOf (undefined :: Word8) + gsizeSum x + (Proxy :: Proxy 0) + {-# INLINE gsize #-} + + class KnownNat n => GStoreSizeSum (n :: Nat) (f :: * -> *) where gsizeSum + :: f a -> Proxy n -> Int + + instance (GStoreSizeSum n a, GStoreSizeSum (n + SumArity a) b, KnownNat n) + => GStoreSizeSum n (a :+: b) where + gsizeSum (L1 l) _ = gsizeSum l (Proxy :: Proxy n) + gsizeSum (R1 r) _ = gsizeSum r (Proxy :: Proxy (n + SumArity a)) + {-# INLINE gsizeSum #-} + + instance (GStoreSize a, KnownNat n) => GStoreSizeSum n (C1 c a) where + gsizeSum x _ = getSizeWith gsize x + {-# INLINE gsizeSum #-} + }}} + + The assertion failure is + + {{{ + $ ~/Software/ghc5/inplace/bin/ghc-stage2 -fforce-recomp -O2 StoreBug.hs + [1 of 1] Compiling StoreBug ( StoreBug.hs, StoreBug.o ) + WARNING: file compiler/simplCore/SimplCore.hs, line 666 + Simplifier bailing out after 4 iterations [3866, 755, 220, 8] + Size = {terms: 1,490, types: 7,176, coercions: 4,808} + ghc-stage2: panic! (the 'impossible' happened) + (GHC version 8.1.20170121 for x86_64-unknown-linux): + ASSERT failed! + in_scope InScope {wild_00 wild_X25 g1_a33l g2_a33m $cfrom_a47d + $cto_a47F $cfrom_a48a $cto_a48C $cfrom_a496 $cto_a4bk + $cfrom_a4dA + $cto_a4e2 $cfrom_a4ew $cto_a4fb $cfrom_a4fS $cto_a4gk + $cp1GStoreSizeSum_a4gV $cgsizeSum_a4gX + $cp1GStoreSizeSum_a4hh + $cgsizeSum_a4hj $cgsize_a4hV $cgsize_a4ix $csize_a4iU + $csize_a4j2 + $csize_a4jb $csize_a4jj $csize_a4jw $csize_a4jJ + $csize_a4jW + $csize_a4k9 $csize_a4km $cgsize_a4kD $cgsize_a4kY + $cgsize_a4l6 + $cgsize_a4li $dGStoreSize_a4qQ $dGStoreSize_a4qW + $dGStoreSize_a4r2 + $dGStoreSize_a4r8 $dGStoreSize_a4BJ $dGStoreSize_a4BS + ww2_a5CX + sizeSequence genericSize $tc'ModName $tcModName + $tc'PkgName + $tcPkgName $tc'NameS $tc'NameQ $tc'NameU $tc'NameL + $tc'NameG + $tcNameFlavour $tc'OccName $tcOccName $tc'Name $tcName + $tc'VarT + $tcType $tc'VarSize $tc'ConstSize $tcSize + $tcGStoreSize + $tc'C:GStoreSize $fGStoreSize:*: $fGStoreSizeV1 + $fGStoreSizeU1 + $fGStoreSizeM1 $tcStore $dmsize $tc'C:Store + $fGStoreSizeK1 + $fStore[] $fStoreInt $fStoreChar $fStorePkgName + $fStoreOccName + $fStoreModName $fStoreNameFlavour $fStoreName + $fStoreType + $tcGStoreSizeSum $tc'C:GStoreSizeSum + $fGStoreSizeSumnM1 + $fGStoreSizeSumn:+: $fGStoreSize:+: $fGenericModName + $fGenericPkgName $fGenericNameFlavour $fGenericOccName + $fGenericName $fGenericType $trModule $cto_s4Pr + $cfrom_s4Ps + $cfrom_s4Pv $cto_s4Pw $cfrom_s4Px $cfrom_s4PF + $cto_s4PG $cfrom_s4PH + $cto_s4PI $cfrom_s4PJ $trModule_s50k $trModule_s50l + $trModule_s50m + $trModule_s50n $tc'ModName_s50o $tc'ModName_s50p + $tcModName_s50q + $tcModName_s50r $tc'PkgName_s50s $tc'PkgName_s50t + $tcPkgName_s50u + $tcPkgName_s50v $tc'NameG_s50w $tc'NameG_s50x + $tc'NameL_s50y + $tc'NameL_s50z $tc'NameU_s50A $tc'NameU_s50B + $tc'NameQ_s50C + $tc'NameQ_s50D $tc'NameS_s50E $tc'NameS_s50F + $tcNameFlavour_s50G + $tcNameFlavour_s50H $tc'OccName_s50I $tc'OccName_s50J + $tcOccName_s50K $tcOccName_s50L $tc'Name_s50M + $tc'Name_s50N + $tcName_s50O $tcName_s50P $tc'VarT_s50Q $tc'VarT_s50R + $tcType_s50S + $tcType_s50T $tc'ConstSize_s50U $tc'ConstSize_s50V + $tc'VarSize_s50W + $tc'VarSize_s50X $tcSize_s50Y $tcSize_s50Z + $tc'C:GStoreSize_s510 + $tc'C:GStoreSize_s511 $tcGStoreSize_s512 + $tcGStoreSize_s513 + $tc'C:Store_s514 $tc'C:Store_s515 $tcStore_s516 + $tcStore_s517 + $tc'C:GStoreSizeSum_s518 $tc'C:GStoreSizeSum_s519 + $tcGStoreSizeSum_s51a $tcGStoreSizeSum_s51b + $sgenericSize_s59c + $sgenericSize_s59f $sgenericSize_s59i + $sgenericSize_s59l + $sgenericSize_s59o $sgenericSize_s59r $sgsize_s59B + $sgsize_s59D + $sgsize_s59F $sgsize_s59H $sgsize_s59J $sgsize_s59L + lvl_s5bw + lvl_s5bx $csize_s5i3 $dGStoreSize_s5jy + $dGStoreSize_s5jM + $dGStoreSize_s5k0 $dGStoreSize_s5kc $dGStoreSize_s5lQ + $dGStoreSize_s5od $dGStoreSize_s5rC g_s5tx g_s5tA + g_s5tD + $dGStoreSize_s5u4 g_s5u5 $dGStoreSize_s5uv + $dGStoreSize_s5uZ + $sgenericSize_s5v0 $csize_s5v2 g_s5vy + $sgenericSize_s5vA + $csize_s5vF $w$j_s5Wr a_s5Ws ww_s5Ww ww_s5Wx $wg_s5WC + $w$dGStoreSize_s5WI $wg_s5WT lvl_s65L lvl_s65M + lvl_s65N lvl_s65O + lvl_s65P lvl_s65Q lvl_s65R lvl_s65S lvl_s65T lvl_s65U + lvl_s65W + lvl_s65X lvl_s65Y lvl_s65Z lvl_s660 lvl_s661 lvl_s662 + lvl_s663 + lvl_s664 lvl_s665 lvl_s666 lvl_s667 lvl_s66c lvl_s66d + lvl_s66e + lvl_s66f lvl_s66g lvl_s66h lvl_s66i lvl_s66j lvl_s66k + lvl_s66l + lvl_s66m lvl_s66n lvl_s66s lvl_s66t lvl_s66u lvl_s66v + lvl_s66w + lvl_s66x lvl_s66y lvl_s66z lvl_s66A lvl_s66B lvl_s66C + lvl_s66D + lvl_s66I lvl_s66J lvl_s66K lvl_s66L $s$w$j_s69S + $s$w$j_s69T + $s$w$j_s69U} + tenv [] + tenvFVs [] + cenv [s69R :-> sg_s69R] + cenvFVs [s69R :-> sg_s69R] + tys [R] + cos [] + Call stack: + CallStack (from HasCallStack): + prettyCurrentCallStack, called at + compiler/utils/Outputable.hs:1166:58 in ghc:Outputable + callStackDoc, called at compiler/utils/Outputable.hs:1215:22 in + ghc:Outputable + assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in + ghc:TyCoRep + checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in + ghc:TyCoRep + substTy, called at compiler/types/OptCoercion.hs:345:12 in + ghc:OptCoercion + Call stack: + CallStack (from HasCallStack): + prettyCurrentCallStack, called at + compiler/utils/Outputable.hs:1166:58 in ghc:Outputable + callStackDoc, called at compiler/utils/Outputable.hs:1170:37 in + ghc:Outputable + pprPanic, called at compiler/utils/Outputable.hs:1213:5 in + ghc:Outputable + assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in + ghc:TyCoRep + checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in + ghc:TyCoRep + substTy, called at compiler/types/OptCoercion.hs:345:12 in + ghc:OptCoercion + }}} New description: When built with a debugging compiler, the following snippet fails because of the substitution invariant. {{{ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE EmptyCase #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE UndecidableInstances #-} module StoreBug () where import Data.Foldable (foldl') import Data.Proxy import Data.Word import Foreign.Storable (Storable, sizeOf) import GHC.Generics import GHC.Types (Int(..)) import GHC.TypeLits newtype Type = VarT Name deriving Generic data Name = Name OccName NameFlavour deriving Generic data NameFlavour = NameS | NameQ ModName | NameU !Int | NameL !Int | NameG PkgName ModName deriving Generic newtype ModName = ModName String deriving Generic newtype PkgName = PkgName String deriving Generic newtype OccName = OccName String deriving Generic instance Store Type instance Store Name instance Store NameFlavour instance Store ModName instance Store OccName instance Store PkgName instance Store Char where {-# INLINE size #-} size = sizeStorableTy "Foreign.Storable.Storable GHC.Types.Char" instance Store Int where {-# INLINE size #-} size = undefined instance Store a => Store [a] where size = sizeSequence {-# INLINE size #-} sizeSequence :: forall a. Store a => Size [a] sizeSequence = VarSize $ \t -> case size :: Size a of ConstSize n -> n * (length t) + sizeOf (undefined :: Int) VarSize f -> foldl' (\acc x -> acc + f x) (sizeOf (undefined :: Int)) t {-# INLINE sizeSequence #-} class Store a where size :: Size a default size :: (Generic a, GStoreSize (Rep a)) => Size a size = genericSize {-# INLINE size #-} data Size a = VarSize (a -> Int) | ConstSize !Int getSizeWith :: Size a -> a -> Int getSizeWith (VarSize f) x = f x getSizeWith (ConstSize n) _ = n {-# INLINE getSizeWith #-} contramapSize :: (a -> b) -> Size b -> Size a contramapSize f (VarSize g) = VarSize (g . f) contramapSize _ (ConstSize n) = ConstSize n {-# INLINE contramapSize #-} combineSizeWith :: forall a b c. (c -> a) -> (c -> b) -> Size a -> Size b -> Size c combineSizeWith toA toB sizeA sizeB = case (sizeA, sizeB) of (VarSize f, VarSize g) -> VarSize (\x -> f (toA x) + g (toB x)) (VarSize f, ConstSize m) -> VarSize (\x -> f (toA x) + m) (ConstSize n, VarSize g) -> VarSize (\x -> n + g (toB x)) (ConstSize n, ConstSize m) -> ConstSize (n + m) {-# INLINE combineSizeWith #-} sizeStorableTy :: forall a. Storable a => String -> Size a sizeStorableTy ty = ConstSize (sizeOf (error msg :: a)) where msg = "In Data.Store.storableSize: " ++ ty ++ "'s sizeOf evaluated its argument." {-# INLINE sizeStorableTy #-} genericSize :: (Generic a, GStoreSize (Rep a)) => Size a genericSize = contramapSize from gsize {-# INLINE genericSize #-} type family SumArity (a :: * -> *) :: Nat where SumArity (C1 c a) = 1 SumArity (x :+: y) = SumArity x + SumArity y class GStoreSize f where gsize :: Size (f a) instance GStoreSize f => GStoreSize (M1 i c f) where gsize = contramapSize unM1 gsize {-# INLINE gsize #-} instance Store a => GStoreSize (K1 i a) where gsize = contramapSize unK1 size {-# INLINE gsize #-} instance GStoreSize U1 where gsize = ConstSize 0 {-# INLINE gsize #-} instance GStoreSize V1 where gsize = ConstSize 0 {-# INLINE gsize #-} instance (GStoreSize a, GStoreSize b) => GStoreSize (a :*: b) where gsize = combineSizeWith (\(x :*: _) -> x) (\(_ :*: y) -> y) gsize gsize {-# INLINE gsize #-} instance (SumArity (a :+: b) <= 255, GStoreSizeSum 0 (a :+: b)) => GStoreSize (a :+: b) where gsize = VarSize $ \x -> sizeOf (undefined :: Word8) + gsizeSum x (Proxy :: Proxy 0) {-# INLINE gsize #-} class KnownNat n => GStoreSizeSum (n :: Nat) (f :: * -> *) where gsizeSum :: f a -> Proxy n -> Int instance (GStoreSizeSum n a, GStoreSizeSum (n + SumArity a) b, KnownNat n) => GStoreSizeSum n (a :+: b) where gsizeSum (L1 l) _ = gsizeSum l (Proxy :: Proxy n) gsizeSum (R1 r) _ = gsizeSum r (Proxy :: Proxy (n + SumArity a)) {-# INLINE gsizeSum #-} instance (GStoreSize a, KnownNat n) => GStoreSizeSum n (C1 c a) where gsizeSum x _ = getSizeWith gsize x {-# INLINE gsizeSum #-} }}} The assertion failure is {{{ $ ~/Software/ghc5/inplace/bin/ghc-stage2 -fforce-recomp -O2 StoreBug.hs [1 of 1] Compiling StoreBug ( StoreBug.hs, StoreBug.o ) WARNING: file compiler/simplCore/SimplCore.hs, line 666 Simplifier bailing out after 4 iterations [3866, 755, 220, 8] Size = {terms: 1,490, types: 7,176, coercions: 4,808} ghc-stage2: panic! (the 'impossible' happened) (GHC version 8.1.20170121 for x86_64-unknown-linux): ASSERT failed! in_scope InScope {wild_00 wild_X25 g1_a33l g2_a33m $cfrom_a47d $cto_a47F $cfrom_a48a $cto_a48C $cfrom_a496 $cto_a4bk $cfrom_a4dA $cto_a4e2 $cfrom_a4ew $cto_a4fb $cfrom_a4fS $cto_a4gk $cp1GStoreSizeSum_a4gV $cgsizeSum_a4gX $cp1GStoreSizeSum_a4hh $cgsizeSum_a4hj $cgsize_a4hV $cgsize_a4ix $csize_a4iU $csize_a4j2 $csize_a4jb $csize_a4jj $csize_a4jw $csize_a4jJ $csize_a4jW $csize_a4k9 $csize_a4km $cgsize_a4kD $cgsize_a4kY $cgsize_a4l6 $cgsize_a4li $dGStoreSize_a4qQ $dGStoreSize_a4qW $dGStoreSize_a4r2 $dGStoreSize_a4r8 $dGStoreSize_a4BJ $dGStoreSize_a4BS ww2_a5CX sizeSequence genericSize $tc'ModName $tcModName $tc'PkgName $tcPkgName $tc'NameS $tc'NameQ $tc'NameU $tc'NameL $tc'NameG $tcNameFlavour $tc'OccName $tcOccName $tc'Name $tcName $tc'VarT $tcType $tc'VarSize $tc'ConstSize $tcSize $tcGStoreSize $tc'C:GStoreSize $fGStoreSize:*: $fGStoreSizeV1 $fGStoreSizeU1 $fGStoreSizeM1 $tcStore $dmsize $tc'C:Store $fGStoreSizeK1 $fStore[] $fStoreInt $fStoreChar $fStorePkgName $fStoreOccName $fStoreModName $fStoreNameFlavour $fStoreName $fStoreType $tcGStoreSizeSum $tc'C:GStoreSizeSum $fGStoreSizeSumnM1 $fGStoreSizeSumn:+: $fGStoreSize:+: $fGenericModName $fGenericPkgName $fGenericNameFlavour $fGenericOccName $fGenericName $fGenericType $trModule $cto_s4Pr $cfrom_s4Ps $cfrom_s4Pv $cto_s4Pw $cfrom_s4Px $cfrom_s4PF $cto_s4PG $cfrom_s4PH $cto_s4PI $cfrom_s4PJ $trModule_s50k $trModule_s50l $trModule_s50m $trModule_s50n $tc'ModName_s50o $tc'ModName_s50p $tcModName_s50q $tcModName_s50r $tc'PkgName_s50s $tc'PkgName_s50t $tcPkgName_s50u $tcPkgName_s50v $tc'NameG_s50w $tc'NameG_s50x $tc'NameL_s50y $tc'NameL_s50z $tc'NameU_s50A $tc'NameU_s50B $tc'NameQ_s50C $tc'NameQ_s50D $tc'NameS_s50E $tc'NameS_s50F $tcNameFlavour_s50G $tcNameFlavour_s50H $tc'OccName_s50I $tc'OccName_s50J $tcOccName_s50K $tcOccName_s50L $tc'Name_s50M $tc'Name_s50N $tcName_s50O $tcName_s50P $tc'VarT_s50Q $tc'VarT_s50R $tcType_s50S $tcType_s50T $tc'ConstSize_s50U $tc'ConstSize_s50V $tc'VarSize_s50W $tc'VarSize_s50X $tcSize_s50Y $tcSize_s50Z $tc'C:GStoreSize_s510 $tc'C:GStoreSize_s511 $tcGStoreSize_s512 $tcGStoreSize_s513 $tc'C:Store_s514 $tc'C:Store_s515 $tcStore_s516 $tcStore_s517 $tc'C:GStoreSizeSum_s518 $tc'C:GStoreSizeSum_s519 $tcGStoreSizeSum_s51a $tcGStoreSizeSum_s51b $sgenericSize_s59c $sgenericSize_s59f $sgenericSize_s59i $sgenericSize_s59l $sgenericSize_s59o $sgenericSize_s59r $sgsize_s59B $sgsize_s59D $sgsize_s59F $sgsize_s59H $sgsize_s59J $sgsize_s59L lvl_s5bw lvl_s5bx $csize_s5i3 $dGStoreSize_s5jy $dGStoreSize_s5jM $dGStoreSize_s5k0 $dGStoreSize_s5kc $dGStoreSize_s5lQ $dGStoreSize_s5od $dGStoreSize_s5rC g_s5tx g_s5tA g_s5tD $dGStoreSize_s5u4 g_s5u5 $dGStoreSize_s5uv $dGStoreSize_s5uZ $sgenericSize_s5v0 $csize_s5v2 g_s5vy $sgenericSize_s5vA $csize_s5vF $w$j_s5Wr a_s5Ws ww_s5Ww ww_s5Wx $wg_s5WC $w$dGStoreSize_s5WI $wg_s5WT lvl_s65L lvl_s65M lvl_s65N lvl_s65O lvl_s65P lvl_s65Q lvl_s65R lvl_s65S lvl_s65T lvl_s65U lvl_s65W lvl_s65X lvl_s65Y lvl_s65Z lvl_s660 lvl_s661 lvl_s662 lvl_s663 lvl_s664 lvl_s665 lvl_s666 lvl_s667 lvl_s66c lvl_s66d lvl_s66e lvl_s66f lvl_s66g lvl_s66h lvl_s66i lvl_s66j lvl_s66k lvl_s66l lvl_s66m lvl_s66n lvl_s66s lvl_s66t lvl_s66u lvl_s66v lvl_s66w lvl_s66x lvl_s66y lvl_s66z lvl_s66A lvl_s66B lvl_s66C lvl_s66D lvl_s66I lvl_s66J lvl_s66K lvl_s66L $s$w$j_s69S $s$w$j_s69T $s$w$j_s69U} tenv [] tenvFVs [] cenv [s69R :-> sg_s69R] cenvFVs [s69R :-> sg_s69R] tys [R] cos [] Call stack: CallStack (from HasCallStack): prettyCurrentCallStack, called at compiler/utils/Outputable.hs:1166:58 in ghc:Outputable callStackDoc, called at compiler/utils/Outputable.hs:1215:22 in ghc:Outputable assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in ghc:TyCoRep checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in ghc:TyCoRep substTy, called at compiler/types/OptCoercion.hs:345:12 in ghc:OptCoercion Call stack: CallStack (from HasCallStack): prettyCurrentCallStack, called at compiler/utils/Outputable.hs:1166:58 in ghc:Outputable callStackDoc, called at compiler/utils/Outputable.hs:1170:37 in ghc:Outputable pprPanic, called at compiler/utils/Outputable.hs:1213:5 in ghc:Outputable assertPprPanic, called at compiler/types/TyCoRep.hs:2078:56 in ghc:TyCoRep checkValidSubst, called at compiler/types/TyCoRep.hs:2111:17 in ghc:TyCoRep substTy, called at compiler/types/OptCoercion.hs:345:12 in ghc:OptCoercion }}} -- Comment: Wow, great job Ryan once again. It does appear to be a bug but probably a harmless one, the answer is to try using a normal version of the compiler. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: Substitution invariant failure arising from OptCoercion -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Determinism Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Phyx-): I wouldn't say the answer is ignoring the assert, if it is then what's the point of the assert? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#13142: Substitution invariant failure arising from OptCoercion -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Determinism Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: #11371 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by mpickering): * related: => #11371 Comment: #11371 is related. There are still about 40 calls in the compiler where this isn't checked at all. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

I wouldn't say the answer is ignoring the assert, if it is then what's
#13142: Substitution invariant failure arising from OptCoercion -------------------------------------+------------------------------------- Reporter: jeiea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Determinism Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: #11371 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): the point of the assert? Correct; but it's a good way to get moving again. In this case, failure of the assertion probably won't lead to anything bad happening. It's not a reason to ignore the bug! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13142#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC