X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FsimplCore%2FLiberateCase.lhs;fp=compiler%2FsimplCore%2FLiberateCase.lhs;h=afda3b3fecf92affd04a14a94c5efbad5679c90a;hb=21174275446082358e427adec454d7e1c183fd37;hp=eebb11c5872ee03046a39a5a6684ec9a747c10b7;hpb=d3ff6e08657a785616eb45860bae07de3032a950;p=ghc-hetmet.git diff --git a/compiler/simplCore/LiberateCase.lhs b/compiler/simplCore/LiberateCase.lhs index eebb11c..afda3b3 100644 --- a/compiler/simplCore/LiberateCase.lhs +++ b/compiler/simplCore/LiberateCase.lhs @@ -81,6 +81,15 @@ Similarly drop: Would like to pass n along unboxed. +Note [Scrutinee with cast] +~~~~~~~~~~~~~~~~~~~~~~~~~~ +Consider this: + f = \ t -> case (v `cast` co) of + V a b -> a : f t + +Exactly the same optimistaion (unrolling one call to f) will work here, +despite the cast. See mk_alt_env in the Case branch of libCase. + To think about (Apr 94) ~~~~~~~~~~~~~~ @@ -238,10 +247,10 @@ libCase env (Let bind body) libCase env (Case scrut bndr ty alts) = Case (libCase env scrut) bndr ty (map (libCaseAlt env_alts) alts) where - env_alts = addBinders env_with_scrut [bndr] - env_with_scrut = case scrut of - Var scrut_var -> addScrutedVar env scrut_var - other -> env + env_alts = addBinders (mk_alt_env scrut) [bndr] + mk_alt_env (Var scrut_var) = addScrutedVar env scrut_var + mk_alt_env (Cast scrut _) = mk_alt_env scrut -- Note [Scrutinee with cast] + mk_alt_env otehr = env libCaseAlt env (con,args,rhs) = (con, args, libCase (addBinders env args) rhs) \end{code}