summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorArnaud Spiwack <arnaud@spiwack.net>2017-09-19 16:57:25 -0400
committerBen Gamari <ben@smart-cactus.org>2017-09-19 16:57:34 -0400
commit3198956d371d1c16668b8131d1317b822f6c5cfe (patch)
tree1d903eb972b483570e0988609007cb5fb14e6f43 /compiler
parentbbb8cb92b66d83bb7d472e7905c84c28cbb0997c (diff)
downloadhaskell-3198956d371d1c16668b8131d1317b822f6c5cfe.tar.gz
Factor mkCoreApp and mkCoreApps
`mkCoreApps` re-implemented `mkCoreApp` in a recursive function, rather than using a simple `foldl'` in order to avoid repeatingly computing the type of the function argument. I've factored the two logic into a new (internal) function `mkCoreType` which assumes that the type is known. `mkCoreApp` and `mkCoreApps` are thin wrappers around it. Differences - The assertion failure message of `mkCoreApps` has more information in it. - `mkCoreApps` now special-cases coercion argument like `mkCoreApp` (previously they were given to `mk_val_app` instead) Reviewers: austin, bgamari Reviewed By: bgamari Subscribers: rwbarton, thomie Differential Revision: https://phabricator.haskell.org/D3971
Diffstat (limited to 'compiler')
-rw-r--r--compiler/coreSyn/MkCore.hs45
1 files changed, 27 insertions, 18 deletions
diff --git a/compiler/coreSyn/MkCore.hs b/compiler/coreSyn/MkCore.hs
index 2ea0c89a07..a3aea31278 100644
--- a/compiler/coreSyn/MkCore.hs
+++ b/compiler/coreSyn/MkCore.hs
@@ -120,34 +120,43 @@ mkCoreLets :: [CoreBind] -> CoreExpr -> CoreExpr
mkCoreLets binds body = foldr mkCoreLet body binds
-- | Construct an expression which represents the application of one expression
+-- paired with its type to an argument. The result is paired with its type. This
+-- function is not exported and used in the definition of 'mkCoreApp' and
+-- 'mkCoreApps'.
+-- Respects the let/app invariant by building a case expression where necessary
+-- See CoreSyn Note [CoreSyn let/app invariant]
+mkCoreAppTyped :: SDoc -> (CoreExpr, Type) -> CoreExpr -> (CoreExpr, Type)
+mkCoreAppTyped _ (fun, fun_ty) (Type ty)
+ = (App fun (Type ty), piResultTy fun_ty ty)
+mkCoreAppTyped _ (fun, fun_ty) (Coercion co)
+ = (App fun (Coercion co), res_ty)
+ where
+ (_, res_ty) = splitFunTy fun_ty
+mkCoreAppTyped d (fun, fun_ty) arg
+ = ASSERT2( isFunTy fun_ty, ppr fun $$ ppr arg $$ d )
+ (mk_val_app fun arg arg_ty res_ty, res_ty)
+ where
+ (arg_ty, res_ty) = splitFunTy fun_ty
+
+-- | Construct an expression which represents the application of one expression
-- to the other
-mkCoreApp :: SDoc -> CoreExpr -> CoreExpr -> CoreExpr
-- Respects the let/app invariant by building a case expression where necessary
-- See CoreSyn Note [CoreSyn let/app invariant]
-mkCoreApp _ fun (Type ty) = App fun (Type ty)
-mkCoreApp _ fun (Coercion co) = App fun (Coercion co)
-mkCoreApp d fun arg = ASSERT2( isFunTy fun_ty, ppr fun $$ ppr arg $$ d )
- mk_val_app fun arg arg_ty res_ty
- where
- fun_ty = exprType fun
- (arg_ty, res_ty) = splitFunTy fun_ty
+mkCoreApp :: SDoc -> CoreExpr -> CoreExpr -> CoreExpr
+mkCoreApp s fun arg
+ = fst $ mkCoreAppTyped s (fun, exprType fun) arg
-- | Construct an expression which represents the application of a number of
-- expressions to another. The leftmost expression in the list is applied first
-- Respects the let/app invariant by building a case expression where necessary
-- See CoreSyn Note [CoreSyn let/app invariant]
mkCoreApps :: CoreExpr -> [CoreExpr] -> CoreExpr
--- Slightly more efficient version of (foldl mkCoreApp)
-mkCoreApps orig_fun orig_args
- = go orig_fun (exprType orig_fun) orig_args
+mkCoreApps fun args
+ = fst $
+ foldl' (mkCoreAppTyped doc_string) (fun, fun_ty) args
where
- go fun _ [] = fun
- go fun fun_ty (Type ty : args) = go (App fun (Type ty)) (piResultTy fun_ty ty) args
- go fun fun_ty (arg : args) = ASSERT2( isFunTy fun_ty, ppr fun_ty $$ ppr orig_fun
- $$ ppr orig_args )
- go (mk_val_app fun arg arg_ty res_ty) res_ty args
- where
- (arg_ty, res_ty) = splitFunTy fun_ty
+ doc_string = ppr fun_ty $$ ppr fun $$ ppr args
+ fun_ty = exprType fun
-- | Construct an expression which represents the application of a number of
-- expressions to that of a data constructor expression. The leftmost expression