| 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-call-reducer.h" | 5 #include "src/compiler/js-call-reducer.h" |
| 6 | 6 |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/objects-inl.h" | 9 #include "src/objects-inl.h" |
| 10 #include "src/type-feedback-vector-inl.h" | 10 #include "src/type-feedback-vector-inl.h" |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 } | 291 } |
| 292 | 292 |
| 293 // Check that the {target} is still the {array_function}. | 293 // Check that the {target} is still the {array_function}. |
| 294 Node* check = effect = | 294 Node* check = effect = |
| 295 graph()->NewNode(javascript()->StrictEqual(), target, array_function, | 295 graph()->NewNode(javascript()->StrictEqual(), target, array_function, |
| 296 context, effect, control); | 296 context, effect, control); |
| 297 Node* branch = | 297 Node* branch = |
| 298 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 298 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
| 299 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 299 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 300 Node* deoptimize = | 300 Node* deoptimize = |
| 301 graph()->NewNode(common()->Deoptimize(), frame_state, effect, if_false); | 301 graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
| 302 frame_state, effect, if_false); |
| 302 // TODO(bmeurer): This should be on the AdvancedReducer somehow. | 303 // TODO(bmeurer): This should be on the AdvancedReducer somehow. |
| 303 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 304 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
| 304 control = graph()->NewNode(common()->IfTrue(), branch); | 305 control = graph()->NewNode(common()->IfTrue(), branch); |
| 305 | 306 |
| 306 // Turn the {node} into a {JSCreateArray} call. | 307 // Turn the {node} into a {JSCreateArray} call. |
| 307 NodeProperties::ReplaceValueInput(node, array_function, 0); | 308 NodeProperties::ReplaceValueInput(node, array_function, 0); |
| 308 NodeProperties::ReplaceEffectInput(node, effect); | 309 NodeProperties::ReplaceEffectInput(node, effect); |
| 309 NodeProperties::ReplaceControlInput(node, control); | 310 NodeProperties::ReplaceControlInput(node, control); |
| 310 return ReduceArrayConstructor(node); | 311 return ReduceArrayConstructor(node); |
| 311 } else if (feedback->IsWeakCell()) { | 312 } else if (feedback->IsWeakCell()) { |
| 312 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); | 313 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); |
| 313 if (cell->value()->IsJSFunction()) { | 314 if (cell->value()->IsJSFunction()) { |
| 314 Node* target_function = | 315 Node* target_function = |
| 315 jsgraph()->Constant(handle(cell->value(), isolate())); | 316 jsgraph()->Constant(handle(cell->value(), isolate())); |
| 316 | 317 |
| 317 // Check that the {target} is still the {target_function}. | 318 // Check that the {target} is still the {target_function}. |
| 318 Node* check = effect = | 319 Node* check = effect = |
| 319 graph()->NewNode(javascript()->StrictEqual(), target, target_function, | 320 graph()->NewNode(javascript()->StrictEqual(), target, target_function, |
| 320 context, effect, control); | 321 context, effect, control); |
| 321 Node* branch = | 322 Node* branch = |
| 322 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 323 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
| 323 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 324 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 324 Node* deoptimize = graph()->NewNode(common()->Deoptimize(), frame_state, | 325 Node* deoptimize = |
| 325 effect, if_false); | 326 graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
| 327 frame_state, effect, if_false); |
| 326 // TODO(bmeurer): This should be on the AdvancedReducer somehow. | 328 // TODO(bmeurer): This should be on the AdvancedReducer somehow. |
| 327 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 329 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
| 328 control = graph()->NewNode(common()->IfTrue(), branch); | 330 control = graph()->NewNode(common()->IfTrue(), branch); |
| 329 | 331 |
| 330 // Specialize the JSCallFunction node to the {target_function}. | 332 // Specialize the JSCallFunction node to the {target_function}. |
| 331 NodeProperties::ReplaceValueInput(node, target_function, 0); | 333 NodeProperties::ReplaceValueInput(node, target_function, 0); |
| 332 NodeProperties::ReplaceEffectInput(node, effect); | 334 NodeProperties::ReplaceEffectInput(node, effect); |
| 333 NodeProperties::ReplaceControlInput(node, control); | 335 NodeProperties::ReplaceControlInput(node, control); |
| 334 | 336 |
| 335 // Try to further reduce the JSCallFunction {node}. | 337 // Try to further reduce the JSCallFunction {node}. |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 } | 434 } |
| 433 | 435 |
| 434 // Check that the {target} is still the {array_function}. | 436 // Check that the {target} is still the {array_function}. |
| 435 Node* check = effect = | 437 Node* check = effect = |
| 436 graph()->NewNode(javascript()->StrictEqual(), target, array_function, | 438 graph()->NewNode(javascript()->StrictEqual(), target, array_function, |
| 437 context, effect, control); | 439 context, effect, control); |
| 438 Node* branch = | 440 Node* branch = |
| 439 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 441 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
| 440 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 442 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 441 Node* deoptimize = | 443 Node* deoptimize = |
| 442 graph()->NewNode(common()->Deoptimize(), frame_state, effect, if_false); | 444 graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
| 445 frame_state, effect, if_false); |
| 443 // TODO(bmeurer): This should be on the AdvancedReducer somehow. | 446 // TODO(bmeurer): This should be on the AdvancedReducer somehow. |
| 444 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 447 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
| 445 control = graph()->NewNode(common()->IfTrue(), branch); | 448 control = graph()->NewNode(common()->IfTrue(), branch); |
| 446 | 449 |
| 447 // Turn the {node} into a {JSCreateArray} call. | 450 // Turn the {node} into a {JSCreateArray} call. |
| 448 NodeProperties::ReplaceEffectInput(node, effect); | 451 NodeProperties::ReplaceEffectInput(node, effect); |
| 449 NodeProperties::ReplaceControlInput(node, control); | 452 NodeProperties::ReplaceControlInput(node, control); |
| 450 NodeProperties::RemoveFrameStateInput(node, 1); | 453 NodeProperties::RemoveFrameStateInput(node, 1); |
| 451 for (int i = arity; i > 0; --i) { | 454 for (int i = arity; i > 0; --i) { |
| 452 NodeProperties::ReplaceValueInput( | 455 NodeProperties::ReplaceValueInput( |
| 453 node, NodeProperties::GetValueInput(node, i), i + 1); | 456 node, NodeProperties::GetValueInput(node, i), i + 1); |
| 454 } | 457 } |
| 455 NodeProperties::ReplaceValueInput(node, new_target, 1); | 458 NodeProperties::ReplaceValueInput(node, new_target, 1); |
| 456 NodeProperties::ChangeOp(node, javascript()->CreateArray(arity, site)); | 459 NodeProperties::ChangeOp(node, javascript()->CreateArray(arity, site)); |
| 457 return Changed(node); | 460 return Changed(node); |
| 458 } else if (feedback->IsWeakCell()) { | 461 } else if (feedback->IsWeakCell()) { |
| 459 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); | 462 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); |
| 460 if (cell->value()->IsJSFunction()) { | 463 if (cell->value()->IsJSFunction()) { |
| 461 Node* target_function = | 464 Node* target_function = |
| 462 jsgraph()->Constant(handle(cell->value(), isolate())); | 465 jsgraph()->Constant(handle(cell->value(), isolate())); |
| 463 | 466 |
| 464 // Check that the {target} is still the {target_function}. | 467 // Check that the {target} is still the {target_function}. |
| 465 Node* check = effect = | 468 Node* check = effect = |
| 466 graph()->NewNode(javascript()->StrictEqual(), target, target_function, | 469 graph()->NewNode(javascript()->StrictEqual(), target, target_function, |
| 467 context, effect, control); | 470 context, effect, control); |
| 468 Node* branch = | 471 Node* branch = |
| 469 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 472 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
| 470 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 473 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 471 Node* deoptimize = graph()->NewNode(common()->Deoptimize(), frame_state, | 474 Node* deoptimize = |
| 472 effect, if_false); | 475 graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
| 476 frame_state, effect, if_false); |
| 473 // TODO(bmeurer): This should be on the AdvancedReducer somehow. | 477 // TODO(bmeurer): This should be on the AdvancedReducer somehow. |
| 474 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 478 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
| 475 control = graph()->NewNode(common()->IfTrue(), branch); | 479 control = graph()->NewNode(common()->IfTrue(), branch); |
| 476 | 480 |
| 477 // Specialize the JSCallConstruct node to the {target_function}. | 481 // Specialize the JSCallConstruct node to the {target_function}. |
| 478 NodeProperties::ReplaceValueInput(node, target_function, 0); | 482 NodeProperties::ReplaceValueInput(node, target_function, 0); |
| 479 NodeProperties::ReplaceEffectInput(node, effect); | 483 NodeProperties::ReplaceEffectInput(node, effect); |
| 480 NodeProperties::ReplaceControlInput(node, control); | 484 NodeProperties::ReplaceControlInput(node, control); |
| 481 if (target == new_target) { | 485 if (target == new_target) { |
| 482 NodeProperties::ReplaceValueInput(node, target_function, arity + 1); | 486 NodeProperties::ReplaceValueInput(node, target_function, arity + 1); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 510 } | 514 } |
| 511 | 515 |
| 512 | 516 |
| 513 JSOperatorBuilder* JSCallReducer::javascript() const { | 517 JSOperatorBuilder* JSCallReducer::javascript() const { |
| 514 return jsgraph()->javascript(); | 518 return jsgraph()->javascript(); |
| 515 } | 519 } |
| 516 | 520 |
| 517 } // namespace compiler | 521 } // namespace compiler |
| 518 } // namespace internal | 522 } // namespace internal |
| 519 } // namespace v8 | 523 } // namespace v8 |
| OLD | NEW |