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

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 2431563002: [turbofan] Track multiple maps for LoadElimination. (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 unified diff | Download patch
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/effect-control-linearizer.h" 5 #include "src/compiler/effect-control-linearizer.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 control = effect = graph()->NewNode( 1160 control = effect = graph()->NewNode(
1161 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, 1161 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check,
1162 frame_state, effect, control); 1162 frame_state, effect, control);
1163 1163
1164 return ValueEffectControl(index, effect, control); 1164 return ValueEffectControl(index, effect, control);
1165 } 1165 }
1166 1166
1167 EffectControlLinearizer::ValueEffectControl 1167 EffectControlLinearizer::ValueEffectControl
1168 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state, 1168 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state,
1169 Node* effect, Node* control) { 1169 Node* effect, Node* control) {
1170 CheckMapsParameters const& p = CheckMapsParametersOf(node->op());
1170 Node* value = node->InputAt(0); 1171 Node* value = node->InputAt(0);
1171 1172
1172 // Load the current map of the {value}. 1173 // Load the current map of the {value}.
1173 Node* value_map = effect = graph()->NewNode( 1174 Node* value_map = effect = graph()->NewNode(
1174 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); 1175 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control);
1175 1176
1176 int const map_count = node->op()->ValueInputCount() - 1; 1177 ZoneHandleSet<Map> const& maps = p.maps();
1178 int const map_count = static_cast<int>(maps.size());
1177 Node** controls = temp_zone()->NewArray<Node*>(map_count); 1179 Node** controls = temp_zone()->NewArray<Node*>(map_count);
1178 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1); 1180 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1);
1179 1181
1180 for (int i = 0; i < map_count; ++i) { 1182 for (int i = 0; i < map_count; ++i) {
1181 Node* map = node->InputAt(1 + i); 1183 Node* map = jsgraph()->HeapConstant(maps[i]);
1182 1184
1183 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map); 1185 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map);
1184 if (i == map_count - 1) { 1186 if (i == map_count - 1) {
1185 controls[i] = effects[i] = graph()->NewNode( 1187 controls[i] = effects[i] = graph()->NewNode(
1186 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check, 1188 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check,
1187 frame_state, effect, control); 1189 frame_state, effect, control);
1188 } else { 1190 } else {
1189 control = graph()->NewNode(common()->Branch(), check, control); 1191 control = graph()->NewNode(common()->Branch(), check, control);
1190 controls[i] = graph()->NewNode(common()->IfTrue(), control); 1192 controls[i] = graph()->NewNode(common()->IfTrue(), control);
1191 control = graph()->NewNode(common()->IfFalse(), control); 1193 control = graph()->NewNode(common()->IfFalse(), control);
(...skipping 2296 matching lines...) Expand 10 before | Expand all | Expand 10 after
3488 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 3490 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
3489 Operator::kEliminatable); 3491 Operator::kEliminatable);
3490 to_number_operator_.set(common()->Call(desc)); 3492 to_number_operator_.set(common()->Call(desc));
3491 } 3493 }
3492 return to_number_operator_.get(); 3494 return to_number_operator_.get();
3493 } 3495 }
3494 3496
3495 } // namespace compiler 3497 } // namespace compiler
3496 } // namespace internal 3498 } // namespace internal
3497 } // namespace v8 3499 } // namespace v8
OLDNEW
« no previous file with comments | « BUILD.gn ('k') | src/compiler/js-builtin-reducer.cc » ('j') | src/compiler/load-elimination.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698