diff options
Diffstat (limited to 'Source/JavaScriptCore/jit')
-rw-r--r-- | Source/JavaScriptCore/jit/JIT.cpp | 7 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JIT.h | 2 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITCall32_64.cpp | 4 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITOpcodes.cpp | 7 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITOpcodes32_64.cpp | 2 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITStubs.cpp | 86 | ||||
-rw-r--r-- | Source/JavaScriptCore/jit/JITStubs.h | 3 |
7 files changed, 20 insertions, 91 deletions
diff --git a/Source/JavaScriptCore/jit/JIT.cpp b/Source/JavaScriptCore/jit/JIT.cpp index 2aca35146..e1e034b19 100644 --- a/Source/JavaScriptCore/jit/JIT.cpp +++ b/Source/JavaScriptCore/jit/JIT.cpp @@ -100,9 +100,10 @@ void JIT::emitOptimizationCheck(OptimizationCheckKind kind) return; Jump skipOptimize = branchAdd32(Signed, TrustedImm32(kind == LoopOptimizationCheck ? Options::executionCounterIncrementForLoop : Options::executionCounterIncrementForReturn), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter())); - JITStubCall stubCall(this, kind == LoopOptimizationCheck ? cti_optimize_from_loop : cti_optimize_from_ret); - if (kind == LoopOptimizationCheck) - stubCall.addArgument(TrustedImm32(m_bytecodeOffset)); + JITStubCall stubCall(this, cti_optimize); + stubCall.addArgument(TrustedImm32(m_bytecodeOffset)); + if (kind == EnterOptimizationCheck) + ASSERT(!m_bytecodeOffset); stubCall.call(); skipOptimize.link(this); } diff --git a/Source/JavaScriptCore/jit/JIT.h b/Source/JavaScriptCore/jit/JIT.h index 6491edbed..6d4c578c0 100644 --- a/Source/JavaScriptCore/jit/JIT.h +++ b/Source/JavaScriptCore/jit/JIT.h @@ -806,7 +806,7 @@ namespace JSC { // Loads the character value of a single character string into dst. void emitLoadCharacterString(RegisterID src, RegisterID dst, JumpList& failures); - enum OptimizationCheckKind { LoopOptimizationCheck, RetOptimizationCheck }; + enum OptimizationCheckKind { LoopOptimizationCheck, EnterOptimizationCheck }; #if ENABLE(DFG_JIT) void emitOptimizationCheck(OptimizationCheckKind); #else diff --git a/Source/JavaScriptCore/jit/JITCall32_64.cpp b/Source/JavaScriptCore/jit/JITCall32_64.cpp index 81266052b..7d86e615f 100644 --- a/Source/JavaScriptCore/jit/JITCall32_64.cpp +++ b/Source/JavaScriptCore/jit/JITCall32_64.cpp @@ -56,8 +56,6 @@ void JIT::emit_op_call_put_result(Instruction* instruction) void JIT::emit_op_ret(Instruction* currentInstruction) { - emitOptimizationCheck(RetOptimizationCheck); - unsigned dst = currentInstruction[1].u.operand; emitLoad(dst, regT1, regT0); @@ -70,8 +68,6 @@ void JIT::emit_op_ret(Instruction* currentInstruction) void JIT::emit_op_ret_object_or_this(Instruction* currentInstruction) { - emitOptimizationCheck(RetOptimizationCheck); - unsigned result = currentInstruction[1].u.operand; unsigned thisReg = currentInstruction[2].u.operand; diff --git a/Source/JavaScriptCore/jit/JITOpcodes.cpp b/Source/JavaScriptCore/jit/JITOpcodes.cpp index ad7a56e12..2e448dd52 100644 --- a/Source/JavaScriptCore/jit/JITOpcodes.cpp +++ b/Source/JavaScriptCore/jit/JITOpcodes.cpp @@ -576,8 +576,6 @@ void JIT::emit_op_tear_off_arguments(Instruction* currentInstruction) void JIT::emit_op_ret(Instruction* currentInstruction) { - emitOptimizationCheck(RetOptimizationCheck); - ASSERT(callFrameRegister != regT1); ASSERT(regT1 != returnValueRegister); ASSERT(returnValueRegister != callFrameRegister); @@ -598,8 +596,6 @@ void JIT::emit_op_ret(Instruction* currentInstruction) void JIT::emit_op_ret_object_or_this(Instruction* currentInstruction) { - emitOptimizationCheck(RetOptimizationCheck); - ASSERT(callFrameRegister != regT1); ASSERT(regT1 != returnValueRegister); ASSERT(returnValueRegister != callFrameRegister); @@ -1218,13 +1214,14 @@ void JIT::emit_op_neq_null(Instruction* currentInstruction) void JIT::emit_op_enter(Instruction*) { + emitOptimizationCheck(EnterOptimizationCheck); + // Even though CTI doesn't use them, we initialize our constant // registers to zap stale pointers, to avoid unnecessarily prolonging // object lifetime and increasing GC pressure. size_t count = m_codeBlock->m_numVars; for (size_t j = 0; j < count; ++j) emitInitRegister(j); - } void JIT::emit_op_create_activation(Instruction* currentInstruction) diff --git a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp b/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp index 57ef7ef2f..4f8589557 100644 --- a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp +++ b/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp @@ -1487,6 +1487,8 @@ void JIT::emit_op_debug(Instruction* currentInstruction) void JIT::emit_op_enter(Instruction*) { + emitOptimizationCheck(EnterOptimizationCheck); + // Even though JIT code doesn't use them, we initialize our constant // registers to zap stale pointers, to avoid unnecessarily prolonging // object lifetime and increasing GC pressure. diff --git a/Source/JavaScriptCore/jit/JITStubs.cpp b/Source/JavaScriptCore/jit/JITStubs.cpp index 12f3ec344..b0ff4a0c7 100644 --- a/Source/JavaScriptCore/jit/JITStubs.cpp +++ b/Source/JavaScriptCore/jit/JITStubs.cpp @@ -1919,17 +1919,16 @@ DEFINE_STUB_FUNCTION(void, op_check_has_instance) } #if ENABLE(DFG_JIT) -DEFINE_STUB_FUNCTION(void, optimize_from_loop) +DEFINE_STUB_FUNCTION(void, optimize) { STUB_INIT_STACK_FRAME(stackFrame); CallFrame* callFrame = stackFrame.callFrame; CodeBlock* codeBlock = callFrame->codeBlock(); - unsigned bytecodeIndex = stackFrame.args[0].int32(); - + #if ENABLE(JIT_VERBOSE_OSR) - dataLog("%p: Entered optimize_from_loop with executeCounter = %d, reoptimizationRetryCounter = %u, optimizationDelayCounter = %u\n", codeBlock, codeBlock->jitExecuteCounter(), codeBlock->reoptimizationRetryCounter(), codeBlock->optimizationDelayCounter()); + dataLog("%p: Entered optimize with bytecodeIndex = %u, executeCounter = %d, reoptimizationRetryCounter = %u, optimizationDelayCounter = %u\n", codeBlock, bytecodeIndex, codeBlock->jitExecuteCounter(), codeBlock->reoptimizationRetryCounter(), codeBlock->optimizationDelayCounter()); #endif if (!codeBlock->checkIfOptimizationThresholdReached()) @@ -1937,7 +1936,7 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) if (codeBlock->hasOptimizedReplacement()) { #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Considering loop OSR into %p(%p) with success/fail %u/%u.\n", codeBlock, codeBlock->replacement(), codeBlock->replacement()->speculativeSuccessCounter(), codeBlock->replacement()->speculativeFailCounter()); + dataLog("Considering OSR into %p(%p) with success/fail %u/%u.\n", codeBlock, codeBlock->replacement(), codeBlock->replacement()->speculativeSuccessCounter(), codeBlock->replacement()->speculativeFailCounter()); #endif if (codeBlock->replacement()->shouldReoptimizeFromLoopNow()) { #if ENABLE(JIT_VERBOSE_OSR) @@ -1959,14 +1958,14 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) JSObject* error = codeBlock->compileOptimized(callFrame, scopeChain); #if ENABLE(JIT_VERBOSE_OSR) if (error) - dataLog("WARNING: optimized compilation from loop failed.\n"); + dataLog("WARNING: optimized compilation failed.\n"); #else UNUSED_PARAM(error); #endif if (codeBlock->replacement() == codeBlock) { #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Optimizing %p from loop failed.\n", codeBlock); + dataLog("Optimizing %p failed.\n", codeBlock); #endif ASSERT(codeBlock->getJITType() == JITCode::BaselineJIT); @@ -1980,7 +1979,7 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) if (void* address = DFG::prepareOSREntry(callFrame, optimizedCodeBlock, bytecodeIndex)) { #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Optimizing %p from loop succeeded, performing OSR after a delay of %u.\n", codeBlock, codeBlock->optimizationDelayCounter()); + dataLog("Optimizing %p succeeded, performing OSR after a delay of %u.\n", codeBlock, codeBlock->optimizationDelayCounter()); #endif codeBlock->optimizeSoon(); @@ -1990,7 +1989,7 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) } #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Optimizing %p from loop succeeded, OSR failed, after a delay of %u.\n", codeBlock, codeBlock->optimizationDelayCounter()); + dataLog("Optimizing %p succeeded, OSR failed, after a delay of %u.\n", codeBlock, codeBlock->optimizationDelayCounter()); #endif // Count the OSR failure as a speculation failure. If this happens a lot, then @@ -1998,7 +1997,7 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) optimizedCodeBlock->countSpeculationFailure(); #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Encountered loop OSR failure into %p(%p) with success/fail %u/%u.\n", codeBlock, codeBlock->replacement(), codeBlock->replacement()->speculativeSuccessCounter(), codeBlock->replacement()->speculativeFailCounter()); + dataLog("Encountered OSR failure into %p(%p) with success/fail %u/%u.\n", codeBlock, codeBlock->replacement(), codeBlock->replacement()->speculativeSuccessCounter(), codeBlock->replacement()->speculativeFailCounter()); #endif // We are a lot more conservative about triggering reoptimization after OSR failure than @@ -2011,7 +2010,7 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) // reoptimization trigger. if (optimizedCodeBlock->shouldReoptimizeNow()) { #if ENABLE(JIT_VERBOSE_OSR) - dataLog("Triggering reoptimization of %p(%p) (in loop after OSR fail).\n", codeBlock, codeBlock->replacement()); + dataLog("Triggering reoptimization of %p(%p) (after OSR fail).\n", codeBlock, codeBlock->replacement()); #endif codeBlock->reoptimize(); return; @@ -2021,71 +2020,6 @@ DEFINE_STUB_FUNCTION(void, optimize_from_loop) // longer and then try again. codeBlock->optimizeAfterWarmUp(); } - -DEFINE_STUB_FUNCTION(void, optimize_from_ret) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - CallFrame* callFrame = stackFrame.callFrame; - CodeBlock* codeBlock = callFrame->codeBlock(); - -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Entered optimize_from_ret with executeCounter = %d, reoptimizationRetryCounter = %u, optimizationDelayCounter = %u\n", codeBlock->jitExecuteCounter(), codeBlock->reoptimizationRetryCounter(), codeBlock->optimizationDelayCounter()); -#endif - - if (!codeBlock->checkIfOptimizationThresholdReached()) - return; - - if (codeBlock->hasOptimizedReplacement()) { -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Returning from old JIT call frame with optimized replacement %p(%p), with success/fail %u/%u", codeBlock, codeBlock->replacement(), codeBlock->replacement()->speculativeSuccessCounter(), codeBlock->replacement()->speculativeFailCounter()); - CallFrame* callerFrame = callFrame->callerFrame(); - if (callerFrame) - dataLog(", callerFrame = %p, returnPC = %p, caller code block = %p", callerFrame, callFrame->returnPC().value(), callerFrame->codeBlock()); - dataLog("\n"); -#endif - if (codeBlock->replacement()->shouldReoptimizeNow()) { -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Triggering reoptimization of %p(%p) (in return).\n", codeBlock, codeBlock->replacement()); -#endif - codeBlock->reoptimize(); - } - - codeBlock->optimizeSoon(); - return; - } - - if (!codeBlock->shouldOptimizeNow()) { -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Delaying optimization for %p (in return) because of insufficient profiling.\n", codeBlock); -#endif - return; - } - - ScopeChainNode* scopeChain = callFrame->scopeChain(); - - JSObject* error = codeBlock->compileOptimized(callFrame, scopeChain); - if (error) - dataLog("WARNING: optimized compilation from ret failed.\n"); - - if (codeBlock->replacement() == codeBlock) { -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Optimizing %p from return failed.\n", codeBlock); -#endif - - ASSERT(codeBlock->getJITType() == JITCode::BaselineJIT); - codeBlock->dontOptimizeAnytimeSoon(); - return; - } - - ASSERT(codeBlock->replacement()->getJITType() == JITCode::DFGJIT); - -#if ENABLE(JIT_VERBOSE_OSR) - dataLog("Optimizing %p from return succeeded after a delay of %u.\n", codeBlock, codeBlock->optimizationDelayCounter()); -#endif - - codeBlock->optimizeSoon(); -} #endif // ENABLE(DFG_JIT) DEFINE_STUB_FUNCTION(EncodedJSValue, op_instanceof) diff --git a/Source/JavaScriptCore/jit/JITStubs.h b/Source/JavaScriptCore/jit/JITStubs.h index 251776075..d2bc15e64 100644 --- a/Source/JavaScriptCore/jit/JITStubs.h +++ b/Source/JavaScriptCore/jit/JITStubs.h @@ -450,8 +450,7 @@ extern "C" { void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION) WTF_INTERNAL; void JIT_STUB cti_op_throw_reference_error(STUB_ARGS_DECLARATION) WTF_INTERNAL; #if ENABLE(DFG_JIT) - void JIT_STUB cti_optimize_from_loop(STUB_ARGS_DECLARATION) WTF_INTERNAL; - void JIT_STUB cti_optimize_from_ret(STUB_ARGS_DECLARATION) WTF_INTERNAL; + void JIT_STUB cti_optimize(STUB_ARGS_DECLARATION) WTF_INTERNAL; #endif void* JIT_STUB cti_op_call_arityCheck(STUB_ARGS_DECLARATION) WTF_INTERNAL; void* JIT_STUB cti_op_construct_arityCheck(STUB_ARGS_DECLARATION) WTF_INTERNAL; |