import TcRnTypes
import MkIface
import Id
+import Pair
import Name
import CoreSyn
import CoreSubst
, undefined
, undefined
, undefined
+ , undefined
+ , undefined
))
_ -> do
(binds_cvr,ds_hpc_info, modBreaks)
; hetmet_pga_applyr <- if dopt Opt_F_coqpass dflags then dsLookupGlobalId hetmet_pga_applyr_name else return undefined
; hetmet_pga_curryl <- if dopt Opt_F_coqpass dflags then dsLookupGlobalId hetmet_pga_curryl_name else return undefined
; hetmet_pga_curryr <- if dopt Opt_F_coqpass dflags then dsLookupGlobalId hetmet_pga_curryr_name else return undefined
+ ; hetmet_pga_loopl <- if dopt Opt_F_coqpass dflags then dsLookupGlobalId hetmet_pga_loopl_name else return undefined
+ ; hetmet_pga_loopr <- if dopt Opt_F_coqpass dflags then dsLookupGlobalId hetmet_pga_loopr_name else return undefined
; let hpc_init
| opt_Hpc = hpcInitCode mod ds_hpc_info
| otherwise = empty
, hetmet_pga_applyr
, hetmet_pga_curryl
, hetmet_pga_curryr
+ , hetmet_pga_loopl
+ , hetmet_pga_loopr
) }
; case mb_res of {
Nothing -> return (msgs, Nothing) ;
- Just (ds_ev_binds, all_prs, all_rules, ds_vects, ds_fords,ds_hpc_info, modBreaks
+ Just (ds_ev_binds, all_prs, all_rules, vects0, ds_fords, ds_hpc_info, modBreaks
, hetmet_brak, hetmet_esc
, hetmet_flatten
, hetmet_unflatten
, hetmet_pga_applyl
, hetmet_pga_applyr
, hetmet_pga_curryl
- , hetmet_pga_curryr) -> do
+ , hetmet_pga_curryr
+ , hetmet_pga_loopl
+ , hetmet_pga_loopr
+ ) -> do
- { -- Add export flags to bindings
- keep_alive <- readIORef keep_var
- ; let (rules_for_locals, rules_for_imps)
+ { -- Add export flags to bindings
+ keep_alive <- readIORef keep_var
+ ; let (rules_for_locals, rules_for_imps)
= partition isLocalRule all_rules
final_prs = addExportFlagsAndRules target
- export_set keep_alive rules_for_locals (fromOL all_prs)
-
- final_pgm = simplifyBinds $ combineEvBinds ds_ev_binds final_prs
- -- 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!
- -- You might think it doesn't matter, but the simplifier brings all top-level
- -- things into the in-scope set before simplifying; so we get no unfolding for F#!
-
- -- Lint result if necessary, and print
- ; dumpIfSet_dyn dflags Opt_D_dump_ds "Desugared, before opt" $
- (vcat [ pprCoreBindings final_pgm
- , pprRules rules_for_imps ])
+ export_set keep_alive rules_for_locals (fromOL all_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!
+ -- You might think it doesn't matter, but the simplifier brings all top-level
+ -- things into the in-scope set before simplifying; so we get no unfolding for F#!
+
+ ; (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
hetmet_pga_applyl
hetmet_pga_applyr
hetmet_pga_curryl
- hetmet_pga_curryr)
+ hetmet_pga_curryr
+ hetmet_pga_loopl
+ hetmet_pga_loopr
+ )
}
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_coqpass "After Coq Pass" (text $ showSDoc $ pprCoreBindings ds_binds')
- ; dumpIfSet_dyn dflags Opt_D_dump_coqpass "After Coq Pass" (text $ showSDoc $ pprCoreBindings ds_binds')
+ ; (ds_binds, ds_rules_for_imps, ds_vects)
+ <- simpleOptPgm dflags final_pgm rules_for_imps vects0
+ -- The simpleOptPgm gets rid of type
+ -- bindings plus any stupid dead code
- ; endPass dflags CoreDesugar ds_binds' ds_rules_for_imps
+ ; endPass dflags CoreDesugar ds_binds ds_rules_for_imps
; let used_names = mkUsedNames tcg_env
- ; deps <- mkDependencies tcg_env
+ ; deps <- mkDependencies tcg_env
; let mod_guts = ModGuts {
mg_module = mod,
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 #-}
\begin{code}
dsVect :: LVectDecl Id -> DsM CoreVect
-dsVect (L loc (HsVect v rhs))
+dsVect (L loc (HsVect (L _ v) rhs))
= putSrcSpanDs loc $
do { rhs' <- fmapMaybeM dsLExpr rhs
- ; return $ Vect (unLoc v) rhs'
+ ; return $ Vect v rhs'
}
--- dsVect (L loc (HsVect v Nothing))
--- = return $ Vect v Nothing
--- dsVect (L loc (HsVect v (Just rhs)))
--- = putSrcSpanDs loc $
--- do { rhs' <- dsLExpr rhs
--- ; return $ Vect v (Just rhs')
--- }
+dsVect (L _loc (HsNoVect (L _ v)))
+ = return $ NoVect v
\end{code}
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)]
else (NonRec b (simplify e)):(simplifyBind $ Rec rbs')
simplifyBinds = concatMap simplifyBind
-\end{code}
\ No newline at end of file
+\end{code}