Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(817)

Side by Side Diff: src/compiler/js-native-context-specialization.cc

Issue 1410953006: [turbofan] Properly type field access to stable heap object maps. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Final workarounds. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/pipeline.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/js-native-context-specialization.h" 5 #include "src/compiler/js-native-context-specialization.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/compilation-dependencies.h" 8 #include "src/compilation-dependencies.h"
9 #include "src/compiler/access-builder.h" 9 #include "src/compiler/access-builder.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 dependencies()->AssumePropertyCell(property_cell); 102 dependencies()->AssumePropertyCell(property_cell);
103 // Compute proper type based on the current value in the cell. 103 // Compute proper type based on the current value in the cell.
104 Type* property_cell_value_type; 104 Type* property_cell_value_type;
105 if (property_cell_value->IsSmi()) { 105 if (property_cell_value->IsSmi()) {
106 property_cell_value_type = Type::Intersect( 106 property_cell_value_type = Type::Intersect(
107 Type::SignedSmall(), Type::TaggedSigned(), graph()->zone()); 107 Type::SignedSmall(), Type::TaggedSigned(), graph()->zone());
108 } else if (property_cell_value->IsNumber()) { 108 } else if (property_cell_value->IsNumber()) {
109 property_cell_value_type = Type::Intersect( 109 property_cell_value_type = Type::Intersect(
110 Type::Number(), Type::TaggedPointer(), graph()->zone()); 110 Type::Number(), Type::TaggedPointer(), graph()->zone());
111 } else { 111 } else {
112 property_cell_value_type = Type::Of(property_cell_value, graph()->zone()); 112 Handle<Map> property_cell_value_map(
113 Handle<HeapObject>::cast(property_cell_value)->map(), isolate());
114 property_cell_value_type =
115 Type::Class(property_cell_value_map, graph()->zone());
113 } 116 }
114 Node* value = effect = graph()->NewNode( 117 Node* value = effect = graph()->NewNode(
115 simplified()->LoadField( 118 simplified()->LoadField(
116 AccessBuilder::ForPropertyCellValue(property_cell_value_type)), 119 AccessBuilder::ForPropertyCellValue(property_cell_value_type)),
117 jsgraph()->Constant(property_cell), effect, control); 120 jsgraph()->Constant(property_cell), effect, control);
118 return Replace(node, value, effect); 121 return Replace(node, value, effect);
119 } 122 }
120 123
121 // Load from non-configurable, data property on the global can be lowered to 124 // Load from non-configurable, data property on the global can be lowered to
122 // a field load, even without deoptimization, because the property cannot be 125 // a field load, even without deoptimization, because the property cannot be
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 if (access_mode == kStore) { 401 if (access_mode == kStore) {
399 // Store is not safe if the field type was cleared. 402 // Store is not safe if the field type was cleared.
400 break; 403 break;
401 } 404 }
402 405
403 // The field type was cleared by the GC, so we don't know anything 406 // The field type was cleared by the GC, so we don't know anything
404 // about the contents now. 407 // about the contents now.
405 // TODO(bmeurer): It would be awesome to make this saner in the 408 // TODO(bmeurer): It would be awesome to make this saner in the
406 // runtime/GC interaction. 409 // runtime/GC interaction.
407 field_type = Type::TaggedPointer(); 410 field_type = Type::TaggedPointer();
408 } else { 411 } else if (!Type::Any()->Is(field_type)) {
409 // Add proper code dependencies in case of stable field map(s). 412 // Add proper code dependencies in case of stable field map(s).
410 if (field_type->NumClasses() > 0 && field_type->NowStable()) { 413 Handle<Map> field_owner_map(map->FindFieldOwner(number), isolate());
411 dependencies()->AssumeFieldType( 414 dependencies()->AssumeFieldType(field_owner_map);
412 handle(map->FindFieldOwner(number), isolate()));
413 for (auto i = field_type->Classes(); !i.Done(); i.Advance()) {
414 dependencies()->AssumeMapStable(i.Current());
415 }
416 } else {
417 field_type = Type::TaggedPointer();
418 }
419 } 415 }
420 DCHECK(field_type->Is(Type::TaggedPointer())); 416 DCHECK(field_type->Is(Type::TaggedPointer()));
421 } 417 }
422 *access_info = PropertyAccessInfo::DataField(receiver_type, field_index, 418 *access_info = PropertyAccessInfo::DataField(receiver_type, field_index,
423 field_type, holder); 419 field_type, holder);
424 return true; 420 return true;
425 } else { 421 } else {
426 // TODO(bmeurer): Add support for accessors. 422 // TODO(bmeurer): Add support for accessors.
427 break; 423 break;
428 } 424 }
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 } 936 }
941 937
942 938
943 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { 939 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const {
944 return jsgraph()->simplified(); 940 return jsgraph()->simplified();
945 } 941 }
946 942
947 } // namespace compiler 943 } // namespace compiler
948 } // namespace internal 944 } // namespace internal
949 } // namespace v8 945 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/pipeline.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698