| 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 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 control = effect = graph()->NewNode( | 1191 control = effect = graph()->NewNode( |
| 1192 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, | 1192 common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, |
| 1193 frame_state, effect, control); | 1193 frame_state, effect, control); |
| 1194 | 1194 |
| 1195 return ValueEffectControl(index, effect, control); | 1195 return ValueEffectControl(index, effect, control); |
| 1196 } | 1196 } |
| 1197 | 1197 |
| 1198 EffectControlLinearizer::ValueEffectControl | 1198 EffectControlLinearizer::ValueEffectControl |
| 1199 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state, | 1199 EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state, |
| 1200 Node* effect, Node* control) { | 1200 Node* effect, Node* control) { |
| 1201 CheckMapsParameters const& p = CheckMapsParametersOf(node->op()); |
| 1201 Node* value = node->InputAt(0); | 1202 Node* value = node->InputAt(0); |
| 1202 | 1203 |
| 1203 // Load the current map of the {value}. | 1204 // Load the current map of the {value}. |
| 1204 Node* value_map = effect = graph()->NewNode( | 1205 Node* value_map = effect = graph()->NewNode( |
| 1205 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); | 1206 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); |
| 1206 | 1207 |
| 1207 int const map_count = node->op()->ValueInputCount() - 1; | 1208 ZoneHandleSet<Map> const& maps = p.maps(); |
| 1209 int const map_count = static_cast<int>(maps.size()); |
| 1208 Node** controls = temp_zone()->NewArray<Node*>(map_count); | 1210 Node** controls = temp_zone()->NewArray<Node*>(map_count); |
| 1209 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1); | 1211 Node** effects = temp_zone()->NewArray<Node*>(map_count + 1); |
| 1210 | 1212 |
| 1211 for (int i = 0; i < map_count; ++i) { | 1213 for (int i = 0; i < map_count; ++i) { |
| 1212 Node* map = node->InputAt(1 + i); | 1214 Node* map = jsgraph()->HeapConstant(maps[i]); |
| 1213 | 1215 |
| 1214 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map); | 1216 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, map); |
| 1215 if (i == map_count - 1) { | 1217 if (i == map_count - 1) { |
| 1216 controls[i] = effects[i] = graph()->NewNode( | 1218 controls[i] = effects[i] = graph()->NewNode( |
| 1217 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check, | 1219 common()->DeoptimizeUnless(DeoptimizeReason::kWrongMap), check, |
| 1218 frame_state, effect, control); | 1220 frame_state, effect, control); |
| 1219 } else { | 1221 } else { |
| 1220 control = graph()->NewNode(common()->Branch(), check, control); | 1222 control = graph()->NewNode(common()->Branch(), check, control); |
| 1221 controls[i] = graph()->NewNode(common()->IfTrue(), control); | 1223 controls[i] = graph()->NewNode(common()->IfTrue(), control); |
| 1222 control = graph()->NewNode(common()->IfFalse(), control); | 1224 control = graph()->NewNode(common()->IfFalse(), control); |
| (...skipping 1737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2960 vfalse0, control); | 2962 vfalse0, control); |
| 2961 | 2963 |
| 2962 return ValueEffectControl(value, effect, control); | 2964 return ValueEffectControl(value, effect, control); |
| 2963 } | 2965 } |
| 2964 | 2966 |
| 2965 EffectControlLinearizer::ValueEffectControl | 2967 EffectControlLinearizer::ValueEffectControl |
| 2966 EffectControlLinearizer::LowerTransitionElementsKind(Node* node, Node* effect, | 2968 EffectControlLinearizer::LowerTransitionElementsKind(Node* node, Node* effect, |
| 2967 Node* control) { | 2969 Node* control) { |
| 2968 ElementsTransition const transition = ElementsTransitionOf(node->op()); | 2970 ElementsTransition const transition = ElementsTransitionOf(node->op()); |
| 2969 Node* object = node->InputAt(0); | 2971 Node* object = node->InputAt(0); |
| 2970 Node* source_map = node->InputAt(1); | 2972 Node* source_map = jsgraph()->HeapConstant(transition.source()); |
| 2971 Node* target_map = node->InputAt(2); | 2973 Node* target_map = jsgraph()->HeapConstant(transition.target()); |
| 2972 | 2974 |
| 2973 // Load the current map of {object}. | 2975 // Load the current map of {object}. |
| 2974 Node* object_map = effect = | 2976 Node* object_map = effect = |
| 2975 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), object, | 2977 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), object, |
| 2976 effect, control); | 2978 effect, control); |
| 2977 | 2979 |
| 2978 // Check if {object_map} is the same as {source_map}. | 2980 // Check if {object_map} is the same as {source_map}. |
| 2979 Node* check = | 2981 Node* check = |
| 2980 graph()->NewNode(machine()->WordEqual(), object_map, source_map); | 2982 graph()->NewNode(machine()->WordEqual(), object_map, source_map); |
| 2981 Node* branch = | 2983 Node* branch = |
| 2982 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | 2984 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
| 2983 | 2985 |
| 2984 // Migrate the {object} from {source_map} to {target_map}. | 2986 // Migrate the {object} from {source_map} to {target_map}. |
| 2985 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 2987 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
| 2986 Node* etrue = effect; | 2988 Node* etrue = effect; |
| 2987 { | 2989 { |
| 2988 switch (transition) { | 2990 switch (transition.mode()) { |
| 2989 case ElementsTransition::kFastTransition: { | 2991 case ElementsTransition::kFastTransition: { |
| 2990 // In-place migration of {object}, just store the {target_map}. | 2992 // In-place migration of {object}, just store the {target_map}. |
| 2991 etrue = | 2993 etrue = |
| 2992 graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 2994 graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
| 2993 object, target_map, etrue, if_true); | 2995 object, target_map, etrue, if_true); |
| 2994 break; | 2996 break; |
| 2995 } | 2997 } |
| 2996 case ElementsTransition::kSlowTransition: { | 2998 case ElementsTransition::kSlowTransition: { |
| 2997 // Instance migration, call out to the runtime for {object}. | 2999 // Instance migration, call out to the runtime for {object}. |
| 2998 Operator::Properties properties = | 3000 Operator::Properties properties = |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3585 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3587 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
| 3586 Operator::kEliminatable); | 3588 Operator::kEliminatable); |
| 3587 to_number_operator_.set(common()->Call(desc)); | 3589 to_number_operator_.set(common()->Call(desc)); |
| 3588 } | 3590 } |
| 3589 return to_number_operator_.get(); | 3591 return to_number_operator_.get(); |
| 3590 } | 3592 } |
| 3591 | 3593 |
| 3592 } // namespace compiler | 3594 } // namespace compiler |
| 3593 } // namespace internal | 3595 } // namespace internal |
| 3594 } // namespace v8 | 3596 } // namespace v8 |
| OLD | NEW |