| 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/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
| 6 | 6 |
| 7 #include <stack> | 7 #include <stack> |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 } | 203 } |
| 204 | 204 |
| 205 | 205 |
| 206 Reduction JSIntrinsicLowering::ReduceIsInstanceType( | 206 Reduction JSIntrinsicLowering::ReduceIsInstanceType( |
| 207 Node* node, InstanceType instance_type) { | 207 Node* node, InstanceType instance_type) { |
| 208 // if (%_IsSmi(value)) { | 208 // if (%_IsSmi(value)) { |
| 209 // return false; | 209 // return false; |
| 210 // } else { | 210 // } else { |
| 211 // return %_GetInstanceType(%_GetMap(value)) == instance_type; | 211 // return %_GetInstanceType(%_GetMap(value)) == instance_type; |
| 212 // } | 212 // } |
| 213 MachineType const type = static_cast<MachineType>(kTypeBool | kRepTagged); | |
| 214 | |
| 215 Node* value = NodeProperties::GetValueInput(node, 0); | 213 Node* value = NodeProperties::GetValueInput(node, 0); |
| 216 Node* effect = NodeProperties::GetEffectInput(node); | 214 Node* effect = NodeProperties::GetEffectInput(node); |
| 217 Node* control = NodeProperties::GetControlInput(node); | 215 Node* control = NodeProperties::GetControlInput(node); |
| 218 | 216 |
| 219 Node* check = graph()->NewNode(simplified()->ObjectIsSmi(), value); | 217 Node* check = graph()->NewNode(simplified()->ObjectIsSmi(), value); |
| 220 Node* branch = graph()->NewNode(common()->Branch(), check, control); | 218 Node* branch = graph()->NewNode(common()->Branch(), check, control); |
| 221 | 219 |
| 222 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 220 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
| 223 Node* etrue = effect; | 221 Node* etrue = effect; |
| 224 Node* vtrue = jsgraph()->FalseConstant(); | 222 Node* vtrue = jsgraph()->FalseConstant(); |
| 225 | 223 |
| 226 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 224 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 227 Node* efalse = graph()->NewNode( | 225 Node* efalse = graph()->NewNode( |
| 228 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | 226 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), |
| 229 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), value, | 227 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), value, |
| 230 effect, if_false), | 228 effect, if_false), |
| 231 effect, if_false); | 229 effect, if_false); |
| 232 Node* vfalse = graph()->NewNode(machine()->Word32Equal(), efalse, | 230 Node* vfalse = graph()->NewNode(machine()->Word32Equal(), efalse, |
| 233 jsgraph()->Int32Constant(instance_type)); | 231 jsgraph()->Int32Constant(instance_type)); |
| 234 | 232 |
| 235 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 233 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
| 236 | 234 |
| 237 // Replace all effect uses of {node} with the {ephi}. | 235 // Replace all effect uses of {node} with the {ephi}. |
| 238 Node* ephi = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, merge); | 236 Node* ephi = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, merge); |
| 239 ReplaceWithValue(node, node, ephi); | 237 ReplaceWithValue(node, node, ephi); |
| 240 | 238 |
| 241 // Turn the {node} into a Phi. | 239 // Turn the {node} into a Phi. |
| 242 return Change(node, common()->Phi(type, 2), vtrue, vfalse, merge); | 240 return Change(node, common()->Phi(MachineRepresentation::kTagged, 2), vtrue, |
| 241 vfalse, merge); |
| 243 } | 242 } |
| 244 | 243 |
| 245 | 244 |
| 246 Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) { | 245 Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) { |
| 247 Node* value = NodeProperties::GetValueInput(node, 0); | 246 Node* value = NodeProperties::GetValueInput(node, 0); |
| 248 Type* value_type = NodeProperties::GetType(value); | 247 Type* value_type = NodeProperties::GetType(value); |
| 249 Node* effect = NodeProperties::GetEffectInput(node); | 248 Node* effect = NodeProperties::GetEffectInput(node); |
| 250 Node* control = NodeProperties::GetControlInput(node); | 249 Node* control = NodeProperties::GetControlInput(node); |
| 251 if (value_type->Is(Type::Receiver())) { | 250 if (value_type->Is(Type::Receiver())) { |
| 252 value = jsgraph()->TrueConstant(); | 251 value = jsgraph()->TrueConstant(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 272 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | 271 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), |
| 273 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), | 272 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), |
| 274 value, effect, if_false), | 273 value, effect, if_false), |
| 275 effect, if_false); | 274 effect, if_false); |
| 276 Node* vfalse = graph()->NewNode( | 275 Node* vfalse = graph()->NewNode( |
| 277 machine()->Uint32LessThanOrEqual(), | 276 machine()->Uint32LessThanOrEqual(), |
| 278 jsgraph()->Int32Constant(FIRST_JS_RECEIVER_TYPE), efalse); | 277 jsgraph()->Int32Constant(FIRST_JS_RECEIVER_TYPE), efalse); |
| 279 | 278 |
| 280 control = graph()->NewNode(common()->Merge(2), if_true, if_false); | 279 control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
| 281 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); | 280 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); |
| 282 value = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vtrue, vfalse, | 281 value = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 283 control); | 282 vtrue, vfalse, control); |
| 284 } | 283 } |
| 285 ReplaceWithValue(node, node, effect, control); | 284 ReplaceWithValue(node, node, effect, control); |
| 286 return Replace(value); | 285 return Replace(value); |
| 287 } | 286 } |
| 288 | 287 |
| 289 | 288 |
| 290 Reduction JSIntrinsicLowering::ReduceIsSmi(Node* node) { | 289 Reduction JSIntrinsicLowering::ReduceIsSmi(Node* node) { |
| 291 return Change(node, simplified()->ObjectIsSmi()); | 290 return Change(node, simplified()->ObjectIsSmi()); |
| 292 } | 291 } |
| 293 | 292 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 Reduction JSIntrinsicLowering::ReduceValueOf(Node* node) { | 338 Reduction JSIntrinsicLowering::ReduceValueOf(Node* node) { |
| 340 // if (%_IsSmi(value)) { | 339 // if (%_IsSmi(value)) { |
| 341 // return value; | 340 // return value; |
| 342 // } else if (%_GetInstanceType(%_GetMap(value)) == JS_VALUE_TYPE) { | 341 // } else if (%_GetInstanceType(%_GetMap(value)) == JS_VALUE_TYPE) { |
| 343 // return %_GetValue(value); | 342 // return %_GetValue(value); |
| 344 // } else { | 343 // } else { |
| 345 // return value; | 344 // return value; |
| 346 // } | 345 // } |
| 347 const Operator* const merge_op = common()->Merge(2); | 346 const Operator* const merge_op = common()->Merge(2); |
| 348 const Operator* const ephi_op = common()->EffectPhi(2); | 347 const Operator* const ephi_op = common()->EffectPhi(2); |
| 349 const Operator* const phi_op = common()->Phi(kMachAnyTagged, 2); | 348 const Operator* const phi_op = |
| 349 common()->Phi(MachineRepresentation::kTagged, 2); |
| 350 | 350 |
| 351 Node* value = NodeProperties::GetValueInput(node, 0); | 351 Node* value = NodeProperties::GetValueInput(node, 0); |
| 352 Node* effect = NodeProperties::GetEffectInput(node); | 352 Node* effect = NodeProperties::GetEffectInput(node); |
| 353 Node* control = NodeProperties::GetControlInput(node); | 353 Node* control = NodeProperties::GetControlInput(node); |
| 354 | 354 |
| 355 Node* check0 = graph()->NewNode(simplified()->ObjectIsSmi(), value); | 355 Node* check0 = graph()->NewNode(simplified()->ObjectIsSmi(), value); |
| 356 Node* branch0 = graph()->NewNode(common()->Branch(), check0, control); | 356 Node* branch0 = graph()->NewNode(common()->Branch(), check0, control); |
| 357 | 357 |
| 358 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); | 358 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); |
| 359 Node* etrue0 = effect; | 359 Node* etrue0 = effect; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 Node* value = NodeProperties::GetValueInput(node, 0); | 504 Node* value = NodeProperties::GetValueInput(node, 0); |
| 505 Type* value_type = NodeProperties::GetType(value); | 505 Type* value_type = NodeProperties::GetType(value); |
| 506 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { | 506 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { |
| 507 if (value_type->Max() <= 0.0) { | 507 if (value_type->Max() <= 0.0) { |
| 508 value = jsgraph()->ZeroConstant(); | 508 value = jsgraph()->ZeroConstant(); |
| 509 } else if (value_type->Min() >= kMaxSafeInteger) { | 509 } else if (value_type->Min() >= kMaxSafeInteger) { |
| 510 value = jsgraph()->Constant(kMaxSafeInteger); | 510 value = jsgraph()->Constant(kMaxSafeInteger); |
| 511 } else { | 511 } else { |
| 512 if (value_type->Min() <= 0.0) { | 512 if (value_type->Min() <= 0.0) { |
| 513 value = graph()->NewNode( | 513 value = graph()->NewNode( |
| 514 common()->Select(kMachAnyTagged), | 514 common()->Select(MachineRepresentation::kTagged), |
| 515 graph()->NewNode(simplified()->NumberLessThanOrEqual(), value, | 515 graph()->NewNode(simplified()->NumberLessThanOrEqual(), value, |
| 516 jsgraph()->ZeroConstant()), | 516 jsgraph()->ZeroConstant()), |
| 517 jsgraph()->ZeroConstant(), value); | 517 jsgraph()->ZeroConstant(), value); |
| 518 value_type = Type::Range(0.0, value_type->Max(), graph()->zone()); | 518 value_type = Type::Range(0.0, value_type->Max(), graph()->zone()); |
| 519 NodeProperties::SetType(value, value_type); | 519 NodeProperties::SetType(value, value_type); |
| 520 } | 520 } |
| 521 if (value_type->Max() > kMaxSafeInteger) { | 521 if (value_type->Max() > kMaxSafeInteger) { |
| 522 value = graph()->NewNode( | 522 value = graph()->NewNode( |
| 523 common()->Select(kMachAnyTagged), | 523 common()->Select(MachineRepresentation::kTagged), |
| 524 graph()->NewNode(simplified()->NumberLessThanOrEqual(), | 524 graph()->NewNode(simplified()->NumberLessThanOrEqual(), |
| 525 jsgraph()->Constant(kMaxSafeInteger), value), | 525 jsgraph()->Constant(kMaxSafeInteger), value), |
| 526 jsgraph()->Constant(kMaxSafeInteger), value); | 526 jsgraph()->Constant(kMaxSafeInteger), value); |
| 527 value_type = | 527 value_type = |
| 528 Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); | 528 Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); |
| 529 NodeProperties::SetType(value, value_type); | 529 NodeProperties::SetType(value, value_type); |
| 530 } | 530 } |
| 531 } | 531 } |
| 532 ReplaceWithValue(node, value); | 532 ReplaceWithValue(node, value); |
| 533 return Replace(value); | 533 return Replace(value); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 } | 648 } |
| 649 | 649 |
| 650 | 650 |
| 651 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 651 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { |
| 652 return jsgraph()->simplified(); | 652 return jsgraph()->simplified(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 } // namespace compiler | 655 } // namespace compiler |
| 656 } // namespace internal | 656 } // namespace internal |
| 657 } // namespace v8 | 657 } // namespace v8 |
| OLD | NEW |