summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Graf <sebastian.graf@kit.edu>2019-02-21 16:02:38 +0100
committerSebastian Graf <sebastian.graf@kit.edu>2019-02-21 16:02:38 +0100
commit07bba23dccc51c9d7f286005495f596ce1554471 (patch)
tree3b8c8e39f375ef5b1b2d7b19c5d3dea808bef826
parente204431e5a5e2fd16da52b04bda2798f16c51344 (diff)
downloadhaskell-wip/std-hdr-llf.tar.gz
Include closure header size in StgLamLift's estimationswip/std-hdr-llf
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.
-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