Commit 42042892 authored by Marja Hölttä's avatar Marja Hölttä Committed by Commit Bot

[Map::TransitionToDataProperty speed] Remove a branch in TransitionsAccessor::SearchTransition

We checked against kNotFound twice; once in
TransitionsAccessor::SearchTransitions and once in TransitionArray::Search. It's
unnecessary to check twice.

In local tests, this speeds up searching for a non-existent transition in a
2-element TransitionArray by ~20%.

BUG=v8:8547

Change-Id: Ic220c4c0bfeeacd9b81953efad212ed15168437e
Reviewed-on: https://chromium-review.googlesource.com/c/1361167Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Marja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58038}
parent bec0234f
......@@ -224,9 +224,7 @@ Map TransitionsAccessor::SearchTransition(Name name, PropertyKind kind,
return map;
}
case kFullTransitionArray: {
int transition = transitions()->Search(kind, name, attributes);
if (transition == kNotFound) return Map();
return transitions()->GetTarget(transition);
return transitions()->SearchAndGetTarget(kind, name, attributes);
}
}
UNREACHABLE();
......@@ -605,6 +603,29 @@ int TransitionArray::SearchDetails(int transition, PropertyKind kind,
return kNotFound;
}
Map TransitionArray::SearchDetailsAndGetTarget(int transition,
PropertyKind kind,
PropertyAttributes attributes) {
int nof_transitions = number_of_transitions();
DCHECK(transition < nof_transitions);
Name key = GetKey(transition);
for (; transition < nof_transitions && GetKey(transition) == key;
transition++) {
Map target = GetTarget(transition);
PropertyDetails target_details =
TransitionsAccessor::GetTargetDetails(key, target);
int cmp = CompareDetails(kind, attributes, target_details.kind(),
target_details.attributes());
if (cmp == 0) {
return target;
} else if (cmp < 0) {
break;
}
}
return Map();
}
int TransitionArray::Search(PropertyKind kind, Name name,
PropertyAttributes attributes,
int* out_insertion_index) {
......@@ -613,6 +634,15 @@ int TransitionArray::Search(PropertyKind kind, Name name,
return SearchDetails(transition, kind, attributes, out_insertion_index);
}
Map TransitionArray::SearchAndGetTarget(PropertyKind kind, Name name,
PropertyAttributes attributes) {
int transition = SearchName(name, nullptr);
if (transition == kNotFound) {
return Map();
}
return SearchDetailsAndGetTarget(transition, kind, attributes);
}
void TransitionArray::Sort() {
DisallowHeapAllocation no_gc;
// In-place insertion sort.
......
......@@ -302,6 +302,9 @@ class TransitionArray : public WeakFixedArray {
int Search(PropertyKind kind, Name name, PropertyAttributes attributes,
int* out_insertion_index = nullptr);
Map SearchAndGetTarget(PropertyKind kind, Name name,
PropertyAttributes attributes);
// Search a non-property transition (like elements kind, observe or frozen
// transitions).
inline int SearchSpecial(Symbol symbol, int* out_insertion_index = nullptr);
......@@ -309,6 +312,8 @@ class TransitionArray : public WeakFixedArray {
inline int SearchName(Name name, int* out_insertion_index = nullptr);
int SearchDetails(int transition, PropertyKind kind,
PropertyAttributes attributes, int* out_insertion_index);
Map SearchDetailsAndGetTarget(int transition, PropertyKind kind,
PropertyAttributes attributes);
inline int number_of_transitions() const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment