diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2020-07-27 11:14:45 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-30 07:13:27 -0400 |
commit | 9f71f69714255165d0fdc2790a588487ff9439dc (patch) | |
tree | a168538c15c33103667a7d8c13524df801a9c0dc | |
parent | ebe2cf4538fa46994ef67663ac8fd5e579579803 (diff) | |
download | haskell-9f71f69714255165d0fdc2790a588487ff9439dc.tar.gz |
Add two bangs to improve perf of flattening
This tiny patch improves the compile time of flatten-heavy
programs by 1-2%, by adding two bangs.
Addresses (somewhat) #18502
This reduces allocation by
T9872b -1.1%
T9872d -3.3%
T5321Fun -0.2%
T5631 -0.2%
T5837 +0.1%
T6048 +0.1%
Metric Decrease:
T9872b
T9872d
-rw-r--r-- | compiler/GHC/Core/Coercion.hs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/compiler/GHC/Core/Coercion.hs b/compiler/GHC/Core/Coercion.hs index 3937c0ce3e..a408373eea 100644 --- a/compiler/GHC/Core/Coercion.hs +++ b/compiler/GHC/Core/Coercion.hs @@ -1891,7 +1891,9 @@ substForAllCoBndrUsingLC sym sco (LC subst lc_env) tv co -- -- For the inverse operation, see 'liftCoMatch' ty_co_subst :: LiftingContext -> Role -> Type -> Coercion -ty_co_subst lc role ty +ty_co_subst !lc role ty + -- !lc: making this function strict in lc allows callers to + -- pass its two components separately, rather than boxing them = go role ty where go :: Role -> Type -> Coercion @@ -2864,9 +2866,9 @@ simplifyArgsWorker orig_ki_binders orig_inner_ki orig_fvs -- need a coercion (kind_co :: old_kind ~ new_kind). -- -- The bangs here have been observed to improve performance - -- significantly in optimized builds. - let kind_co = mkSymCo $ - liftCoSubst Nominal lc (tyCoBinderType binder) + -- significantly in optimized builds; see #18502 + let !kind_co = mkSymCo $ + liftCoSubst Nominal lc (tyCoBinderType binder) !casted_xi = xi `mkCastTy` kind_co casted_co = mkCoherenceLeftCo role xi kind_co co |