summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSebastian Graf <sebastian.graf@kit.edu>2019-02-21 16:02:38 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-02-23 22:02:10 -0500
commitb85068f6843eb0b16ff898e0dfa811fede8e1ca1 (patch)
tree4387e09cce7b0536822c55576dcc5958ddf2aabb /compiler
parent1059e234b04a041291cc422cad715011011724d1 (diff)
downloadhaskell-b85068f6843eb0b16ff898e0dfa811fede8e1ca1.tar.gz
Include closure header size in StgLamLift's estimations
While playing around with late lambda lifting, I realised that StgLamLift.Analysis doesn't consider the removed closure header in its allocation estimations. That's because contrary to what I thought, the total word count returned by `mkVirtHeapOffsets` doesn't include the size of the closure header. We just add the header size manually now.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/simplStg/StgLiftLams/Analysis.hs7
1 files changed, 3 insertions, 4 deletions
diff --git a/compiler/simplStg/StgLiftLams/Analysis.hs b/compiler/simplStg/StgLiftLams/Analysis.hs
index 7fb60df0b0..3cdbfcbb3f 100644
--- a/compiler/simplStg/StgLiftLams/Analysis.hs
+++ b/compiler/simplStg/StgLiftLams/Analysis.hs
@@ -484,13 +484,12 @@ rhsLambdaBndrs (StgRhsClosure _ _ _ bndrs _) = map binderInfoBndr bndrs
-- | The size in words of a function closure closing over the given 'Id's,
-- including the header.
closureSize :: DynFlags -> [Id] -> WordOff
-closureSize dflags ids = words
+closureSize dflags ids = words + sTD_HDR_SIZE dflags
+ -- We go through sTD_HDR_SIZE rather than fixedHdrSizeW so that we don't
+ -- optimise differently when profiling is enabled.
where
(words, _, _)
-- Functions have a StdHeader (as opposed to ThunkHeader).
- -- Note that mkVirtHeadOffsets will account for profiling headers, so
- -- lifting decisions vary if we begin to profile stuff. Maybe we shouldn't
- -- do this or deactivate profiling in @dflags@?
= StgCmmLayout.mkVirtHeapOffsets dflags StgCmmLayout.StdHeader
. StgCmmClosure.addIdReps
. StgCmmClosure.nonVoidIds