summaryrefslogtreecommitdiff
path: root/compiler/GHC/Core/SimpleOpt.hs
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2020-06-11 15:45:53 +0100
committerBen Gamari <ben@smart-cactus.org>2020-07-11 12:18:08 -0400
commitf250606761b8120799a276eafc858bfb94743df9 (patch)
treeb1f1f527c6ca9fc8012402af45537f12befb208a /compiler/GHC/Core/SimpleOpt.hs
parentb9f0d5832afe2605c6b49be806f78223007f4f0a (diff)
downloadhaskell-wip/simon-perf.tar.gz
This patch addresses the exponential blow-up in the simplifier.wip/simon-perf
Specifically: #13253 exponential inlining #10421 ditto #18140 strict constructors #18282 another nested-function call case This patch makes two significant changes: 1. For Ids that are used at most once in each branch of a case, make the occurrence analyser record the total number of syntactic occurrences. Then in postInlineUnconditionally use that info to avoid inling something many many times. Actual changes: * See the occ_n_br field of OneOcc. * postInlineUnconditionally See Note [Suppress exponential blowup] in GHC.Core.Opt.Simplify.Utils 2. Change the way that mkDupableCont handles StrictArg. The details are explained in GHC.Core.Opt.Simplify Note [Duplicating StrictArg] Current nofib run Program Size Allocs Runtime Elapsed TotalMem -------------------------------------------------------------------------------- VS -0.3% +115.9% +12.1% +11.2% 0.0% boyer2 -0.3% +10.0% +3.5% +4.0% 0.0% cryptarithm2 -0.3% +39.0% +16.6% +16.1% 0.0% gamteb -0.3% +4.1% -0.0% +0.4% 0.0% last-piece -0.3% +1.4% -1.1% -0.4% 0.0% mate -0.4% -11.1% -8.5% -9.0% 0.0% multiplier -0.3% -2.2% -1.5% -1.5% 0.0% transform -0.3% +3.4% +0.5% +0.8% 0.0% -------------------------------------------------------------------------------- Min -0.8% -11.1% -8.5% -9.0% 0.0% Max -0.3% +115.9% +30.1% +26.4% 0.0% Geometric Mean -0.3% +1.0% +1.0% +1.0% -0.0% Should investigate these numbers. But the tickets are indeed cured, I think.
Diffstat (limited to 'compiler/GHC/Core/SimpleOpt.hs')
-rw-r--r--compiler/GHC/Core/SimpleOpt.hs2
1 files changed, 1 insertions, 1 deletions
diff --git a/compiler/GHC/Core/SimpleOpt.hs b/compiler/GHC/Core/SimpleOpt.hs
index 8525fb292f..3735cded34 100644
--- a/compiler/GHC/Core/SimpleOpt.hs
+++ b/compiler/GHC/Core/SimpleOpt.hs
@@ -433,7 +433,7 @@ simple_bind_pair env@(SOE { soe_inl = inl_env, soe_subst = subst })
safe_to_inline IAmALoopBreaker{} = False
safe_to_inline IAmDead = True
safe_to_inline OneOcc{ occ_in_lam = NotInsideLam
- , occ_one_br = InOneBranch } = True
+ , occ_n_br = 1 } = True
safe_to_inline OneOcc{} = False
safe_to_inline ManyOccs{} = False