| 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 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 } else { | 316 } else { |
| 317 Node* native_context = effect = graph()->NewNode( | 317 Node* native_context = effect = graph()->NewNode( |
| 318 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), | 318 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), |
| 319 context, context, effect); | 319 context, context, effect); |
| 320 array_function = effect = graph()->NewNode( | 320 array_function = effect = graph()->NewNode( |
| 321 javascript()->LoadContext(0, Context::ARRAY_FUNCTION_INDEX, true), | 321 javascript()->LoadContext(0, Context::ARRAY_FUNCTION_INDEX, true), |
| 322 native_context, native_context, effect); | 322 native_context, native_context, effect); |
| 323 } | 323 } |
| 324 | 324 |
| 325 // Check that the {target} is still the {array_function}. | 325 // Check that the {target} is still the {array_function}. |
| 326 Node* check = graph()->NewNode(javascript()->StrictEqual(), target, | 326 Node* check = graph()->NewNode( |
| 327 array_function, context); | 327 javascript()->StrictEqual(CompareOperationHints::Any()), target, |
| 328 array_function, context); |
| 328 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 329 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
| 329 frame_state, effect, control); | 330 frame_state, effect, control); |
| 330 | 331 |
| 331 // Turn the {node} into a {JSCreateArray} call. | 332 // Turn the {node} into a {JSCreateArray} call. |
| 332 NodeProperties::ReplaceValueInput(node, array_function, 0); | 333 NodeProperties::ReplaceValueInput(node, array_function, 0); |
| 333 NodeProperties::ReplaceEffectInput(node, effect); | 334 NodeProperties::ReplaceEffectInput(node, effect); |
| 334 NodeProperties::ReplaceControlInput(node, control); | 335 NodeProperties::ReplaceControlInput(node, control); |
| 335 return ReduceArrayConstructor(node); | 336 return ReduceArrayConstructor(node); |
| 336 } else if (feedback->IsWeakCell()) { | 337 } else if (feedback->IsWeakCell()) { |
| 337 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); | 338 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); |
| 338 if (cell->value()->IsJSFunction()) { | 339 if (cell->value()->IsJSFunction()) { |
| 339 Node* target_function = | 340 Node* target_function = |
| 340 jsgraph()->Constant(handle(cell->value(), isolate())); | 341 jsgraph()->Constant(handle(cell->value(), isolate())); |
| 341 | 342 |
| 342 // Check that the {target} is still the {target_function}. | 343 // Check that the {target} is still the {target_function}. |
| 343 Node* check = graph()->NewNode(javascript()->StrictEqual(), target, | 344 Node* check = graph()->NewNode( |
| 344 target_function, context); | 345 javascript()->StrictEqual(CompareOperationHints::Any()), target, |
| 346 target_function, context); |
| 345 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 347 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
| 346 frame_state, effect, control); | 348 frame_state, effect, control); |
| 347 | 349 |
| 348 // Specialize the JSCallFunction node to the {target_function}. | 350 // Specialize the JSCallFunction node to the {target_function}. |
| 349 NodeProperties::ReplaceValueInput(node, target_function, 0); | 351 NodeProperties::ReplaceValueInput(node, target_function, 0); |
| 350 NodeProperties::ReplaceEffectInput(node, effect); | 352 NodeProperties::ReplaceEffectInput(node, effect); |
| 351 NodeProperties::ReplaceControlInput(node, control); | 353 NodeProperties::ReplaceControlInput(node, control); |
| 352 | 354 |
| 353 // Try to further reduce the JSCallFunction {node}. | 355 // Try to further reduce the JSCallFunction {node}. |
| 354 Reduction const reduction = ReduceJSCallFunction(node); | 356 Reduction const reduction = ReduceJSCallFunction(node); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 } else { | 438 } else { |
| 437 Node* native_context = effect = graph()->NewNode( | 439 Node* native_context = effect = graph()->NewNode( |
| 438 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), | 440 javascript()->LoadContext(0, Context::NATIVE_CONTEXT_INDEX, true), |
| 439 context, context, effect); | 441 context, context, effect); |
| 440 array_function = effect = graph()->NewNode( | 442 array_function = effect = graph()->NewNode( |
| 441 javascript()->LoadContext(0, Context::ARRAY_FUNCTION_INDEX, true), | 443 javascript()->LoadContext(0, Context::ARRAY_FUNCTION_INDEX, true), |
| 442 native_context, native_context, effect); | 444 native_context, native_context, effect); |
| 443 } | 445 } |
| 444 | 446 |
| 445 // Check that the {target} is still the {array_function}. | 447 // Check that the {target} is still the {array_function}. |
| 446 Node* check = graph()->NewNode(javascript()->StrictEqual(), target, | 448 Node* check = graph()->NewNode( |
| 447 array_function, context); | 449 javascript()->StrictEqual(CompareOperationHints::Any()), target, |
| 450 array_function, context); |
| 448 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 451 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
| 449 frame_state, effect, control); | 452 frame_state, effect, control); |
| 450 | 453 |
| 451 // Turn the {node} into a {JSCreateArray} call. | 454 // Turn the {node} into a {JSCreateArray} call. |
| 452 NodeProperties::ReplaceEffectInput(node, effect); | 455 NodeProperties::ReplaceEffectInput(node, effect); |
| 453 NodeProperties::ReplaceControlInput(node, control); | 456 NodeProperties::ReplaceControlInput(node, control); |
| 454 for (int i = arity; i > 0; --i) { | 457 for (int i = arity; i > 0; --i) { |
| 455 NodeProperties::ReplaceValueInput( | 458 NodeProperties::ReplaceValueInput( |
| 456 node, NodeProperties::GetValueInput(node, i), i + 1); | 459 node, NodeProperties::GetValueInput(node, i), i + 1); |
| 457 } | 460 } |
| 458 NodeProperties::ReplaceValueInput(node, new_target, 1); | 461 NodeProperties::ReplaceValueInput(node, new_target, 1); |
| 459 NodeProperties::ChangeOp(node, javascript()->CreateArray(arity, site)); | 462 NodeProperties::ChangeOp(node, javascript()->CreateArray(arity, site)); |
| 460 return Changed(node); | 463 return Changed(node); |
| 461 } else if (feedback->IsWeakCell()) { | 464 } else if (feedback->IsWeakCell()) { |
| 462 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); | 465 Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback); |
| 463 if (cell->value()->IsJSFunction()) { | 466 if (cell->value()->IsJSFunction()) { |
| 464 Node* target_function = | 467 Node* target_function = |
| 465 jsgraph()->Constant(handle(cell->value(), isolate())); | 468 jsgraph()->Constant(handle(cell->value(), isolate())); |
| 466 | 469 |
| 467 // Check that the {target} is still the {target_function}. | 470 // Check that the {target} is still the {target_function}. |
| 468 Node* check = graph()->NewNode(javascript()->StrictEqual(), target, | 471 Node* check = graph()->NewNode( |
| 469 target_function, context); | 472 javascript()->StrictEqual(CompareOperationHints::Any()), target, |
| 473 target_function, context); |
| 470 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 474 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
| 471 frame_state, effect, control); | 475 frame_state, effect, control); |
| 472 | 476 |
| 473 // Specialize the JSCallConstruct node to the {target_function}. | 477 // Specialize the JSCallConstruct node to the {target_function}. |
| 474 NodeProperties::ReplaceValueInput(node, target_function, 0); | 478 NodeProperties::ReplaceValueInput(node, target_function, 0); |
| 475 NodeProperties::ReplaceEffectInput(node, effect); | 479 NodeProperties::ReplaceEffectInput(node, effect); |
| 476 NodeProperties::ReplaceControlInput(node, control); | 480 NodeProperties::ReplaceControlInput(node, control); |
| 477 if (target == new_target) { | 481 if (target == new_target) { |
| 478 NodeProperties::ReplaceValueInput(node, target_function, arity + 1); | 482 NodeProperties::ReplaceValueInput(node, target_function, arity + 1); |
| 479 } | 483 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 506 } | 510 } |
| 507 | 511 |
| 508 | 512 |
| 509 JSOperatorBuilder* JSCallReducer::javascript() const { | 513 JSOperatorBuilder* JSCallReducer::javascript() const { |
| 510 return jsgraph()->javascript(); | 514 return jsgraph()->javascript(); |
| 511 } | 515 } |
| 512 | 516 |
| 513 } // namespace compiler | 517 } // namespace compiler |
| 514 } // namespace internal | 518 } // namespace internal |
| 515 } // namespace v8 | 519 } // namespace v8 |
| OLD | NEW |