Changeset 121511 in webkit for trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
- Timestamp:
- Jun 28, 2012, 7:40:14 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r121480 r121511 1079 1079 } 1080 1080 1081 // The speculative JIT tracks its success rate, so that we can 1082 // decide when to reoptimize. It's interesting to note that these 1083 // counters may overflow without any protection. The success 1084 // counter will overflow before the fail one does, becuase the 1085 // fail one is used as a trigger to reoptimize. So the worst case 1086 // is that the success counter overflows and we reoptimize without 1087 // needing to. But this is harmless. If a method really did 1088 // execute 2^32 times then compiling it again probably won't hurt 1089 // anyone. 1090 1091 void countSpeculationSuccess() 1092 { 1093 m_speculativeSuccessCounter++; 1094 } 1095 1096 void countSpeculationFailure() 1097 { 1098 m_speculativeFailCounter++; 1099 } 1100 1101 uint32_t speculativeSuccessCounter() const { return m_speculativeSuccessCounter; } 1102 uint32_t speculativeFailCounter() const { return m_speculativeFailCounter; } 1103 uint32_t forcedOSRExitCounter() const { return m_forcedOSRExitCounter; } 1104 1105 uint32_t* addressOfSpeculativeSuccessCounter() { return &m_speculativeSuccessCounter; } 1106 uint32_t* addressOfSpeculativeFailCounter() { return &m_speculativeFailCounter; } 1107 uint32_t* addressOfForcedOSRExitCounter() { return &m_forcedOSRExitCounter; } 1108 1109 static ptrdiff_t offsetOfSpeculativeSuccessCounter() { return OBJECT_OFFSETOF(CodeBlock, m_speculativeSuccessCounter); } 1110 static ptrdiff_t offsetOfSpeculativeFailCounter() { return OBJECT_OFFSETOF(CodeBlock, m_speculativeFailCounter); } 1111 static ptrdiff_t offsetOfForcedOSRExitCounter() { return OBJECT_OFFSETOF(CodeBlock, m_forcedOSRExitCounter); } 1081 uint32_t osrExitCounter() const { return m_osrExitCounter; } 1082 1083 void countOSRExit() { m_osrExitCounter++; } 1084 1085 uint32_t* addressOfOSRExitCounter() { return &m_osrExitCounter; } 1086 1087 static ptrdiff_t offsetOfOSRExitCounter() { return OBJECT_OFFSETOF(CodeBlock, m_osrExitCounter); } 1112 1088 1113 1089 #if ENABLE(JIT) 1114 // The number of failures that triggers the use of the ratio. 1115 unsigned largeFailCountThreshold() { return Options::largeFailCountThresholdBase << baselineVersion()->reoptimizationRetryCounter(); } 1116 unsigned largeFailCountThresholdForLoop() { return Options::largeFailCountThresholdBaseForLoop << baselineVersion()->reoptimizationRetryCounter(); } 1090 uint32_t adjustedExitCountThreshold(uint32_t desiredThreshold) 1091 { 1092 ASSERT(getJITType() == JITCode::DFGJIT); 1093 // Compute this the lame way so we don't saturate. This is called infrequently 1094 // enough that this loop won't hurt us. 1095 unsigned result = desiredThreshold; 1096 for (unsigned n = baselineVersion()->reoptimizationRetryCounter(); n--;) { 1097 unsigned newResult = result << 1; 1098 if (newResult < result) 1099 return std::numeric_limits<uint32_t>::max(); 1100 result = newResult; 1101 } 1102 return result; 1103 } 1104 1105 uint32_t exitCountThresholdForReoptimization() 1106 { 1107 return adjustedExitCountThreshold(Options::osrExitCountForReoptimization); 1108 } 1109 1110 uint32_t exitCountThresholdForReoptimizationFromLoop() 1111 { 1112 return adjustedExitCountThreshold(Options::osrExitCountForReoptimizationFromLoop); 1113 } 1117 1114 1118 1115 bool shouldReoptimizeNow() 1119 1116 { 1120 return (Options::desiredSpeculativeSuccessFailRatio * 1121 speculativeFailCounter() >= speculativeSuccessCounter() 1122 && speculativeFailCounter() >= largeFailCountThreshold()) 1123 || forcedOSRExitCounter() >= 1124 Options::forcedOSRExitCountForReoptimization; 1125 } 1126 1117 return osrExitCounter() >= exitCountThresholdForReoptimization(); 1118 } 1119 1127 1120 bool shouldReoptimizeFromLoopNow() 1128 1121 { 1129 return (Options::desiredSpeculativeSuccessFailRatio * 1130 speculativeFailCounter() >= speculativeSuccessCounter() 1131 && speculativeFailCounter() >= largeFailCountThresholdForLoop()) 1132 || forcedOSRExitCounter() >= 1133 Options::forcedOSRExitCountForReoptimization; 1122 return osrExitCounter() >= exitCountThresholdForReoptimizationFromLoop(); 1134 1123 } 1135 1124 #endif … … 1332 1321 ExecutionCounter m_jitExecuteCounter; 1333 1322 int32_t m_totalJITExecutions; 1334 uint32_t m_speculativeSuccessCounter; 1335 uint32_t m_speculativeFailCounter; 1336 uint32_t m_forcedOSRExitCounter; 1323 uint32_t m_osrExitCounter; 1337 1324 uint16_t m_optimizationDelayCounter; 1338 1325 uint16_t m_reoptimizationRetryCounter;
Note:
See TracChangeset
for help on using the changeset viewer.