desugar: do not bother simplifying if we are doing simpleopt-before-flatten
[ghc-hetmet.git] / compiler / deSugar / Desugar.lhs
index 374c13b..c8f6390 100644 (file)
@@ -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}