Panic with `-O -prof -fprof-auto` (regression in GHC 9.12)
## Summary
On GHC 9.12 (tested 9.12.2), compiling the following file (which was produced by Agda and then shrunk manually) panics with optimization and profiling.
Could not reproduce on GHC 9.10 and older (tried back to 9.2).
Downstream issue: https://github.com/agda/agda/issues/7869
## Steps to reproduce
Call to ghc at the beginning of this file:
```haskell
-- ghc -O -prof -fprof-auto
{-
<no location info>: error:
panic! (the 'impossible' happened)
GHC version 9.12.2:
getStgArgFromTrivialArg
case sat_s1qM @(*) @Any @(ZonkAny 67) of { UnsafeRefl co7_s1r4 ->
ww2_s1qK
`cast` (Sub (Sym co7_s1r4)
; SelCo:Fun(arg) (SelCo:Fun(res) (Sub co6_s1qU))
:: Any ~R# [ZonkAny 68])
}
Call stack:
CallStack (from HasCallStack):
callStackDoc, called at compiler/GHC/Utils/Panic.hs:190:37 in ghc-9.12.2-ea3d:GHC.Utils.Panic
pprPanic, called at compiler/GHC/CoreToStg.hs:586:13 in ghc-9.12.2-ea3d:GHC.CoreToStg
Please report this as a GHC bug: https://www.haskell.org/ghc/reportabug
-}
{-# OPTIONS_GHC -Wno-overlapping-patterns #-}
module OfSemiring where
import Prelude ( error )
import GHC.Exts ( Any )
import Unsafe.Coerce ( unsafeCoerce )
erased :: a
erased = unsafeCoerce (\ _ -> erased)
mazUnreachableError :: a
mazUnreachableError = error ("Agda: unreachable code reached.")
-- OfSemiring.Sigma
data Sigma = C_pair Any Any
-- OfSemiring.Nat
data Nat = C_zero | C_suc Nat
-- OfSemiring.Id
data Id = C_refl
-- OfSemiring.append
append :: [Any] -> [Any] -> [Any]
append v0 v1
= case unsafeCoerce v0 of
[] -> unsafeCoerce v1
(:) v2 v3
-> unsafeCoerce (:) (unsafeCoerce v2) (unsafeCoerce append (unsafeCoerce v3) (unsafeCoerce v1))
_ -> mazUnreachableError
-- OfSemiring.foldr
foldr :: (Any -> Any -> Any) -> Any -> [Any] -> Any
foldr v0 v1 v2
= case unsafeCoerce v2 of
[] -> unsafeCoerce v1
(:) v3 v4 -> unsafeCoerce v0 v3 (unsafeCoerce foldr (unsafeCoerce v0) (unsafeCoerce v1) (unsafeCoerce v4))
_ -> mazUnreachableError
-- OfSemiring.length
length :: [Any] -> Nat
length
= unsafeCoerce foldr (unsafeCoerce (\ v0 -> unsafeCoerce C_suc)) (unsafeCoerce C_zero)
-- OfSemiring.Semiring
data Semiring
= C_semiring
(Any -> Any -> Any)
(Any -> Any -> Any)
Any
(Any -> Any -> Any -> Any -> Any -> Any)
-- OfSemiring.Semiring.plus
plus :: Semiring -> Any -> Any -> Any
plus v0
= case unsafeCoerce v0 of
C_semiring v3 v4 v5 v6 -> unsafeCoerce v3
_ -> mazUnreachableError
-- OfSemiring.Semiring.times
times :: Semiring -> Any -> Any -> Any
times v0
= case unsafeCoerce v0 of
C_semiring v3 v4 v5 v6 -> unsafeCoerce v4
_ -> mazUnreachableError
-- OfSemiring.Semiring.zeroElem
zeroElem :: Semiring -> Any
zeroElem v0
= case unsafeCoerce v0 of
C_semiring v3 v4 v5 v6 -> unsafeCoerce v5
_ -> mazUnreachableError
-- OfSemiring.Semiring.transEq
transEq ::
Semiring ->
Any -> Any -> Any -> Any -> Any -> Any
transEq v0
= case unsafeCoerce v0 of
C_semiring v3 v4 v5 v6 -> unsafeCoerce v6
_ -> mazUnreachableError
-- OfSemiring._.SemiringList.zipWithTimes
zipWithTimes ::
Semiring -> [Any] -> [Any] -> [Any]
zipWithTimes v0 v1 v2
= let v3 = unsafeCoerce [] in
unsafeCoerce
(case unsafeCoerce v1 of
(:) v4 v5
-> case unsafeCoerce v2 of
(:) v6 v7
-> unsafeCoerce
(:) (unsafeCoerce times v0 v4 v6)
(unsafeCoerce zipWithTimes (unsafeCoerce v0) (unsafeCoerce v5) (unsafeCoerce v7))
_ -> unsafeCoerce v3
_ -> unsafeCoerce v3)
-- OfSemiring._.SemiringList.dotProduct
dotProduct ::
Semiring -> [Any] -> [Any] -> Any
dotProduct v0 v1 v2
= unsafeCoerce
foldr (unsafeCoerce plus (unsafeCoerce v0)) (unsafeCoerce zeroElem (unsafeCoerce v0))
(unsafeCoerce zipWithTimes (unsafeCoerce v0) (unsafeCoerce v1) (unsafeCoerce v2))
-- OfSemiring._.SemiringList.subListCons
subListCons ::
Semiring ->
Any -> [Any] -> Any -> Sigma -> Sigma
subListCons v0 v1 v2 v3 v4
= case unsafeCoerce v4 of
C_pair v5 v6
-> case unsafeCoerce v6 of
C_pair v7 v8
-> unsafeCoerce
C_pair (unsafeCoerce (:) (unsafeCoerce zeroElem (unsafeCoerce v0)) (unsafeCoerce v5))
(unsafeCoerce
C_pair erased
(unsafeCoerce
equal (unsafeCoerce v0) (unsafeCoerce v1) (unsafeCoerce v2) (unsafeCoerce v3) (unsafeCoerce v5) (unsafeCoerce v8)))
_ -> mazUnreachableError
_ -> mazUnreachableError
-- OfSemiring._.SemiringList._.qsbs
qsbs :: Semiring -> [Any] -> [Any] -> Any
qsbs v0 v1 v2
= unsafeCoerce dotProduct (unsafeCoerce v0) (unsafeCoerce v2) (unsafeCoerce v1)
-- OfSemiring._.SemiringList._.p1
p1
= error
"MAlonzo Runtime Error: postulate evaluated: OfSemiring._.SemiringList._.p1"
-- OfSemiring._.SemiringList._.p2
p2
= error
"MAlonzo Runtime Error: postulate evaluated: OfSemiring._.SemiringList._.p2"
-- OfSemiring._.SemiringList._.eq'
equal ::
Semiring ->
Any -> [Any] -> Any -> [Any] -> Any -> Any
equal v0 v1 v2 v3 v4 v5
= unsafeCoerce
transEq v0 v3
(unsafeCoerce
plus v0 (zeroElem (unsafeCoerce v0))
(unsafeCoerce qsbs (unsafeCoerce v0) (unsafeCoerce v2) (unsafeCoerce v4)))
(dotProduct
(unsafeCoerce v0) (unsafeCoerce (:) (unsafeCoerce zeroElem (unsafeCoerce v0)) (unsafeCoerce v4))
(unsafeCoerce (:) (unsafeCoerce v1) (unsafeCoerce v2)))
(unsafeCoerce
transEq v0 v3 (dotProduct (unsafeCoerce v0) (unsafeCoerce v4) (unsafeCoerce v2))
(unsafeCoerce
plus v0 (zeroElem (unsafeCoerce v0))
(unsafeCoerce qsbs (unsafeCoerce v0) (unsafeCoerce v2) (unsafeCoerce v4)))
v5 (unsafeCoerce p1 v0 v1 v2 v3 v4 erased v5))
(unsafeCoerce p2 v0 v1 v2 v3 v4 erased v5)
-- OfSemiring._.SemiringList.testSubList
testSubList ::
Semiring ->
[Any] -> [Any] -> Any -> Sigma -> Sigma
testSubList v0 v1 v2 v3 v4
= case unsafeCoerce v2 of
[] -> unsafeCoerce v4
(:) v5 v6
-> unsafeCoerce
subListCons (unsafeCoerce v0) (unsafeCoerce v5)
(unsafeCoerce append (unsafeCoerce v6) (unsafeCoerce v1)) (unsafeCoerce v3)
(unsafeCoerce
testSubList (unsafeCoerce v0) (unsafeCoerce v1) (unsafeCoerce v6) (unsafeCoerce v3) (unsafeCoerce v4))
_ -> mazUnreachableError
```
## Expected behavior
Compile without error.
## Environment
* GHC version used: 9.12.2
Optional:
* Operating System: macOS
* System Architecture: aarch64
issue