[project @ 2006-01-17 16:13:18 by simonmar]
authorsimonmar <unknown>
Tue, 17 Jan 2006 16:13:18 +0000 (16:13 +0000)
committersimonmar <unknown>
Tue, 17 Jan 2006 16:13:18 +0000 (16:13 +0000)
commit91b07216be1cb09230b7d1b417899ddea8620ff3
tree03ef770091e4483ad049112ccf81cb12ed9844b4
parentda69fa9c5047c5b0d05bdb05eaddefa1eb5d5a36
[project @ 2006-01-17 16:13:18 by simonmar]
Improve the GC behaviour of IORefs (see Ticket #650).

This is a small change to the way IORefs interact with the GC, which
should improve GC performance for programs with plenty of IORefs.

Previously we had a single closure type for mutable variables,
MUT_VAR.  Mutable variables were *always* on the mutable list in older
generations, and always traversed on every GC.

Now, we have two closure types: MUT_VAR_CLEAN and MUT_VAR_DIRTY.  The
latter is on the mutable list, but the former is not.  (NB. this
differs from MUT_ARR_PTRS_CLEAN and MUT_ARR_PTRS_DIRTY, both of which
are on the mutable list).  writeMutVar# now implements a write
barrier, by calling dirty_MUT_VAR() in the runtime, that does the
necessary modification of MUT_VAR_CLEAN into MUT_VAR_DIRY, and adding
to the mutable list if necessary.

This results in some pretty dramatic speedups for GHC itself.  I've
just measureed a 30% overall speedup compiling a 31-module program
(anna) with the default heap settings :-D
17 files changed:
ghc/compiler/cmm/CLabel.hs
ghc/compiler/codeGen/CgPrimOp.hs
ghc/includes/ClosureTypes.h
ghc/includes/RtsExternal.h
ghc/includes/StgMiscClosures.h
ghc/includes/Storage.h
ghc/rts/ClosureFlags.c
ghc/rts/GC.c
ghc/rts/GCCompact.c
ghc/rts/LdvProfile.c
ghc/rts/PrimOps.cmm
ghc/rts/Printer.c
ghc/rts/ProfHeap.c
ghc/rts/RetainerProfile.c
ghc/rts/Sanity.c
ghc/rts/StgMiscClosures.cmm
ghc/rts/Storage.c