Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 29fcec6017a29ec87ce8e352de6690c33c78c1dd..acc64b7ca4886de7c3ebada93bc243587ba9cf6c 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1577,42 +1577,60 @@ inline void AllocationSite::IncrementMementoCreateCount() { |
} |
-inline bool AllocationSite::DigestPretenuringFeedback() { |
- bool decision_changed = false; |
+inline bool AllocationSite::MakePretenureDecision( |
+ PretenureDecision current_decision, |
+ double ratio, |
+ bool maximum_size_scavenge) { |
+ // Here we just allow state transitions from undecided or maybe tenure |
+ // to don't tenure, maybe tenure, or tenure. |
+ if ((current_decision == kUndecided || current_decision == kMaybeTenure)) { |
+ if (ratio >= kPretenureRatio) { |
+ // We just transition into tenure state when the semi-space was at |
+ // maximum capacity. |
+ if (maximum_size_scavenge) { |
+ set_deopt_dependent_code(true); |
+ set_pretenure_decision(kTenure); |
+ // Currently we just need to deopt when we make a state transition to |
+ // tenure. |
+ return true; |
+ } |
+ set_pretenure_decision(kMaybeTenure); |
+ } else { |
+ set_pretenure_decision(kDontTenure); |
+ } |
+ } |
+ return false; |
+} |
+ |
+ |
+inline bool AllocationSite::DigestPretenuringFeedback( |
+ bool maximum_size_scavenge) { |
+ bool deopt = false; |
int create_count = memento_create_count(); |
int found_count = memento_found_count(); |
bool minimum_mementos_created = create_count >= kPretenureMinimumCreated; |
double ratio = |
minimum_mementos_created || FLAG_trace_pretenuring_statistics ? |
static_cast<double>(found_count) / create_count : 0.0; |
- PretenureFlag current_mode = GetPretenureMode(); |
- |
- // TODO(hpayer): Add an intermediate state MAYBE_TENURE which collects |
- // more lifetime feedback for tenuring candidates. In the meantime, we |
- // just allow transitions from undecided to tenured or not tenured. |
- if (minimum_mementos_created && pretenure_decision() == kUndecided) { |
- PretenureDecision result = ratio >= kPretenureRatio |
- ? kTenure |
- : kDontTenure; |
- set_pretenure_decision(result); |
- if (current_mode != GetPretenureMode()) { |
- decision_changed = true; |
- set_deopt_dependent_code(true); |
- } |
+ PretenureDecision current_decision = pretenure_decision(); |
+ |
+ if (minimum_mementos_created) { |
+ deopt = MakePretenureDecision( |
+ current_decision, ratio, maximum_size_scavenge); |
} |
if (FLAG_trace_pretenuring_statistics) { |
PrintF( |
"AllocationSite(%p): (created, found, ratio) (%d, %d, %f) %s => %s\n", |
static_cast<void*>(this), create_count, found_count, ratio, |
- current_mode == TENURED ? "tenured" : "not tenured", |
- GetPretenureMode() == TENURED ? "tenured" : "not tenured"); |
+ PretenureDecisionName(current_decision), |
+ PretenureDecisionName(pretenure_decision())); |
} |
// Clear feedback calculation fields until the next gc. |
set_memento_found_count(0); |
set_memento_create_count(0); |
- return decision_changed; |
+ return deopt; |
} |