Eliminate zero_static_objects_list()
authorSimon Marlow <marlowsd@gmail.com>
Tue, 28 Jul 2015 19:58:25 +0000 (20:58 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 28 Jul 2015 19:58:35 +0000 (20:58 +0100)
commitf83aab95f59ae9b29f22fc7924e050512229cb9c
tree2f03ed82c7122f373da774148e3c806aa1dbcae8
parenta1dd7dd6ea276832aef0caaf805f0ab9f4e16262
Eliminate zero_static_objects_list()

Summary:
[Revised version of D1076 that was committed and then backed out]

In a workload with a large amount of code, zero_static_objects_list()
takes a significant amount of time, and furthermore it is in the
single-threaded part of the GC.

This patch uses a slightly fiddly scheme for marking objects on the
static object lists, using a flag in the low 2 bits that flips between
two states to indicate whether an object has been visited during this
GC or not.  We also have to take into account objects that have not
been visited yet, which might appear at any time due to runtime linking.

Test Plan: validate

Reviewers: austin, ezyang, rwbarton, bgamari, thomie

Reviewed By: bgamari, thomie

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1106
12 files changed:
compiler/codeGen/StgCmmHeap.hs
rts/CheckUnload.c
rts/RetainerProfile.c
rts/sm/Compact.c
rts/sm/Evac.c
rts/sm/GC.c
rts/sm/GCAux.c
rts/sm/GCThread.h
rts/sm/Sanity.c
rts/sm/Scav.c
rts/sm/Storage.c
rts/sm/Storage.h