module Tip.Pass.EliminateDeadCode where
import Tip.Core
import qualified Data.Set as Set
import Data.Generics.Geniplate
eliminateDeadCode :: Ord a => Theory a -> Theory a
eliminateDeadCode = fixpoint elim
where
elim thy@Theory{..} =
thy {
thy_sigs = filter (flip Set.member alive . sig_name) thy_sigs,
thy_funcs = filter (flip Set.member alive . func_name) thy_funcs }
where
alive = Set.fromList (map gbl_name (universeBi thy))
fixpoint :: Eq a => (a -> a) -> a -> a
fixpoint f x
| x == y = x
| otherwise = fixpoint f y
where
y = f x