Chromium Code Reviews| Index: src/compiler/js-native-context-specialization.cc |
| diff --git a/src/compiler/js-native-context-specialization.cc b/src/compiler/js-native-context-specialization.cc |
| index 520268bdb68491f84d981652e81fec7b4c11b764..a3c49cf486fa3f1e7166ed061806bed0e46aafe3 100644 |
| --- a/src/compiler/js-native-context-specialization.cc |
| +++ b/src/compiler/js-native-context-specialization.cc |
| @@ -643,13 +643,13 @@ Reduction JSNativeContextSpecialization::ReduceElementAccess( |
| Handle<Map> const transition_source = transition.first; |
| Handle<Map> const transition_target = transition.second; |
| effect = graph()->NewNode( |
| - simplified()->TransitionElementsKind( |
| + simplified()->TransitionElementsKind(ElementsTransition( |
| IsSimpleMapChangeTransition(transition_source->elements_kind(), |
| transition_target->elements_kind()) |
| ? ElementsTransition::kFastTransition |
| - : ElementsTransition::kSlowTransition), |
| - receiver, jsgraph()->HeapConstant(transition_source), |
| - jsgraph()->HeapConstant(transition_target), effect, control); |
| + : ElementsTransition::kSlowTransition, |
| + transition_source, transition_target)), |
| + receiver, effect, control); |
| } |
| // TODO(turbofan): The effect/control linearization will not find a |
| @@ -694,14 +694,13 @@ Reduction JSNativeContextSpecialization::ReduceElementAccess( |
| Handle<Map> const transition_target = transition.second; |
| this_effect = graph()->NewNode( |
| simplified()->TransitionElementsKind( |
| - IsSimpleMapChangeTransition( |
| - transition_source->elements_kind(), |
| - transition_target->elements_kind()) |
| - ? ElementsTransition::kFastTransition |
| - : ElementsTransition::kSlowTransition), |
| - receiver, jsgraph()->HeapConstant(transition_source), |
| - jsgraph()->HeapConstant(transition_target), this_effect, |
| - this_control); |
| + ElementsTransition(IsSimpleMapChangeTransition( |
| + transition_source->elements_kind(), |
| + transition_target->elements_kind()) |
| + ? ElementsTransition::kFastTransition |
| + : ElementsTransition::kSlowTransition, |
| + transition_source, transition_target)), |
| + receiver, this_effect, this_control); |
| } |
| // Load the {receiver} map. |
| @@ -1179,9 +1178,9 @@ JSNativeContextSpecialization::BuildPropertyAccess( |
| Handle<Map> field_map; |
| if (access_info.field_map().ToHandle(&field_map)) { |
| // Emit a map check for the value. |
| - effect = graph()->NewNode(simplified()->CheckMaps(1), value, |
| - jsgraph()->HeapConstant(field_map), |
| - effect, control); |
| + effect = graph()->NewNode( |
| + simplified()->CheckMaps(ZoneHandleSet<Map>(field_map)), value, |
| + effect, control); |
| } |
| field_access.write_barrier_kind = kPointerWriteBarrier; |
| break; |
| @@ -1418,9 +1417,9 @@ JSNativeContextSpecialization::BuildElementAccess( |
| if (access_mode == AccessMode::kStore && |
| IsFastSmiOrObjectElementsKind(elements_kind) && |
| store_mode != STORE_NO_TRANSITION_HANDLE_COW) { |
| - effect = |
| - graph()->NewNode(simplified()->CheckMaps(1), elements, |
| - jsgraph()->FixedArrayMapConstant(), effect, control); |
| + effect = graph()->NewNode(simplified()->CheckMaps(ZoneHandleSet<Map>( |
| + factory()->fixed_array_map())), |
| + elements, effect, control); |
| } |
| // Check if the {receiver} is a JSArray. |
| @@ -1640,12 +1639,12 @@ Node* JSNativeContextSpecialization::BuildCheckHeapObject(Node* receiver, |
| Node* JSNativeContextSpecialization::BuildCheckMaps( |
| Node* receiver, Node* effect, Node* control, |
| - std::vector<Handle<Map>> const& maps) { |
| + std::vector<Handle<Map>> const& receiver_maps) { |
| HeapObjectMatcher m(receiver); |
| if (m.HasValue()) { |
| Handle<Map> receiver_map(m.Value()->map(), isolate()); |
| if (receiver_map->is_stable()) { |
| - for (Handle<Map> map : maps) { |
| + for (Handle<Map> map : receiver_maps) { |
| if (map.is_identical_to(receiver_map)) { |
| dependencies()->AssumeMapStable(receiver_map); |
| return effect; |
| @@ -1653,17 +1652,13 @@ Node* JSNativeContextSpecialization::BuildCheckMaps( |
| } |
| } |
| } |
| - int const map_input_count = static_cast<int>(maps.size()); |
| - int const input_count = 1 + map_input_count + 1 + 1; |
| - Node** inputs = zone()->NewArray<Node*>(input_count); |
| - inputs[0] = receiver; |
| - for (int i = 0; i < map_input_count; ++i) { |
| - inputs[1 + i] = jsgraph()->HeapConstant(maps[i]); |
| + // TODO(turbofan): This could be more efficient. |
|
Jarin
2017/01/01 19:27:35
Remove the comment.
Benedikt Meurer
2017/01/02 12:32:57
Done.
|
| + ZoneHandleSet<Map> maps; |
| + for (Handle<Map> map : receiver_maps) { |
| + maps.insert(map, graph()->zone()); |
| } |
| - inputs[input_count - 2] = effect; |
| - inputs[input_count - 1] = control; |
| - return graph()->NewNode(simplified()->CheckMaps(map_input_count), input_count, |
| - inputs); |
| + return graph()->NewNode(simplified()->CheckMaps(maps), receiver, effect, |
| + control); |
| } |
| void JSNativeContextSpecialization::AssumePrototypesStable( |