X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FdeSugar%2FDesugar.lhs;h=c8f6390a6e1b064a6f34d3a244879accdccd1462;hp=374c13b6260cb952872408cf0f9a0834a2ca0699;hb=7f2ce5cf1828ea3889ec8b67ecfb53b8431ad376;hpb=095c02ee7fbadae65d65a78f558147365190c636 diff --git a/compiler/deSugar/Desugar.lhs b/compiler/deSugar/Desugar.lhs index 374c13b..c8f6390 100644 --- a/compiler/deSugar/Desugar.lhs +++ b/compiler/deSugar/Desugar.lhs @@ -15,6 +15,7 @@ import HsSyn import TcRnTypes import MkIface import Id +import Pair import Name import CoreSyn import CoreSubst @@ -234,7 +235,10 @@ deSugar hsc_env final_prs = addExportFlagsAndRules target export_set keep_alive rules_for_locals (fromOL all_prs) - final_pgm = simplifyBinds $ combineEvBinds ds_ev_binds final_prs + final_pgm = let comb = combineEvBinds ds_ev_binds final_prs + in if dopt Opt_F_simpleopt_before_flatten dflags + then comb + else simplifyBinds comb -- Notice that we put the whole lot in a big Rec, even the foreign binds -- When compiling PrelFloat, which defines data Float = F# Float# -- we want F# to be in scope in the foreign marshalling code! @@ -246,16 +250,24 @@ deSugar hsc_env (vcat [ pprCoreBindings final_pgm , pprRules rules_for_imps ]) + ; (final_pgm', rules_for_imps') <- if dopt Opt_F_simpleopt_before_flatten dflags + then simpleOptPgm dflags final_pgm rules_for_imps + else return (final_pgm, rules_for_imps) + ; ds_binds <- if dopt Opt_F_coqpass dflags then do { us <- mkSplitUniqSupply '~' + ; let do_flatten = dopt Opt_F_flatten dflags + ; let do_skolemize = dopt Opt_F_skolemize dflags ; return (coqPassCoreToCore + do_flatten + do_skolemize hetmet_brak hetmet_esc hetmet_flatten hetmet_unflatten hetmet_flattened_id us - final_pgm + final_pgm' hetmet_PGArrow hetmet_PGArrow_unit hetmet_PGArrow_tensor @@ -280,13 +292,15 @@ deSugar hsc_env } else return final_pgm - ; (ds_binds', ds_rules_for_imps) <- simpleOptPgm dflags ds_binds rules_for_imps + ; (ds_binds', ds_rules_for_imps) <- if dopt Opt_F_simpleopt_before_flatten dflags + then return (ds_binds, rules_for_imps') + else simpleOptPgm dflags ds_binds rules_for_imps' -- The simpleOptPgm gets rid of type -- bindings plus any stupid dead code - ; dumpIfSet_dyn dflags Opt_D_coqpass "Coq Pass Output" $ text $ coqPassCoreToString ds_binds' + ; dumpIfSet_dyn dflags Opt_D_dump_proofs "Coq Pass Output" $ text $ coqPassCoreToString ds_binds' - ; dumpIfSet_dyn dflags Opt_D_dump_coqpass "After Coq Pass" (text $ showSDoc $ pprCoreBindings ds_binds') + ; dumpIfSet_dyn dflags Opt_D_coqpass "After Coq Pass" (text $ showSDoc $ pprCoreBindings ds_binds') ; endPass dflags CoreDesugar ds_binds' ds_rules_for_imps @@ -525,6 +539,8 @@ switching off EnableRewriteRules. See DsExpr.dsExplicitList. That keeps the desugaring of list comprehensions simple too. + + Nor do we want to warn of conversion identities on the LHS; the rule is precisly to optimise them: {-# RULES "fromRational/id" fromRational = id :: Rational -> Rational #-} @@ -565,13 +581,14 @@ simplify (Var v) = Var v simplify (App e1 e2) = App (simplify e1) (simplify e2) simplify (Lit lit) = Lit lit simplify (Note note e) = Note note (simplify e) -simplify (Cast e co) = if tcEqType (fst $ coercionKind co) (snd $ coercionKind co) +simplify (Cast e co) = if eqType (fst $ unPair $ coercionKind co) (snd $ unPair $ coercionKind co) then simplify e else Cast (simplify e) co simplify (Lam v e) = Lam v (simplify e) -simplify (Type t) = Type t simplify (Case e b ty as) = Case (simplify e) b ty (map (\(a,b,e) -> (a,b,simplify e)) as) simplify (Let bind body) = foldr Let (simplify body) (simplifyBind bind) +simplify (Type t) = Type t +simplify (Coercion co) = Coercion co simplifyBind :: Bind CoreBndr -> [Bind CoreBndr] simplifyBind (NonRec b e) = [NonRec b (simplify e)] @@ -582,4 +599,4 @@ simplifyBind (Rec (rbs@((b,e):rbs'))) = else (NonRec b (simplify e)):(simplifyBind $ Rec rbs') simplifyBinds = concatMap simplifyBind -\end{code} \ No newline at end of file +\end{code}