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;