Changeset 96463 in webkit
- Timestamp:
- Oct 1, 2011 3:03:22 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r95751 r96463 115 115 runtime/GCActivityCallback.cpp 116 116 runtime/GetterSetter.cpp 117 runtime/Heuristics.cpp 117 118 runtime/Identifier.cpp 118 119 runtime/InitializeThreading.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r96461 r96463 1 2011-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 1 35 2011-10-01 Oliver Hunt <oliver@apple.com> 2 36 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r95895 r96463 330 330 Source/JavaScriptCore/runtime/GetterSetter.cpp \ 331 331 Source/JavaScriptCore/runtime/GetterSetter.h \ 332 Source/JavaScriptCore/runtime/Heuristics.cpp \ 333 Source/JavaScriptCore/runtime/Heuristics.h \ 332 334 Source/JavaScriptCore/runtime/Identifier.cpp \ 333 335 Source/JavaScriptCore/runtime/Identifier.h \ -
trunk/Source/JavaScriptCore/JavaScriptCore.pro
r95751 r96463 145 145 runtime/GCActivityCallback.cpp \ 146 146 runtime/GetterSetter.cpp \ 147 runtime/Heuristics.cpp \ 147 148 runtime/Identifier.cpp \ 148 149 runtime/InitializeThreading.cpp \ -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
r96375 r96463 735 735 </File> 736 736 <File 737 RelativePath="..\..\runtime\Heuristics.cpp" 738 > 739 </File> 740 <File 741 RelativePath="..\..\runtime\Heuristics.h" 742 > 743 </File> 744 <File 737 745 RelativePath="..\..\runtime\Identifier.cpp" 738 746 > -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r96461 r96463 82 82 0FD82F2C1426CA7400179C94 /* JettisonedCodeBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD82F281426CA5A00179C94 /* JettisonedCodeBlocks.cpp */; }; 83 83 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 */; }; 84 86 1400067712A6F7830064D123 /* OSAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1400067612A6F7830064D123 /* OSAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 85 87 1400069312A6F9E10064D123 /* OSAllocatorPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1400069212A6F9E10064D123 /* OSAllocatorPosix.cpp */; }; … … 837 839 0FD82F291426CA5A00179C94 /* JettisonedCodeBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JettisonedCodeBlocks.h; sourceTree = "<group>"; }; 838 840 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>"; }; 839 843 1400067612A6F7830064D123 /* OSAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSAllocator.h; sourceTree = "<group>"; }; 840 844 1400069212A6F9E10064D123 /* OSAllocatorPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OSAllocatorPosix.cpp; sourceTree = "<group>"; }; … … 2030 2034 isa = PBXGroup; 2031 2035 children = ( 2036 0FE228EA1436AB2300196C48 /* Heuristics.cpp */, 2037 0FE228EB1436AB2300196C48 /* Heuristics.h */, 2032 2038 0F7700911402FF280078EB39 /* SamplingCounter.cpp */, 2033 2039 0F77008E1402FDD60078EB39 /* SamplingCounter.h */, … … 2857 2863 0FD52AAE143035A00026DC9F /* UnionFind.h in Headers */, 2858 2864 86880F1E14328BB900B08D42 /* DFGJITCompilerInlineMethods.h in Headers */, 2865 0FE228ED1436AB2700196C48 /* Heuristics.h in Headers */, 2859 2866 ); 2860 2867 runOnlyForDeploymentPostprocessing = 0; … … 3387 3394 86880F44143531A800B08D42 /* DFGJITCodeGenerator64.cpp in Sources */, 3388 3395 86880F4D14353B2100B08D42 /* DFGSpeculativeJIT64.cpp in Sources */, 3396 0FE228EE1436AB2C00196C48 /* Heuristics.cpp in Sources */, 3389 3397 ); 3390 3398 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r95930 r96463 1973 1973 #endif 1974 1974 1975 if (m_optimizationDelayCounter >= 5)1975 if (m_optimizationDelayCounter >= Heuristics::maximumOptimizationDelay) 1976 1976 return true; 1977 1977 … … 1999 1999 #endif 2000 2000 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)) 2003 2003 return true; 2004 2004 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r96375 r96463 34 34 #include "DFGOSREntry.h" 35 35 #include "EvalCodeCache.h" 36 #include "Heuristics.h" 36 37 #include "Instruction.h" 37 38 #include "JITCode.h" … … 719 720 unsigned reoptimizationRetryCounter() const 720 721 { 721 ASSERT(m_reoptimizationRetryCounter <= 18);722 ASSERT(m_reoptimizationRetryCounter <= Heuristics::reoptimizationRetryCounterMax); 722 723 return m_reoptimizationRetryCounter; 723 724 } … … 726 727 { 727 728 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; 737 731 } 738 732 739 733 int32_t counterValueForOptimizeAfterWarmUp() 740 734 { 741 return -1000<< reoptimizationRetryCounter();735 return Heuristics::executionCounterValueForOptimizeAfterWarmUp << reoptimizationRetryCounter(); 742 736 } 743 737 744 738 int32_t counterValueForOptimizeAfterLongWarmUp() 745 739 { 746 return -5000<< reoptimizationRetryCounter();740 return Heuristics::executionCounterValueForOptimizeAfterLongWarmUp << reoptimizationRetryCounter(); 747 741 } 748 742 … … 763 757 void optimizeNextInvocation() 764 758 { 765 m_executeCounter = counterValueForOptimizeNextInvocation();759 m_executeCounter = Heuristics::executionCounterValueForOptimizeNextInvocation; 766 760 } 767 761 … … 773 767 void dontOptimizeAnytimeSoon() 774 768 { 775 m_executeCounter = std::numeric_limits<int32_t>::min();769 m_executeCounter = Heuristics::executionCounterValueForDontOptimizeAnytimeSoon; 776 770 } 777 771 … … 814 808 void optimizeSoon() 815 809 { 816 m_executeCounter = -100<< reoptimizationRetryCounter();810 m_executeCounter = Heuristics::executionCounterValueForOptimizeSoon << reoptimizationRetryCounter(); 817 811 } 818 812 … … 846 840 static ptrdiff_t offsetOfSpeculativeFailCounter() { return OBJECT_OFFSETOF(CodeBlock, m_speculativeFailCounter); } 847 841 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 855 842 // 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(); } 858 845 859 846 bool shouldReoptimizeNow() 860 847 { 861 return desiredSuccessFailRatio()* speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThreshold();848 return Heuristics::desiredSpeculativeSuccessFailRatio * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThreshold(); 862 849 } 863 850 864 851 bool shouldReoptimizeFromLoopNow() 865 852 { 866 return desiredSuccessFailRatio()* speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThresholdForLoop();853 return Heuristics::desiredSpeculativeSuccessFailRatio * speculativeFailCounter() >= speculativeSuccessCounter() && speculativeFailCounter() >= largeFailCountThresholdForLoop(); 867 854 } 868 855 -
trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp
r96375 r96463 452 452 453 453 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); 455 455 456 456 Jump lowFailRate = branch32(BelowOrEqual, GPRInfo::regT2, GPRInfo::regT1); 457 457 458 458 // 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())); 460 460 Jump doneAdjusting = jump(); 461 461 -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r95930 r96463 100 100 return; 101 101 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())); 103 103 JITStubCall stubCall(this, kind == LoopOptimizationCheck ? cti_optimize_from_loop : cti_optimize_from_ret); 104 104 if (kind == LoopOptimizationCheck) -
trunk/Source/JavaScriptCore/runtime/InitializeThreading.cpp
r95510 r96463 32 32 #include "ExecutableAllocator.h" 33 33 #include "Heap.h" 34 #include "Heuristics.h" 34 35 #include "Identifier.h" 35 36 #include "JSGlobalObject.h" … … 53 54 WTF::double_conversion::initialize(); 54 55 WTF::initializeThreading(); 56 Heuristics::initializeHeuristics(); 55 57 #if ENABLE(WRITE_BARRIER_PROFILING) 56 58 WriteBarrierCounters::initialize();
Note: See TracChangeset
for help on using the changeset viewer.