[commit: ghc] ghc-8.0: CorePrep: refactoring to reduce duplication (eeb2ba1)
git at git.haskell.org
git at git.haskell.org
Fri Mar 25 11:14:44 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : ghc-8.0
Link : http://ghc.haskell.org/trac/ghc/changeset/eeb2ba141445ce369ffc50f15b7bbb0fb18338f3/ghc
>---------------------------------------------------------------
commit eeb2ba141445ce369ffc50f15b7bbb0fb18338f3
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Fri Mar 25 09:25:34 2016 +0000
CorePrep: refactoring to reduce duplication
There's no functional change here, just tidying up
(cherry picked from commit 12372baae6ff10c671ef50f3d681cffdf60e36ee)
>---------------------------------------------------------------
eeb2ba141445ce369ffc50f15b7bbb0fb18338f3
compiler/coreSyn/CorePrep.hs | 49 +++++++++++++++++++-------------------------
1 file changed, 21 insertions(+), 28 deletions(-)
diff --git a/compiler/coreSyn/CorePrep.hs b/compiler/coreSyn/CorePrep.hs
index 7df3409..e550a67 100644
--- a/compiler/coreSyn/CorePrep.hs
+++ b/compiler/coreSyn/CorePrep.hs
@@ -440,8 +440,6 @@ cpePair top_lvl is_rec dmd is_unlifted env bndr rhs
; return (floats4, bndr', rhs4) }
where
- is_strict_or_unlifted = (isStrictDmd dmd) || is_unlifted
-
platform = targetPlatform (cpe_dynFlags env)
arity = idArity bndr -- We must match this arity
@@ -449,14 +447,14 @@ cpePair top_lvl is_rec dmd is_unlifted env bndr rhs
---------------------
float_from_rhs floats rhs
| isEmptyFloats floats = return (emptyFloats, rhs)
- | isTopLevel top_lvl = float_top floats rhs
- | otherwise = float_nested floats rhs
+ | isTopLevel top_lvl = float_top floats rhs
+ | otherwise = float_nested floats rhs
---------------------
float_nested floats rhs
- | wantFloatNested is_rec is_strict_or_unlifted floats rhs
+ | wantFloatNested is_rec dmd is_unlifted floats rhs
= return (floats, rhs)
- | otherwise = dont_float floats rhs
+ | otherwise = dontFloat floats rhs
---------------------
float_top floats rhs -- Urhgh! See Note [CafInfo and floating]
@@ -469,16 +467,17 @@ cpePair top_lvl is_rec dmd is_unlifted env bndr rhs
= return (floats', rhs')
| otherwise
- = dont_float floats rhs
-
- ---------------------
- dont_float floats rhs
- -- Non-empty floats, but do not want to float from rhs
- -- So wrap the rhs in the floats
- -- But: rhs1 might have lambdas, and we can't
- -- put them inside a wrapBinds
- = do { body <- rhsToBodyNF rhs
- ; return (emptyFloats, wrapBinds floats body) }
+ = dontFloat floats rhs
+
+dontFloat :: Floats -> CpeRhs -> UniqSM (Floats, CpeBody)
+-- Non-empty floats, but do not want to float from rhs
+-- So wrap the rhs in the floats
+-- But: rhs1 might have lambdas, and we can't
+-- put them inside a wrapBinds
+dontFloat floats1 rhs
+ = do { (floats2, body) <- rhsToBody rhs
+ ; return (emptyFloats, wrapBinds floats1 $
+ wrapBinds floats2 body) }
{- Note [Silly extra arguments]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -622,11 +621,6 @@ cpeBody env expr
; return (floats1 `appendFloats` floats2, body) }
--------
-rhsToBodyNF :: CpeRhs -> UniqSM CpeBody
-rhsToBodyNF rhs = do { (floats,body) <- rhsToBody rhs
- ; return (wrapBinds floats body) }
-
---------
rhsToBody :: CpeRhs -> UniqSM (Floats, CpeBody)
-- Remove top level lambdas by let-binding
@@ -767,8 +761,7 @@ cpeArg env dmd arg arg_ty
= do { (floats1, arg1) <- cpeRhsE env arg -- arg1 can be a lambda
; (floats2, arg2) <- if want_float floats1 arg1
then return (floats1, arg1)
- else do { body1 <- rhsToBodyNF arg1
- ; return (emptyFloats, wrapBinds floats1 body1) }
+ else dontFloat floats1 arg1
-- Else case: arg1 might have lambdas, and we can't
-- put them inside a wrapBinds
@@ -781,8 +774,7 @@ cpeArg env dmd arg arg_ty
; return (addFloat floats2 arg_float, varToCoreExpr v) } }
where
is_unlifted = isUnliftedType arg_ty
- is_strict = isStrictDmd dmd
- want_float = wantFloatNested NonRecursive (is_strict || is_unlifted)
+ want_float = wantFloatNested NonRecursive dmd is_unlifted
{-
Note [Floating unlifted arguments]
@@ -1155,10 +1147,11 @@ canFloatFromNoCaf platform (Floats ok_to_spec fs) rhs
(\i -> pprPanic "rhsIsStatic" (integer i))
-- Integer literals should not show up
-wantFloatNested :: RecFlag -> Bool -> Floats -> CpeRhs -> Bool
-wantFloatNested is_rec strict_or_unlifted floats rhs
+wantFloatNested :: RecFlag -> Demand -> Bool -> Floats -> CpeRhs -> Bool
+wantFloatNested is_rec dmd is_unlifted floats rhs
= isEmptyFloats floats
- || strict_or_unlifted
+ || isStrictDmd dmd
+ || is_unlifted
|| (allLazyNested is_rec floats && exprIsHNF rhs)
-- Why the test for allLazyNested?
-- v = f (x `divInt#` y)
More information about the ghc-commits
mailing list