module Yhc.Core.Unreachable (
coreUnreachableFuncs
,coreUnreachableDatas) where
import Yhc.Core
import qualified Data.Set as S
coreUnreachableFuncs :: Core -> [CoreFuncName]
coreUnreachableFuncs core =
let cfuns = coreFuncs core
calledBy fn = [f | CoreFun f <- universeExpr fn]
called = foldl (flip S.insert) S.empty (concat $ map calledBy cfuns)
defined = S.fromList (map coreFuncName cfuns)
in S.toList (called S.\\ defined)
coreUnreachableDatas :: Core -> [CoreCtorName]
coreUnreachableDatas core =
let called = S.fromList $ [x | CoreCon x <- universeExpr core] ++
[x | CoreCase _ alts <- universeExpr core, (PatCon x _,_) <- alts]
defined = S.fromList $ map coreCtorName $
concat $ map coreDataCtors $ coreDatas core
in S.toList (called S.\\ defined)