@@ -197,6 +197,22 @@ findAllUsedArgs sc topargs = filter (\x -> x `elem` topargs) (nu' sc) where
197 nua (SucCase _ sc) = nu' sc
197 nua (SucCase _ sc) = nu' sc
198 nua (DefaultCase sc) = nu' sc
198 nua (DefaultCase sc) = nu' sc
200+-- Return whether name is used anywhere in a case tree
201+isUsed :: SC -> Name -> Bool
202+isUsed sc n = used sc where
204+ used (Case n' alts) = n == n' || or (map usedA alts)
205+ used (ProjCase t alts) = n `elem` freeNames t || or (map usedA alts)
206+ used (STerm t) = n `elem` freeNames t
209+ usedA (ConCase _ _ args sc) = used sc
210+ usedA (FnCase _ args sc) = used sc
211+ usedA (ConstCase _ sc) = used sc
212+ usedA (SucCase _ sc) = used sc
213+ usedA (DefaultCase sc) = used sc
200data Phase = CompileTime | RunTime
216data Phase = CompileTime | RunTime
201 deriving (Show, Eq)
217 deriving (Show, Eq)
@@ -609,6 +625,14 @@ prune proj (Case n alts) = case alts' of
609 -- | proj -> mkProj n 0 args (prune proj sc)
625 -- | proj -> mkProj n 0 args (prune proj sc)
610 -- mkProj n i xs sc = foldr (\x -> projRep x n i) sc xs
626 -- mkProj n i xs sc = foldr (\x -> projRep x n i) sc xs
628+ -- If none of the args are used in the sc, however, we can just replace it
630+ as@[ConCase cn i args sc]
631+ | proj -> let sc' = prune proj sc in
632+ if any (isUsed sc') args
633+ then Case n [ConCase cn i args sc']
612 [SucCase cn sc]
636 [SucCase cn sc]
614 -> projRep cn n (-1) $ prune proj sc
638 -> projRep cn n (-1) $ prune proj sc