[Git][ghc/ghc][wip/andreask/opt-calcUnfolding] Optimize calcUnfoldingGuidance to avoid eagerly evaluating expression size.
Andreas Klebinger (@AndreasK)
gitlab at gitlab.haskell.org
Sat Aug 13 13:10:12 UTC 2022
Andreas Klebinger pushed to branch wip/andreask/opt-calcUnfolding at Glasgow Haskell Compiler / GHC
Commits:
7e004b05 by Andreas Klebinger at 2022-08-13T15:08:38+02:00
Optimize calcUnfoldingGuidance to avoid eagerly evaluating expression size.
There is also no point in calcUnfoldingGuidance handling Ticks since it's
handlined inside sizeExpr already. So I removed that as well.
- - - - -
1 changed file:
- compiler/GHC/Core/Unfold.hs
Changes:
=====================================
compiler/GHC/Core/Unfold.hs
=====================================
@@ -57,7 +57,6 @@ import GHC.Utils.Misc
import GHC.Utils.Outputable
import GHC.Types.ForeignCall
import GHC.Types.Name
-import GHC.Types.Tickish
import qualified Data.ByteString as BS
import Data.List (isPrefixOf)
@@ -231,44 +230,42 @@ calcUnfoldingGuidance
-> Bool -- Definitely a top-level, bottoming binding
-> CoreExpr -- Expression to look at
-> UnfoldingGuidance
-calcUnfoldingGuidance opts is_top_bottoming (Tick t expr)
- | not (tickishIsCode t) -- non-code ticks don't matter for unfolding
- = calcUnfoldingGuidance opts is_top_bottoming expr
-calcUnfoldingGuidance opts is_top_bottoming expr
- = case sizeExpr opts bOMB_OUT_SIZE val_bndrs body of
- TooBig -> UnfNever
- SizeIs size cased_bndrs scrut_discount
- | uncondInline expr n_val_bndrs size
- -> UnfWhen { ug_unsat_ok = unSaturatedOk
- , ug_boring_ok = boringCxtOk
- , ug_arity = n_val_bndrs } -- Note [INLINE for small functions]
-
- | is_top_bottoming
- -> UnfNever -- See Note [Do not inline top-level bottoming functions]
-
- | otherwise
- -> UnfIfGoodArgs { ug_args = map (mk_discount cased_bndrs) val_bndrs
- , ug_size = size
- , ug_res = scrut_discount }
-
+calcUnfoldingGuidance !opts is_top_bottoming !expr
+ -- See Note [Do not inline top-level bottoming functions]
+ | is_top_bottoming = UnfNever
+ | otherwise = calc opts expr
where
+ calc opts expr
+ = case sizeExpr opts bOMB_OUT_SIZE val_bndrs body of
+ TooBig -> UnfNever
+ SizeIs size cased_bndrs scrut_discount
+ | uncondInline expr n_val_bndrs size
+ -> UnfWhen { ug_unsat_ok = unSaturatedOk
+ , ug_boring_ok = boringCxtOk
+ , ug_arity = n_val_bndrs } -- Note [INLINE for small functions]
+
+ | otherwise
+ -> UnfIfGoodArgs { ug_args = map (mk_discount cased_bndrs) val_bndrs
+ , ug_size = size
+ , ug_res = scrut_discount }
+
(bndrs, body) = collectBinders expr
bOMB_OUT_SIZE = unfoldingCreationThreshold opts
- -- Bomb out if size gets bigger than this
+ -- Bomb out if size gets bigger than this
val_bndrs = filter isId bndrs
n_val_bndrs = length val_bndrs
mk_discount :: Bag (Id,Int) -> Id -> Int
mk_discount cbs bndr = foldl' combine 0 cbs
- where
- combine acc (bndr', disc)
- | bndr == bndr' = acc `plus_disc` disc
- | otherwise = acc
-
- plus_disc :: Int -> Int -> Int
- plus_disc | isFunTy (idType bndr) = max
- | otherwise = (+)
- -- See Note [Function and non-function discounts]
+ where
+ combine acc (bndr', disc)
+ | bndr == bndr' = acc `plus_disc` disc
+ | otherwise = acc
+
+ plus_disc :: Int -> Int -> Int
+ plus_disc | isFunTy (idType bndr) = max
+ | otherwise = (+)
+ -- See Note [Function and non-function discounts]
{- Note [Inline unsafeCoerce]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/7e004b05598d68d32de047235cee6a0150c03e46
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/7e004b05598d68d32de047235cee6a0150c03e46
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20220813/7330bce5/attachment-0001.html>
More information about the ghc-commits
mailing list