Speed up Heap::isMarkedConcurrently
[WebKit-https.git] / Source / WTF / ChangeLog
1 2016-09-27  JF Bastien  <jfbastien@apple.com>
2
3         Speed up Heap::isMarkedConcurrently
4         https://bugs.webkit.org/show_bug.cgi?id=162095
5
6         Reviewed by Filip Pizlo.
7
8         Heap::isMarkedConcurrently had a load-load fence which is expensive on weak memory ISAs such as ARM.
9
10         This patch is fairly perf-neutral overall, but the GC's instrumentation reports:
11           GC:Eden is 93% average runtime after change
12           GC:Full is 76% average runtime after change
13
14         The fence was there because:
15          1. If the read of m_markingVersion in MarkedBlock::areMarksStale isn't what's expected then;
16          2. The read of m_marks in MarkedBlock::isMarked needs to observe the value that was stored *before* m_markingVersion was stored.
17
18         This ordering isn't guaranteed on ARM, which has a weak memory model.
19
20         There are 3 ways to guarantee this ordering:
21          A. Use a barrier instruction.
22          B. Use a load-acquire (new in ARMv8).
23          C. use ARM's address dependency rule, which C++ calls memory_order_consume.
24
25         In general:
26          A. is slow but orders all of memory in an intuitive manner.
27          B. is faster-ish and has the same property-ish.
28          C. should be faster still, but *only orders dependent loads*. This last part is critical! Consume isn't an all-out replacement for acquire (acquire is rather a superset of consume).
29
30         ARM explains the address dependency rule in their document "barrier litmus tests and cookbook":
31
32         > *Resolving by the use of barriers and address dependency*
33         >
34         > There is a rule within the ARM architecture that:
35         > Where the value returned by a read is used to compute the virtual address of a subsequent read or write (this is known as an address dependency), then these two memory accesses will be observed in program order. An address dependency exists even if the value read by the first read has no effect in changing the virtual address (as might be the case if the value returned is masked off before it is used, or if it had no effect on changing a predicted address value).
36         > This restriction applies only when the data value returned from one read is used as a data value to calculate the address of a subsequent read or write. This does not apply if the data value returned from one read is used to determine the condition code flags, and the values of the flags are used for condition code evaluation to determine the address of a subsequent reads, either through conditional execution or the evaluation of a branch. This is known as a control dependency.
37         > Where both a control and address dependency exist, the ordering behaviour is consistent with the address dependency.
38
39         C++'s memory_order_consume is unfortunately unimplemented by C++ compilers, and maybe unimplementable as spec'd. I'm working with interested folks in the committee to fix this situation: http://wg21.link/p0190r2
40
41         * wtf/Atomics.h:
42         (WTF::zeroWithConsumeDependency): a 0 which carries a dependency
43         (WTF::consumeLoad): pixie magic
44
45 2016-09-27  JF Bastien  <jfbastien@apple.com>
46
47         Atomics.h on Windows: remove seq_cst hack
48         https://bugs.webkit.org/show_bug.cgi?id=162022
49
50         Reviewed by Mark Lam.
51
52         No need to force access to seq_cst, always inlining fixes the MSVC warning.
53
54         * wtf/Atomics.h:
55         (WTF::Atomic::compareExchangeWeak): remove seq_cst hack
56         (WTF::Atomic::compareExchangeStrong): remove seq_cst hack
57         (WTF::Atomic::exchangeAndAdd): remove seq_cst hack
58         (WTF::Atomic::exchange): remove seq_cst hack
59
60 2016-09-27  Don Olmstead  <don.olmstead@am.sony.com>
61
62         [CMake] Use CMake to determine HAVE_* defines
63         https://bugs.webkit.org/show_bug.cgi?id=162368
64
65         Reviewed by Alex Christensen.
66
67         * wtf/Platform.h:
68
69 2016-09-20  Anders Carlsson  <andersca@apple.com>
70
71         PlatformEvent::m_modifiers should be an OptionSet
72         https://bugs.webkit.org/show_bug.cgi?id=162326
73
74         Reviewed by Daniel Bates.
75
76         * wtf/OptionSet.h:
77         (WTF::OptionSet::operator!=):
78         (WTF::OptionSet::operator-):
79
80 2016-09-27  Jer Noble  <jer.noble@apple.com>
81
82         Remove deprecated ENCRYPTED_MEDIA implementation.
83         https://bugs.webkit.org/show_bug.cgi?id=161010
84
85         Reviewed by Eric Carlson.
86
87         Remove ENABLE_ENCRYPTED_MEDIA.
88
89         * wtf/FeatureDefines.h:
90
91 2016-09-27  Youenn Fablet  <youenn@apple.com>
92
93         [Fetch API] Use Ref<const T> in FetchBody::m_data variant
94         https://bugs.webkit.org/show_bug.cgi?id=162599
95
96         Reviewed by Alex Christensen.
97
98         Enabling to use DeferrableRefCounted<const T> by making m_refCount mutable.
99
100         * wtf/DeferrableRefCounted.h:
101         (WTF::DeferrableRefCountedBase::ref):
102         (WTF::DeferrableRefCountedBase::derefBase):
103         (WTF::DeferrableRefCounted::deref):
104
105 2016-09-26  Daniel Bates  <dabates@apple.com>
106
107         Rename IOS_TEXT_AUTOSIZING to TEXT_AUTOSIZING
108         https://bugs.webkit.org/show_bug.cgi?id=162365
109
110         Reviewed by Simon Fraser.
111
112         * wtf/FeatureDefines.h:
113
114 2016-09-26  Benjamin Poulain  <benjamin@webkit.org>
115
116         [JSC] Shrink the Math inline caches some more
117         https://bugs.webkit.org/show_bug.cgi?id=162485
118
119         Reviewed by Saam Barati.
120
121         * wtf/Bag.h:
122         Don't copy the arguments before initializing the nodes.
123
124 2016-09-26  Michael Catanzaro  <mcatanzaro@igalia.com>
125
126         std::unique_ptr deleter functions should not check if pointer is null
127         https://bugs.webkit.org/show_bug.cgi?id=162558
128
129         Reviewed by Alex Christensen.
130
131         std::unique_ptr already does this before calling the deleter.
132
133         * wtf/efl/UniquePtrEfl.h:
134         * wtf/glib/GUniquePtr.h:
135
136 == Rolled over to ChangeLog-2016-09-26 ==