OLD | NEW |
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/compiler-source-position-table.h" | 9 #include "src/compiler/compiler-source-position-table.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 control = effect = graph()->NewNode( | 1195 control = effect = graph()->NewNode( |
1196 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, | 1196 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, |
1197 frame_state, effect, control); | 1197 frame_state, effect, control); |
1198 | 1198 |
1199 return ValueEffectControl(index, effect, control); | 1199 return ValueEffectControl(index, effect, control); |
1200 } | 1200 } |
1201 | 1201 |
1202 EffectControlLinearizer::ValueEffectControl | 1202 EffectControlLinearizer::ValueEffectControl |
1203 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state, | 1203 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state, |
1204 Node* effect, Node* control) { | 1204 Node* effect, Node* control) { |
| 1205 CheckMapsParameters const& p = CheckMapsParametersOf(node->op()); |
1205 Node* value = node->InputAt(0); | 1206 Node* value = node->InputAt(0); |
1206 | 1207 |
1207 // Load the current map of the {value}. | 1208 // Load the current map of the {value}. |
1208 Node* value_map = effect = graph()->NewNode( | 1209 Node* value_map = effect = graph()->NewNode( |
1209 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); | 1210 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); |
1210 | 1211 |
1211 int const map_count = node->op()->ValueInputCount() - 1; | 1212 ZoneHandleSet<Map> const& maps = p.maps(); |
| 1213 int const map_count = static_cast<int>(maps.size()); |
1212 Node** controls = temp_zone()->NewArray<Node*>(map_count); | 1214 Node** controls = temp_zone()->NewArray<Node*>(map_count); |
1213 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1); | 1215 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1); |
1214 | 1216 |
1215 for (int i = 0; i < map_count; ++i) { | 1217 for (int i = 0; i < map_count; ++i) { |
1216 Node* map = node->InputAt(1 + i); | 1218 Node* map = jsgraph()->HeapConstant(maps[i]); |
1217 | 1219 |
1218 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map); | 1220 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map); |
1219 if (i == map_count - 1) { | 1221 if (i == map_count - 1) { |
1220 controls[i] = effects[i] = graph()->NewNode( | 1222 controls[i] = effects[i] = graph()->NewNode( |
1221 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check, | 1223 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check, |
1222 frame_state, effect, control); | 1224 frame_state, effect, control); |
1223 } else { | 1225 } else { |
1224 control = graph()->NewNode(common()->Branch(), check, control); | 1226 control = graph()->NewNode(common()->Branch(), check, control); |
1225 controls[i] = graph()->NewNode(common()->IfTrue(), control); | 1227 controls[i] = graph()->NewNode(common()->IfTrue(), control); |
1226 control = graph()->NewNode(common()->IfFalse(), control); | 1228 control = graph()->NewNode(common()->IfFalse(), control); |
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2995 vfalse0, control); | 2997 vfalse0, control); |
2996 | 2998 |
2997 return ValueEffectControl(value, effect, control); | 2999 return ValueEffectControl(value, effect, control); |
2998 } | 3000 } |
2999 | 3001 |
3000 EffectControlLinearizer::ValueEffectControl | 3002 EffectControlLinearizer::ValueEffectControl |
3001 EffectControlLinearizer::LowerTransitionElementsKind(Node* node, Node* effect, | 3003 EffectControlLinearizer::LowerTransitionElementsKind(Node* node, Node* effect, |
3002 Node* control) { | 3004 Node* control) { |
3003 ElementsTransition const transition = ElementsTransitionOf(node->op()); | 3005 ElementsTransition const transition = ElementsTransitionOf(node->op()); |
3004 Node* object = node->InputAt(0); | 3006 Node* object = node->InputAt(0); |
3005 Node* source_map = node->InputAt(1); | 3007 Node* source_map = jsgraph()->HeapConstant(transition.source()); |
3006 Node* target_map = node->InputAt(2); | 3008 Node* target_map = jsgraph()->HeapConstant(transition.target()); |
3007 | 3009 |
3008 // Load the current map of {object}. | 3010 // Load the current map of {object}. |
3009 Node* object_map = effect = | 3011 Node* object_map = effect = |
3010 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), object, | 3012 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), object, |
3011 effect, control); | 3013 effect, control); |
3012 | 3014 |
3013 // Check if {object_map} is the same as {source_map}. | 3015 // Check if {object_map} is the same as {source_map}. |
3014 Node* check = | 3016 Node* check = |
3015 graph()->NewNode(machine()->WordEqual(), object_map, source_map); | 3017 graph()->NewNode(machine()->WordEqual(), object_map, source_map); |
3016 Node* branch = | 3018 Node* branch = |
3017 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | 3019 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
3018 | 3020 |
3019 // Migrate the {object} from {source_map} to {target_map}. | 3021 // Migrate the {object} from {source_map} to {target_map}. |
3020 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 3022 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
3021 Node* etrue = effect; | 3023 Node* etrue = effect; |
3022 { | 3024 { |
3023 switch (transition) { | 3025 switch (transition.mode()) { |
3024 case ElementsTransition::kFastTransition: { | 3026 case ElementsTransition::kFastTransition: { |
3025 // In-place migration of {object}, just store the {target_map}. | 3027 // In-place migration of {object}, just store the {target_map}. |
3026 etrue = | 3028 etrue = |
3027 graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 3029 graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
3028 object, target_map, etrue, if_true); | 3030 object, target_map, etrue, if_true); |
3029 break; | 3031 break; |
3030 } | 3032 } |
3031 case ElementsTransition::kSlowTransition: { | 3033 case ElementsTransition::kSlowTransition: { |
3032 // Instance migration, call out to the runtime for {object}. | 3034 // Instance migration, call out to the runtime for {object}. |
3033 Operator::Properties properties = | 3035 Operator::Properties properties = |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3620 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3622 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3621 Operator::kEliminatable); | 3623 Operator::kEliminatable); |
3622 to_number_operator_.set(common()->Call(desc)); | 3624 to_number_operator_.set(common()->Call(desc)); |
3623 } | 3625 } |
3624 return to_number_operator_.get(); | 3626 return to_number_operator_.get(); |
3625 } | 3627 } |
3626 | 3628 |
3627 } // namespace compiler | 3629 } // namespace compiler |
3628 } // namespace internal | 3630 } // namespace internal |
3629 } // namespace v8 | 3631 } // namespace v8 |
OLD | NEW |