@@ -197,6 +197,22 @@ findAllUsedArgs sc topargs = filter (\x -> x `elem` topargs) (nu' sc) where
197197 nua (SucCase _ sc) = nu' sc
198198 nua (DefaultCase sc) = nu' sc
199199
200+-- Return whether name is used anywhere in a case tree
201+isUsed :: SC -> Name -> Bool
202+isUsed sc n = used sc where
203+
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
207+ used _ = False
208+
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
214+
215+
200216data Phase = CompileTime | RunTime
201217 deriving (Show, Eq)
202218
@@ -609,6 +625,14 @@ prune proj (Case n alts) = case alts' of
609625 -- | proj -> mkProj n 0 args (prune proj sc)
610626 -- mkProj n i xs sc = foldr (\x -> projRep x n i) sc xs
611627
628+ -- If none of the args are used in the sc, however, we can just replace it
629+ -- with sc
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']
634+ else sc'
635+
612636 [SucCase cn sc]
613637 | proj
614638 -> projRep cn n (-1) $ prune proj sc