2 * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef LazyOperandValueProfile_h
27 #define LazyOperandValueProfile_h
29 #include "ConcurrentJITLock.h"
30 #include "ValueProfile.h"
31 #include "VirtualRegister.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/Noncopyable.h>
34 #include <wtf/OwnPtr.h>
35 #include <wtf/SegmentedVector.h>
39 class ScriptExecutable
;
41 class LazyOperandValueProfileKey
{
43 LazyOperandValueProfileKey()
44 : m_bytecodeOffset(0) // 0 = empty value
45 , m_operand(VirtualRegister()) // not a valid operand index in our current scheme
49 LazyOperandValueProfileKey(WTF::HashTableDeletedValueType
)
50 : m_bytecodeOffset(1) // 1 = deleted value
51 , m_operand(VirtualRegister()) // not a valid operand index in our current scheme
55 LazyOperandValueProfileKey(unsigned bytecodeOffset
, VirtualRegister operand
)
56 : m_bytecodeOffset(bytecodeOffset
)
59 ASSERT(m_operand
.isValid());
62 bool operator!() const
64 return !m_operand
.isValid();
67 bool operator==(const LazyOperandValueProfileKey
& other
) const
69 return m_bytecodeOffset
== other
.m_bytecodeOffset
70 && m_operand
== other
.m_operand
;
75 return WTF::intHash(m_bytecodeOffset
) + m_operand
.offset();
78 unsigned bytecodeOffset() const
81 return m_bytecodeOffset
;
84 VirtualRegister
operand() const
90 bool isHashTableDeletedValue() const
92 return !m_operand
.isValid() && m_bytecodeOffset
;
95 unsigned m_bytecodeOffset
;
96 VirtualRegister m_operand
;
99 struct LazyOperandValueProfileKeyHash
{
100 static unsigned hash(const LazyOperandValueProfileKey
& key
) { return key
.hash(); }
102 const LazyOperandValueProfileKey
& a
,
103 const LazyOperandValueProfileKey
& b
) { return a
== b
; }
104 static const bool safeToCompareToEmptyOrDeleted
= true;
111 template<typename T
> struct DefaultHash
;
112 template<> struct DefaultHash
<JSC::LazyOperandValueProfileKey
> {
113 typedef JSC::LazyOperandValueProfileKeyHash Hash
;
116 template<typename T
> struct HashTraits
;
117 template<> struct HashTraits
<JSC::LazyOperandValueProfileKey
> : public GenericHashTraits
<JSC::LazyOperandValueProfileKey
> {
118 static void constructDeletedValue(JSC::LazyOperandValueProfileKey
& slot
) { new (NotNull
, &slot
) JSC::LazyOperandValueProfileKey(HashTableDeletedValue
); }
119 static bool isDeletedValue(const JSC::LazyOperandValueProfileKey
& value
) { return value
.isHashTableDeletedValue(); }
126 struct LazyOperandValueProfile
: public MinimalValueProfile
{
127 LazyOperandValueProfile()
128 : MinimalValueProfile()
129 , m_operand(VirtualRegister())
133 explicit LazyOperandValueProfile(const LazyOperandValueProfileKey
& key
)
134 : MinimalValueProfile(key
.bytecodeOffset())
135 , m_operand(key
.operand())
139 LazyOperandValueProfileKey
key() const
141 return LazyOperandValueProfileKey(m_bytecodeOffset
, m_operand
);
144 VirtualRegister m_operand
;
146 typedef SegmentedVector
<LazyOperandValueProfile
, 8> List
;
149 class LazyOperandValueProfileParser
;
151 class CompressedLazyOperandValueProfileHolder
{
152 WTF_MAKE_NONCOPYABLE(CompressedLazyOperandValueProfileHolder
);
154 CompressedLazyOperandValueProfileHolder();
155 ~CompressedLazyOperandValueProfileHolder();
157 void computeUpdatedPredictions(const ConcurrentJITLocker
&);
159 LazyOperandValueProfile
* add(
160 const ConcurrentJITLocker
&, const LazyOperandValueProfileKey
& key
);
163 friend class LazyOperandValueProfileParser
;
164 OwnPtr
<LazyOperandValueProfile::List
> m_data
;
167 class LazyOperandValueProfileParser
{
168 WTF_MAKE_NONCOPYABLE(LazyOperandValueProfileParser
);
170 explicit LazyOperandValueProfileParser();
171 ~LazyOperandValueProfileParser();
174 const ConcurrentJITLocker
&, CompressedLazyOperandValueProfileHolder
& holder
);
176 LazyOperandValueProfile
* getIfPresent(
177 const LazyOperandValueProfileKey
& key
) const;
179 SpeculatedType
prediction(
180 const ConcurrentJITLocker
&, const LazyOperandValueProfileKey
& key
) const;
182 HashMap
<LazyOperandValueProfileKey
, LazyOperandValueProfile
*> m_map
;
187 #endif // LazyOperandValueProfile_h