Value profling and execution count profiling is performed even for
code that cannot be optimized
https://bugs.webkit.org/show_bug.cgi?id=67694
Reviewed by Gavin Barraclough.
This is a 2% speed-up on V8 when tiered compilation is enabled.
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
(JSC::ProgramCodeBlock::canCompileWithDFG):
(JSC::EvalCodeBlock::canCompileWithDFG):
(JSC::FunctionCodeBlock::canCompileWithDFG):
* bytecode/CodeBlock.h:
* dfg/DFGCapabilities.cpp: Added.
(JSC::DFG::canCompileOpcodes):
* dfg/DFGCapabilities.h: Added.
(JSC::DFG::mightCompileEval):
(JSC::DFG::mightCompileProgram):
(JSC::DFG::mightCompileFunctionForCall):
(JSC::DFG::mightCompileFunctionForConstruct):
(JSC::DFG::canCompileOpcode):
(JSC::DFG::canCompileEval):
(JSC::DFG::canCompileProgram):
(JSC::DFG::canCompileFunctionForCall):
(JSC::DFG::canCompileFunctionForConstruct):
* jit/JIT.cpp:
(JSC::JIT::emitOptimizationCheck):
(JSC::JIT::privateCompile):
* jit/JIT.h:
(JSC::JIT::shouldEmitProfiling):
* jit/JITInlineMethods.h:
(JSC::JIT::emitValueProfilingSite):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@94802 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/jit/JIT.cpp b/Source/JavaScriptCore/jit/JIT.cpp
index 236e84c..df76476 100644
--- a/Source/JavaScriptCore/jit/JIT.cpp
+++ b/Source/JavaScriptCore/jit/JIT.cpp
@@ -36,6 +36,7 @@
#include "CodeBlock.h"
#include "CryptographicallyRandomNumber.h"
+#include "DFGNode.h" // for DFG_SUCCESS_STATS
#include "Interpreter.h"
#include "JITInlineMethods.h"
#include "JITStubCall.h"
@@ -45,7 +46,6 @@
#include "RepatchBuffer.h"
#include "ResultType.h"
#include "SamplingTool.h"
-#include "dfg/DFGNode.h" // for DFG_SUCCESS_STATS
using namespace std;
@@ -96,6 +96,9 @@
#if ENABLE(TIERED_COMPILATION)
void JIT::emitOptimizationCheck(OptimizationCheckKind kind)
{
+ if (!shouldEmitProfiling())
+ return;
+
Jump skipOptimize = branchAdd32(Signed, TrustedImm32(kind == LoopOptimizationCheck ? 1 : 30), AbsoluteAddress(&m_codeBlock->m_executeCounter));
JITStubCall stubCall(this, kind == LoopOptimizationCheck ? cti_optimize_from_loop : cti_optimize_from_ret);
stubCall.call();
@@ -497,6 +500,10 @@
JITCode JIT::privateCompile(CodePtr* functionEntryArityCheck)
{
+#if ENABLE(TIERED_COMPILATION)
+ m_canBeOptimized = m_codeBlock->canCompileWithDFG();
+#endif
+
// Just add a little bit of randomness to the codegen
if (m_randomGenerator.getUint32() & 1)
nop();
diff --git a/Source/JavaScriptCore/jit/JIT.h b/Source/JavaScriptCore/jit/JIT.h
index 65db92a..efd335e 100644
--- a/Source/JavaScriptCore/jit/JIT.h
+++ b/Source/JavaScriptCore/jit/JIT.h
@@ -1004,6 +1004,14 @@
void sampleCodeBlock(CodeBlock*) {}
#endif
+#if ENABLE(TIERED_COMPILATION)
+ bool shouldEmitProfiling() { return m_canBeOptimized; }
+#else
+ // Enables use of value profiler with tiered compilation turned off,
+ // in which case all code gets profiled.
+ bool shouldEmitProfiling() { return true; }
+#endif
+
Interpreter* m_interpreter;
JSGlobalData* m_globalData;
CodeBlock* m_codeBlock;
@@ -1043,6 +1051,10 @@
#endif
WeakRandom m_randomGenerator;
static CodePtr stringGetByValStubGenerator(JSGlobalData* globalData, ExecutablePool* pool);
+
+#if ENABLE(TIERED_COMPILATION)
+ bool m_canBeOptimized;
+#endif
} JIT_CLASS_ALIGNMENT;
inline void JIT::emit_op_loop(Instruction* currentInstruction)
diff --git a/Source/JavaScriptCore/jit/JITInlineMethods.h b/Source/JavaScriptCore/jit/JITInlineMethods.h
index 8fe1c7a..965d984 100644
--- a/Source/JavaScriptCore/jit/JITInlineMethods.h
+++ b/Source/JavaScriptCore/jit/JITInlineMethods.h
@@ -435,6 +435,9 @@
#if ENABLE(VALUE_PROFILER)
inline void JIT::emitValueProfilingSite(ValueProfilingSiteKind siteKind)
{
+ if (!shouldEmitProfiling())
+ return;
+
const RegisterID value = regT0;
const RegisterID scratch = regT3;