OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/compilation-dependencies.h" | 6 #include "src/compilation-dependencies.h" |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 Handle<Name> name = NamedAccessOf(node->op()).name(); | 929 Handle<Name> name = NamedAccessOf(node->op()).name(); |
930 // Optimize "length" property of strings. | 930 // Optimize "length" property of strings. |
931 if (name.is_identical_to(factory()->length_string()) && | 931 if (name.is_identical_to(factory()->length_string()) && |
932 receiver_type->Is(Type::String())) { | 932 receiver_type->Is(Type::String())) { |
933 Node* value = effect = graph()->NewNode( | 933 Node* value = effect = graph()->NewNode( |
934 simplified()->LoadField(AccessBuilder::ForStringLength()), receiver, | 934 simplified()->LoadField(AccessBuilder::ForStringLength()), receiver, |
935 effect, control); | 935 effect, control); |
936 ReplaceWithValue(node, value, effect); | 936 ReplaceWithValue(node, value, effect); |
937 return Replace(value); | 937 return Replace(value); |
938 } | 938 } |
939 // Optimize "prototype" property of functions. | |
940 if (name.is_identical_to(factory()->prototype_string()) && | |
941 receiver_type->IsConstant() && | |
942 receiver_type->AsConstant()->Value()->IsJSFunction()) { | |
943 // TODO(turbofan): This lowering might not kick in if we ever lower | |
944 // the C++ accessor for "prototype" in an earlier optimization pass. | |
945 Handle<JSFunction> function = | |
946 Handle<JSFunction>::cast(receiver_type->AsConstant()->Value()); | |
947 if (function->has_initial_map()) { | |
948 // We need to add a code dependency on the initial map of the {function} | |
949 // in order to be notified about changes to the "prototype" of {function}, | |
950 // so it doesn't make sense to continue unless deoptimization is enabled. | |
951 if (!(flags() & kDeoptimizationEnabled)) return NoChange(); | |
952 Handle<Map> initial_map(function->initial_map(), isolate()); | |
953 dependencies()->AssumeInitialMapCantChange(initial_map); | |
954 Node* value = | |
955 jsgraph()->Constant(handle(initial_map->prototype(), isolate())); | |
956 ReplaceWithValue(node, value); | |
957 return Replace(value); | |
958 } | |
959 } | |
960 return NoChange(); | 939 return NoChange(); |
961 } | 940 } |
962 | 941 |
963 | 942 |
964 Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { | 943 Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { |
965 Node* key = NodeProperties::GetValueInput(node, 1); | 944 Node* key = NodeProperties::GetValueInput(node, 1); |
966 Node* base = NodeProperties::GetValueInput(node, 0); | 945 Node* base = NodeProperties::GetValueInput(node, 0); |
967 Type* key_type = NodeProperties::GetType(key); | 946 Type* key_type = NodeProperties::GetType(key); |
968 HeapObjectMatcher mbase(base); | 947 HeapObjectMatcher mbase(base); |
969 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { | 948 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1829 } | 1808 } |
1830 | 1809 |
1831 | 1810 |
1832 CompilationDependencies* JSTypedLowering::dependencies() const { | 1811 CompilationDependencies* JSTypedLowering::dependencies() const { |
1833 return dependencies_; | 1812 return dependencies_; |
1834 } | 1813 } |
1835 | 1814 |
1836 } // namespace compiler | 1815 } // namespace compiler |
1837 } // namespace internal | 1816 } // namespace internal |
1838 } // namespace v8 | 1817 } // namespace v8 |
OLD | NEW |