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

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

Issue 2746013002: [turbofan] Less aggressively insert SOFT deopts for property access. (Closed)
Patch Set: Work-around for JSFunctions without context. Created 3 years, 9 months 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 | no next file » | 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/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/compilation-dependencies.h" 9 #include "src/compilation-dependencies.h"
10 #include "src/compiler/access-builder.h" 10 #include "src/compiler/access-builder.h"
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 566
567 // Check if we have an access o.x or o.x=v where o is the current 567 // Check if we have an access o.x or o.x=v where o is the current
568 // native contexts' global proxy, and turn that into a direct access 568 // native contexts' global proxy, and turn that into a direct access
569 // to the current native contexts' global object instead. 569 // to the current native contexts' global object instead.
570 if (receiver_maps.length() == 1) { 570 if (receiver_maps.length() == 1) {
571 Handle<Map> receiver_map = receiver_maps.first(); 571 Handle<Map> receiver_map = receiver_maps.first();
572 if (receiver_map->IsJSGlobalProxyMap()) { 572 if (receiver_map->IsJSGlobalProxyMap()) {
573 Object* maybe_constructor = receiver_map->GetConstructor(); 573 Object* maybe_constructor = receiver_map->GetConstructor();
574 // Detached global proxies have |null| as their constructor. 574 // Detached global proxies have |null| as their constructor.
575 if (maybe_constructor->IsJSFunction() && 575 if (maybe_constructor->IsJSFunction() &&
576 JSFunction::cast(maybe_constructor)->has_context() &&
576 JSFunction::cast(maybe_constructor)->native_context() == 577 JSFunction::cast(maybe_constructor)->native_context() ==
577 *native_context()) { 578 *native_context()) {
578 return ReduceGlobalAccess(node, receiver, value, name, access_mode, 579 return ReduceGlobalAccess(node, receiver, value, name, access_mode,
579 index); 580 index);
580 } 581 }
581 } 582 }
582 } 583 }
583 584
584 // Compute property access infos for the receiver maps. 585 // Compute property access infos for the receiver maps.
585 AccessInfoFactory access_info_factory(dependencies(), native_context(), 586 AccessInfoFactory access_info_factory(dependencies(), native_context(),
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 793
793 if (flags() & kDeoptimizationEnabled) { 794 if (flags() & kDeoptimizationEnabled) {
794 // Check if we are accessing the current native contexts' global proxy. 795 // Check if we are accessing the current native contexts' global proxy.
795 HeapObjectMatcher m(receiver); 796 HeapObjectMatcher m(receiver);
796 if (m.HasValue() && m.Value().is_identical_to(global_proxy())) { 797 if (m.HasValue() && m.Value().is_identical_to(global_proxy())) {
797 // Optimize accesses to the current native contexts' global proxy. 798 // Optimize accesses to the current native contexts' global proxy.
798 return ReduceGlobalAccess(node, nullptr, value, name, access_mode); 799 return ReduceGlobalAccess(node, nullptr, value, name, access_mode);
799 } 800 }
800 } 801 }
801 802
802 // Check if the {nexus} reports type feedback for the IC.
803 if (nexus.IsUninitialized()) {
804 if ((flags() & kDeoptimizationEnabled) &&
805 (flags() & kBailoutOnUninitialized)) {
806 return ReduceSoftDeoptimize(
807 node,
808 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
809 }
810 return NoChange();
811 }
812
813 // Extract receiver maps from the IC using the {nexus}. 803 // Extract receiver maps from the IC using the {nexus}.
814 MapHandleList receiver_maps; 804 MapHandleList receiver_maps;
815 if (!ExtractReceiverMaps(receiver, effect, nexus, &receiver_maps)) { 805 if (!ExtractReceiverMaps(receiver, effect, nexus, &receiver_maps)) {
816 return NoChange(); 806 return NoChange();
817 } else if (receiver_maps.length() == 0) { 807 } else if (receiver_maps.length() == 0) {
818 if ((flags() & kDeoptimizationEnabled) && 808 if ((flags() & kDeoptimizationEnabled) &&
819 (flags() & kBailoutOnUninitialized)) { 809 (flags() & kBailoutOnUninitialized)) {
820 return ReduceSoftDeoptimize( 810 return ReduceSoftDeoptimize(
821 node, 811 node,
822 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess); 812 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 1177
1188 // Return the character from the {receiver} as single character string. 1178 // Return the character from the {receiver} as single character string.
1189 value = graph()->NewNode(simplified()->StringCharAt(), receiver, index, 1179 value = graph()->NewNode(simplified()->StringCharAt(), receiver, index,
1190 control); 1180 control);
1191 ReplaceWithValue(node, value, effect, control); 1181 ReplaceWithValue(node, value, effect, control);
1192 return Replace(value); 1182 return Replace(value);
1193 } 1183 }
1194 } 1184 }
1195 } 1185 }
1196 1186
1197 // Check if the {nexus} reports type feedback for the IC.
1198 if (nexus.IsUninitialized()) {
1199 if ((flags() & kDeoptimizationEnabled) &&
1200 (flags() & kBailoutOnUninitialized)) {
1201 return ReduceSoftDeoptimize(
1202 node,
1203 DeoptimizeReason::kInsufficientTypeFeedbackForGenericKeyedAccess);
1204 }
1205 return NoChange();
1206 }
1207
1208 // Extract receiver maps from the {nexus}. 1187 // Extract receiver maps from the {nexus}.
1209 MapHandleList receiver_maps; 1188 MapHandleList receiver_maps;
1210 if (!ExtractReceiverMaps(receiver, effect, nexus, &receiver_maps)) { 1189 if (!ExtractReceiverMaps(receiver, effect, nexus, &receiver_maps)) {
1211 return NoChange(); 1190 return NoChange();
1212 } else if (receiver_maps.length() == 0) { 1191 } else if (receiver_maps.length() == 0) {
1213 if ((flags() & kDeoptimizationEnabled) && 1192 if ((flags() & kDeoptimizationEnabled) &&
1214 (flags() & kBailoutOnUninitialized)) { 1193 (flags() & kBailoutOnUninitialized)) {
1215 return ReduceSoftDeoptimize( 1194 return ReduceSoftDeoptimize(
1216 node, 1195 node,
1217 DeoptimizeReason::kInsufficientTypeFeedbackForGenericKeyedAccess); 1196 DeoptimizeReason::kInsufficientTypeFeedbackForGenericKeyedAccess);
(...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after
2243 Handle<Map> receiver_map; 2222 Handle<Map> receiver_map;
2244 if (InferReceiverRootMap(receiver).ToHandle(&receiver_map)) { 2223 if (InferReceiverRootMap(receiver).ToHandle(&receiver_map)) {
2245 for (int i = receiver_maps->length(); --i >= 0;) { 2224 for (int i = receiver_maps->length(); --i >= 0;) {
2246 if (receiver_maps->at(i)->FindRootMap() != *receiver_map) { 2225 if (receiver_maps->at(i)->FindRootMap() != *receiver_map) {
2247 receiver_maps->Remove(i); 2226 receiver_maps->Remove(i);
2248 } 2227 }
2249 } 2228 }
2250 } 2229 }
2251 return true; 2230 return true;
2252 } 2231 }
2253 return false; 2232 // Check if the {nexus} actually reports feedback for the IC. We return
2233 // true if the IC is still uninitialized, which translates to a SOFT
2234 // deoptimization exit in the callers.
2235 return nexus.IsUninitialized();
2254 } 2236 }
2255 2237
2256 bool JSNativeContextSpecialization::InferReceiverMaps( 2238 bool JSNativeContextSpecialization::InferReceiverMaps(
2257 Node* receiver, Node* effect, MapHandleList* receiver_maps) { 2239 Node* receiver, Node* effect, MapHandleList* receiver_maps) {
2258 ZoneHandleSet<Map> maps; 2240 ZoneHandleSet<Map> maps;
2259 if (NodeProperties::InferReceiverMaps(receiver, effect, &maps)) { 2241 if (NodeProperties::InferReceiverMaps(receiver, effect, &maps)) {
2260 for (size_t i = 0; i < maps.size(); ++i) { 2242 for (size_t i = 0; i < maps.size(); ++i) {
2261 receiver_maps->Add(maps[i]); 2243 receiver_maps->Add(maps[i]);
2262 } 2244 }
2263 return true; 2245 return true;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2330 return jsgraph()->javascript(); 2312 return jsgraph()->javascript();
2331 } 2313 }
2332 2314
2333 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { 2315 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const {
2334 return jsgraph()->simplified(); 2316 return jsgraph()->simplified();
2335 } 2317 }
2336 2318
2337 } // namespace compiler 2319 } // namespace compiler
2338 } // namespace internal 2320 } // namespace internal
2339 } // namespace v8 2321 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698