summaryrefslogtreecommitdiff
path: root/compiler/GHC/Rename/Names.hs
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2021-07-21 09:32:37 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-07-23 21:09:17 -0400
commitb26a7065cec7ade894b8318aae66610e345b7e78 (patch)
tree2f6e67937a457a7a0c39a837a81a2c4e43d2e476 /compiler/GHC/Rename/Names.hs
parent6c79981e646a9983e959ccbf67f6c11b86bdbc6f (diff)
downloadhaskell-b26a7065cec7ade894b8318aae66610e345b7e78.tar.gz
Fix a few retainer leaks of TcGblEnv
Methodology: Create a -hi profile and then search for TcGblEnv then use ghc-debug to work out why they are being retained and remove the reason. Retaining TcGblEnv is dangerous because it contains pointers to things such as a TypeEnv which is updated throughout compilation. I found two places which were retaining a TcGblEnv unecessarily. Also fix a few places where an OccName was retaining an Id.
Diffstat (limited to 'compiler/GHC/Rename/Names.hs')
-rw-r--r--compiler/GHC/Rename/Names.hs5
1 files changed, 4 insertions, 1 deletions
diff --git a/compiler/GHC/Rename/Names.hs b/compiler/GHC/Rename/Names.hs
index a79048272b..a66430d7ba 100644
--- a/compiler/GHC/Rename/Names.hs
+++ b/compiler/GHC/Rename/Names.hs
@@ -860,9 +860,12 @@ getLocalNonValBinders fixity_env
; traceRn "getLocalNonValBinders 2" (ppr avails)
; (tcg_env, tcl_env) <- extendGlobalRdrEnvRn avails fixity_env
+ -- Force the field access so that tcg_env is not retained. The
+ -- selector thunk optimisation doesn't kick-in, see #20139
+ ; let !old_field_env = tcg_field_env tcg_env
-- Extend tcg_field_env with new fields (this used to be the
-- work of extendRecordFieldEnv)
- ; let field_env = extendNameEnvList (tcg_field_env tcg_env) flds
+ field_env = extendNameEnvList old_field_env flds
envs = (tcg_env { tcg_field_env = field_env }, tcl_env)
; traceRn "getLocalNonValBinders 3" (vcat [ppr flds, ppr field_env])