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

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

Issue 2412393003: [turbofan] Native-context-spec: Use the CheckMaps for polymorphic fall-through. (Closed)
Patch Set: Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1b0258f8b066f0353e0653460240bd26aafe3deb..8e142bfa9d21186af96ad8d7c75c19cc28c82b21 100644
--- a/src/compiler/js-native-context-specialization.cc
+++ b/src/compiler/js-native-context-specialization.cc
@@ -215,7 +215,7 @@ Reduction JSNativeContextSpecialization::ReduceNamedAccess(
Node* this_value = value;
Node* this_receiver = receiver;
Node* this_effect = effect;
- Node* this_control;
+ Node* this_control = fallthrough_control;
// Perform map check on {receiver}.
MapList const& receiver_maps = access_info.receiver_maps();
@@ -223,19 +223,19 @@ Reduction JSNativeContextSpecialization::ReduceNamedAccess(
// Emit a (sequence of) map checks for other {receiver}s.
ZoneVector<Node*> this_controls(zone());
ZoneVector<Node*> this_effects(zone());
- size_t num_classes = receiver_maps.size();
- for (auto map : receiver_maps) {
- DCHECK_LT(0u, num_classes);
- Node* check =
- graph()->NewNode(simplified()->ReferenceEqual(), receiver_map,
- jsgraph()->Constant(map));
- if (--num_classes == 0 && j == access_infos.size() - 1) {
- check = graph()->NewNode(simplified()->CheckIf(), check,
- this_effect, fallthrough_control);
- this_controls.push_back(fallthrough_control);
- this_effects.push_back(check);
- fallthrough_control = nullptr;
- } else {
+ if (j == access_infos.size() - 1) {
+ // Last map check on the fallthrough control path, do a
+ // conditional eager deoptimization exit here.
+ this_effect = BuildCheckMaps(receiver, this_effect, this_control,
+ receiver_maps);
+ this_effects.push_back(this_effect);
+ this_controls.push_back(fallthrough_control);
+ fallthrough_control = nullptr;
+ } else {
+ for (auto map : receiver_maps) {
+ Node* check =
+ graph()->NewNode(simplified()->ReferenceEqual(), receiver_map,
+ jsgraph()->Constant(map));
Node* branch = graph()->NewNode(common()->Branch(), check,
fallthrough_control);
fallthrough_control = graph()->NewNode(common()->IfFalse(), branch);
@@ -579,35 +579,25 @@ Reduction JSNativeContextSpecialization::ReduceElementAccess(
// Perform map check(s) on {receiver}.
MapList const& receiver_maps = access_info.receiver_maps();
- {
+ if (j == access_infos.size() - 1) {
+ // Last map check on the fallthrough control path, do a
+ // conditional eager deoptimization exit here.
+ this_effect = BuildCheckMaps(receiver, this_effect, this_control,
+ receiver_maps);
+ fallthrough_control = nullptr;
+ } else {
ZoneVector<Node*> this_controls(zone());
ZoneVector<Node*> this_effects(zone());
- size_t num_classes = receiver_maps.size();
for (Handle<Map> map : receiver_maps) {
- DCHECK_LT(0u, num_classes);
Node* check =
graph()->NewNode(simplified()->ReferenceEqual(), receiver_map,
jsgraph()->Constant(map));
- if (--num_classes == 0 && j == access_infos.size() - 1) {
- // Last map check on the fallthrough control path, do a
- // conditional eager deoptimization exit here.
- // TODO(turbofan): This is ugly as hell! We should probably
- // introduce macro-ish operators for property access that
- // encapsulate this whole mess.
- check = graph()->NewNode(simplified()->CheckIf(), check,
- this_effect, this_control);
- this_controls.push_back(this_control);
- this_effects.push_back(check);
- fallthrough_control = nullptr;
- } else {
- Node* branch = graph()->NewNode(common()->Branch(), check,
- fallthrough_control);
- this_controls.push_back(
- graph()->NewNode(common()->IfTrue(), branch));
- this_effects.push_back(this_effect);
- fallthrough_control =
- graph()->NewNode(common()->IfFalse(), branch);
- }
+ Node* branch = graph()->NewNode(common()->Branch(), check,
+ fallthrough_control);
+ this_controls.push_back(
+ graph()->NewNode(common()->IfTrue(), branch));
+ this_effects.push_back(this_effect);
+ fallthrough_control = graph()->NewNode(common()->IfFalse(), branch);
}
// Create single chokepoint for the control.
« 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