diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2021-04-16 15:11:43 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2021-11-23 20:59:53 -0500 |
commit | b71da5fe871f0236b4033c7cac523fe776a56b29 (patch) | |
tree | 1c07bb1bcbd639c402bf0e910292e55683441eda /compiler/GHC/Core.hs | |
parent | 9dcb2ad15df54e209cfae3dd1f51cf8e8d6c69d5 (diff) | |
download | haskell-wip/T3781.tar.gz |
Make UnfoldingGuidance account for free variableswip/T3781
For over a decade (#3781) I've wondered whether GHC's
UnfoldingGuidance should take account of free variables. For example:
f x = let g y = case x of ....
in
...(case x of ....g e....)...
If we inline the call to g in the body of the case x, we can save
re-evaluating (and case analysis of) x. This very similar to the
"discounts" we give for arguments. All we need is to do it for
free variables.
It turned out to be rather easy.
* Beef up GHC.Core.Unfold.sizeExpr to accumulate discounts for
free variables.
* Beef up GHC.Core.Unfold.callSiteInline to compute those
discounts, based on info in the InScopeSet
Fixes #3781
Also fixes #19643 (which reminded me of this issue)
Diffstat (limited to 'compiler/GHC/Core.hs')
-rw-r--r-- | compiler/GHC/Core.hs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/compiler/GHC/Core.hs b/compiler/GHC/Core.hs index 2e41f9932b..41c1e138e2 100644 --- a/compiler/GHC/Core.hs +++ b/compiler/GHC/Core.hs @@ -95,7 +95,7 @@ module GHC.Core ( import GHC.Prelude import GHC.Platform -import GHC.Types.Var.Env( InScopeSet ) +import GHC.Types.Var.Env( InScopeSet, IdEnv ) import GHC.Types.Var import GHC.Core.Type import GHC.Core.Coercion @@ -1304,6 +1304,7 @@ data UnfoldingGuidance ug_args :: [Int], -- Discount if the argument is evaluated. -- (i.e., a simplification will definitely -- be possible). One elt of the list per *value* arg. + ug_fvs :: IdEnv Int, -- Discount for free variables ug_size :: Int, -- The "size" of the unfolding. |