2 * Copyright (C) 2011 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.
27 #include "DFGOSRExit.h"
31 #include "DFGAssemblyHelpers.h"
32 #include "DFGSpeculativeJIT.h"
34 namespace JSC
{ namespace DFG
{
36 static unsigned computeNumVariablesForCodeOrigin(
37 CodeBlock
* codeBlock
, const CodeOrigin
& codeOrigin
)
39 if (!codeOrigin
.inlineCallFrame
)
40 return codeBlock
->m_numCalleeRegisters
;
42 codeOrigin
.inlineCallFrame
->stackOffset
+
43 baselineCodeBlockForInlineCallFrame(codeOrigin
.inlineCallFrame
)->m_numCalleeRegisters
;
46 OSRExit::OSRExit(ExitKind kind
, JSValueSource jsValueSource
, MethodOfGettingAValueProfile valueProfile
, MacroAssembler::Jump check
, SpeculativeJIT
* jit
, unsigned recoveryIndex
)
47 : m_jsValueSource(jsValueSource
)
48 , m_valueProfile(valueProfile
)
50 , m_nodeIndex(jit
->m_compileIndex
)
51 , m_codeOrigin(jit
->m_codeOriginForOSR
)
52 , m_codeOriginForExitProfile(m_codeOrigin
)
53 , m_recoveryIndex(recoveryIndex
)
56 , m_arguments(jit
->m_arguments
.size())
57 , m_variables(computeNumVariablesForCodeOrigin(jit
->m_jit
.graph().m_profiledBlock
, jit
->m_codeOriginForOSR
))
58 , m_lastSetOperand(jit
->m_lastSetOperand
)
60 ASSERT(m_codeOrigin
.isSet());
61 for (unsigned argument
= 0; argument
< m_arguments
.size(); ++argument
)
62 m_arguments
[argument
] = jit
->computeValueRecoveryFor(jit
->m_arguments
[argument
]);
63 for (unsigned variable
= 0; variable
< m_variables
.size(); ++variable
)
64 m_variables
[variable
] = jit
->computeValueRecoveryFor(jit
->m_variables
[variable
]);
67 void OSRExit::dump(FILE* out
) const
69 for (unsigned argument
= 0; argument
< m_arguments
.size(); ++argument
)
70 m_arguments
[argument
].dump(out
);
72 for (unsigned variable
= 0; variable
< m_variables
.size(); ++variable
)
73 m_variables
[variable
].dump(out
);
76 bool OSRExit::considerAddingAsFrequentExitSiteSlow(CodeBlock
* dfgCodeBlock
, CodeBlock
* profiledCodeBlock
)
78 if (static_cast<double>(m_count
) / dfgCodeBlock
->speculativeFailCounter() <= Options::osrExitProminenceForFrequentExitSite
)
81 return baselineCodeBlockForOriginAndBaselineCodeBlock(m_codeOriginForExitProfile
, profiledCodeBlock
)->addFrequentExitSite(FrequentExitSite(m_codeOriginForExitProfile
.bytecodeIndex
, m_kind
));
84 } } // namespace JSC::DFG
86 #endif // ENABLE(DFG_JIT)