Changeset 96463 in webkit


Ignore:
Timestamp:
Oct 1, 2011 3:03:22 PM (13 years ago)
Author:
fpizlo@apple.com
Message:

All of JSC's heuristics should be in one place for easier tuning
https://bugs.webkit.org/show_bug.cgi?id=69201

Reviewed by Oliver Hunt.

This makes it possible to change tiered compilation heuristics in
one place (Heuristics.cpp) without recompiling the whole project.

It also makes it possible to enable setting heuristics using
environment variables. This is off by default. When turned on, it
makes tuning the system much easier.

(JSC::CodeBlock::shouldOptimizeNow):

  • bytecode/CodeBlock.h:
  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::exitSpeculativeWithOSR):

  • jit/JIT.cpp:

(JSC::JIT::emitOptimizationCheck):

  • runtime/Heuristics.cpp: Added.

(JSC::Heuristics::parse):
(JSC::Heuristics::setHeuristic):
(JSC::Heuristics::initializeHeuristics):

  • runtime/Heuristics.h: Added.
  • runtime/InitializeThreading.cpp:

(JSC::initializeThreadingOnce):

Location:
trunk/Source/JavaScriptCore
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r95751 r96463  
    115115    runtime/GCActivityCallback.cpp
    116116    runtime/GetterSetter.cpp
     117    runtime/Heuristics.cpp
    117118    runtime/Identifier.cpp
    118119    runtime/InitializeThreading.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r96461 r96463  
     12011-09-30  Filip Pizlo  <fpizlo@apple.com>
     2
     3        All of JSC's heuristics should be in one place for easier tuning
     4        https://bugs.webkit.org/show_bug.cgi?id=69201
     5
     6        Reviewed by Oliver Hunt.
     7       
     8        This makes it possible to change tiered compilation heuristics in
     9        one place (Heuristics.cpp) without recompiling the whole project.
     10       
     11        It also makes it possible to enable setting heuristics using
     12        environment variables. This is off by default. When turned on, it
     13        makes tuning the system much easier.
     14
     15        * CMakeLists.txt:
     16        * GNUmakefile.list.am:
     17        * JavaScriptCore.pro:
     18        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
     19        * JavaScriptCore.xcodeproj/project.pbxproj:
     20        * bytecode/CodeBlock.cpp:
     21        (JSC::CodeBlock::shouldOptimizeNow):
     22        * bytecode/CodeBlock.h:
     23        * dfg/DFGJITCompiler.cpp:
     24        (JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
     25        * jit/JIT.cpp:
     26        (JSC::JIT::emitOptimizationCheck):
     27        * runtime/Heuristics.cpp: Added.
     28        (JSC::Heuristics::parse):
     29        (JSC::Heuristics::setHeuristic):
     30        (JSC::Heuristics::initializeHeuristics):
     31        * runtime/Heuristics.h: Added.
     32        * runtime/InitializeThreading.cpp:
     33        (JSC::initializeThreadingOnce):
     34
    1352011-10-01  Oliver Hunt  <oliver@apple.com>
    236
  • trunk/Source/JavaScriptCore/GNUmakefile.list.am

    r95895 r96463  
    330330        Source/JavaScriptCore/runtime/GetterSetter.cpp \
    331331        Source/JavaScriptCore/runtime/GetterSetter.h \
     332        Source/JavaScriptCore/runtime/Heuristics.cpp \
     333        Source/JavaScriptCore/runtime/Heuristics.h \
    332334        Source/JavaScriptCore/runtime/Identifier.cpp \
    333335        Source/JavaScriptCore/runtime/Identifier.h \
  • trunk/Source/JavaScriptCore/JavaScriptCore.pro

    r95751 r96463  
    145145    runtime/GCActivityCallback.cpp \
    146146    runtime/GetterSetter.cpp \
     147    runtime/Heuristics.cpp \
    147148    runtime/Identifier.cpp \
    148149    runtime/InitializeThreading.cpp \
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj

    r96375 r96463  
    735735                        </File>
    736736                        <File
     737                                RelativePath="..\..\runtime\Heuristics.cpp"
     738                                >
     739                        </File>
     740                        <File
     741                                RelativePath="..\..\runtime\Heuristics.h"
     742                                >
     743                        </File>
     744                        <File
    737745                                RelativePath="..\..\runtime\Identifier.cpp"
    738746                                >
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r96461 r96463  
    8282                0FD82F2C1426CA7400179C94 /* JettisonedCodeBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD82F281426CA5A00179C94 /* JettisonedCodeBlocks.cpp */; };
    8383                0FD82F4B142806A100179C94 /* BitVector.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD82F491428069200179C94 /* BitVector.h */; settings = {ATTRIBUTES = (Private, ); }; };
     84                0FE228ED1436AB2700196C48 /* Heuristics.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE228EB1436AB2300196C48 /* Heuristics.h */; settings = {ATTRIBUTES = (Private, ); }; };
     85                0FE228EE1436AB2C00196C48 /* Heuristics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FE228EA1436AB2300196C48 /* Heuristics.cpp */; };
    8486                1400067712A6F7830064D123 /* OSAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1400067612A6F7830064D123 /* OSAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
    8587                1400069312A6F9E10064D123 /* OSAllocatorPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1400069212A6F9E10064D123 /* OSAllocatorPosix.cpp */; };
     
    837839                0FD82F291426CA5A00179C94 /* JettisonedCodeBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JettisonedCodeBlocks.h; sourceTree = "<group>"; };
    838840                0FD82F491428069200179C94 /* BitVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitVector.h; sourceTree = "<group>"; };
     841                0FE228EA1436AB2300196C48 /* Heuristics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Heuristics.cpp; sourceTree = "<group>"; };
     842                0FE228EB1436AB2300196C48 /* Heuristics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Heuristics.h; sourceTree = "<group>"; };
    839843                1400067612A6F7830064D123 /* OSAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSAllocator.h; sourceTree = "<group>"; };
    840844                1400069212A6F9E10064D123 /* OSAllocatorPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OSAllocatorPosix.cpp; sourceTree = "<group>"; };
     
    20302034                        isa = PBXGroup;
    20312035                        children = (
     2036                                0FE228EA1436AB2300196C48 /* Heuristics.cpp */,
     2037                                0FE228EB1436AB2300196C48 /* Heuristics.h */,
    20322038                                0F7700911402FF280078EB39 /* SamplingCounter.cpp */,
    20332039                                0F77008E1402FDD60078EB39 /* SamplingCounter.h */,
     
    28572863                                0FD52AAE143035A00026DC9F /* UnionFind.h in Headers */,
    28582864                                86880F1E14328BB900B08D42 /* DFGJITCompilerInlineMethods.h in Headers */,
     2865                                0FE228ED1436AB2700196C48 /* Heuristics.h in Headers */,
    28592866                        );
    28602867                        runOnlyForDeploymentPostprocessing = 0;
     
    33873394                                86880F44143531A800B08D42 /* DFGJITCodeGenerator64.cpp in Sources */,
    33883395                                86880F4D14353B2100B08D42 /* DFGSpeculativeJIT64.cpp in Sources */,
     3396                                0FE228EE1436AB2C00196C48 /* Heuristics.cpp in Sources */,
    33893397                        );
    33903398                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp

    r95930 r96463  
    19731973#endif
    19741974
    1975     if (m_optimizationDelayCounter >= 5)
     1975    if (m_optimizationDelayCounter >= Heuristics::maximumOptimizationDelay)
    19761976        return true;
    19771977   
     
    19991999#endif
    20002000
    2001     if ((!numberOfNonArgumentValueProfiles || (double)numberOfLiveNonArgumentValueProfiles / numberOfNonArgumentValueProfiles >= 0.75)
    2002         && (!numberOfValueProfiles() || (double)numberOfSamplesInProfiles / ValueProfile::numberOfBuckets / numberOfValueProfiles() >= 0.25))
     2001    if ((!numberOfNonArgumentValueProfiles || (double)numberOfLiveNonArgumentValueProfiles / numberOfNonArgumentValueProfiles >= Heuristics::desiredProfileLivenessRate)
     2002        && (!numberOfValueProfiles() || (double)numberOfSamplesInProfiles / ValueProfile::numberOfBuckets / numberOfValueProfiles() >= Heuristics::desiredProfileFullnessRate))
    20032003        return true;
    20042004   
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.h

    r96375 r96463  
    3434#include "DFGOSREntry.h"
    3535#include "EvalCodeCache.h"
     36#include "Heuristics.h"
    3637#include "Instruction.h"
    3738#include "JITCode.h"
     
    719720        unsigned reoptimizationRetryCounter() const
    720721        {
    721             ASSERT(m_reoptimizationRetryCounter <= 18);
     722            ASSERT(m_reoptimizationRetryCounter <= Heuristics::reoptimizationRetryCounterMax);
    722723            return m_reoptimizationRetryCounter;
    723724        }
     
    726727        {
    727728            m_reoptimizationRetryCounter++;
    728             if (m_reoptimizationRetryCounter > 18)
    729                 m_reoptimizationRetryCounter = 18;
    730         }
    731        
    732         // These functions are provided to support calling
    733         // optimizeXYZ() methods from JIT-generated code.
    734         static int32_t counterValueForOptimizeNextInvocation()
    735         {
    736             return 0;
     729            if (m_reoptimizationRetryCounter > Heuristics::reoptimizationRetryCounterMax)
     730                m_reoptimizationRetryCounter = Heuristics::reoptimizationRetryCounterMax;
    737731        }
    738732       
    739733        int32_t counterValueForOptimizeAfterWarmUp()
    740734        {
    741             return -1000 << reoptimizationRetryCounter();
     735            return Heuristics::executionCounterValueForOptimizeAfterWarmUp << reoptimizationRetryCounter();
    742736        }
    743737       
    744738        int32_t counterValueForOptimizeAfterLongWarmUp()
    745739        {
    746             return -5000 << reoptimizationRetryCounter();
     740            return Heuristics::executionCounterValueForOptimizeAfterLongWarmUp << reoptimizationRetryCounter();
    747741        }
    748742       
     
    763757        void optimizeNextInvocation()
    764758        {
    765             m_executeCounter = counterValueForOptimizeNextInvocation();
     759            m_executeCounter = Heuristics::executionCounterValueForOptimizeNextInvocation;
    766760        }
    767761       
     
    773767        void dontOptimizeAnytimeSoon()
    774768        {
    775             m_executeCounter = std::numeric_limits<int32_t>::min();
     769            m_executeCounter = Heuristics::executionCounterValueForDontOptimizeAnytimeSoon;
    776770        }
    777771       
     
    814808        void optimizeSoon()
    815809        {
    816             m_executeCounter = -100 << reoptimizationRetryCounter();
     810            m_executeCounter = Heuristics::executionCounterValueForOptimizeSoon << reoptimizationRetryCounter();
    817811        }
    818812       
     
    846840        static ptrdiff_t offsetOfSpeculativeFailCounter() { return OBJECT_OFFSETOF(CodeBlock, m_speculativeFailCounter); }
    847841       
    848         // The amount by which the JIT will increment m_executeCounter.
    849         static unsigned executeCounterIncrementForLoop() { return 1; }
    850         static unsigned executeCounterIncrementForReturn() { return 15; }
    851 
    852         // The success/failure ratio we want.
    853         unsigned desiredSuccessFailRatio() { return 6; }
    854        
    855842        // The number of failures that triggers the use of the ratio.
    856         unsigned largeFailCountThreshold() { return 20 << alternative()->reoptimizationRetryCounter(); }
    857         unsigned largeFailCountThresholdForLoop() { return 1 << alternative()->reoptimizationRetryCounter(); }
     843        unsigned largeFailCountThreshold() { return Heuristics::largeFailCountThresholdBase << alternative()->reoptimizationRetryCounter(); }
     844        unsigned largeFailCountThresholdForLoop() { return Heuristics::largeFailCountThresholdBaseForLoop << alternative()->reoptimizationRetryCounter(); }
    858845       
    859846        bool shouldReoptimizeNow()
    860847        {
    861             return desiredSuccessFailRatio() * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThreshold();
     848            return Heuristics::desiredSpeculativeSuccessFailRatio * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThreshold();
    862849        }
    863850       
    864851        bool shouldReoptimizeFromLoopNow()
    865852        {
    866             return desiredSuccessFailRatio() * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThresholdForLoop();
     853            return Heuristics::desiredSpeculativeSuccessFailRatio * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThresholdForLoop();
    867854        }
    868855       
  • trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp

    r96375 r96463  
    452452   
    453453    Jump fewFails = branch32(BelowOrEqual, GPRInfo::regT2, Imm32(codeBlock()->largeFailCountThreshold()));
    454     mul32(Imm32(codeBlock()->desiredSuccessFailRatio()), GPRInfo::regT2, GPRInfo::regT2);
     454    mul32(Imm32(Heuristics::desiredSpeculativeSuccessFailRatio), GPRInfo::regT2, GPRInfo::regT2);
    455455   
    456456    Jump lowFailRate = branch32(BelowOrEqual, GPRInfo::regT2, GPRInfo::regT1);
    457457   
    458458    // Reoptimize as soon as possible.
    459     store32(Imm32(CodeBlock::counterValueForOptimizeNextInvocation()), Address(GPRInfo::regT0, CodeBlock::offsetOfExecuteCounter()));
     459    store32(Imm32(Heuristics::executionCounterValueForOptimizeNextInvocation), Address(GPRInfo::regT0, CodeBlock::offsetOfExecuteCounter()));
    460460    Jump doneAdjusting = jump();
    461461   
  • trunk/Source/JavaScriptCore/jit/JIT.cpp

    r95930 r96463  
    100100        return;
    101101   
    102     Jump skipOptimize = branchAdd32(Signed, TrustedImm32(kind == LoopOptimizationCheck ? CodeBlock::executeCounterIncrementForLoop() : CodeBlock::executeCounterIncrementForReturn()), AbsoluteAddress(m_codeBlock->addressOfExecuteCounter()));
     102    Jump skipOptimize = branchAdd32(Signed, TrustedImm32(kind == LoopOptimizationCheck ? Heuristics::executionCounterIncrementForLoop : Heuristics::executionCounterIncrementForReturn), AbsoluteAddress(m_codeBlock->addressOfExecuteCounter()));
    103103    JITStubCall stubCall(this, kind == LoopOptimizationCheck ? cti_optimize_from_loop : cti_optimize_from_ret);
    104104    if (kind == LoopOptimizationCheck)
  • trunk/Source/JavaScriptCore/runtime/InitializeThreading.cpp

    r95510 r96463  
    3232#include "ExecutableAllocator.h"
    3333#include "Heap.h"
     34#include "Heuristics.h"
    3435#include "Identifier.h"
    3536#include "JSGlobalObject.h"
     
    5354    WTF::double_conversion::initialize();
    5455    WTF::initializeThreading();
     56    Heuristics::initializeHeuristics();
    5557#if ENABLE(WRITE_BARRIER_PROFILING)
    5658    WriteBarrierCounters::initialize();
Note: See TracChangeset for help on using the changeset viewer.