| 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 case Runtime::kInlineStringGetLength: | 76 case Runtime::kInlineStringGetLength: |
| 77 return ReduceStringGetLength(node); | 77 return ReduceStringGetLength(node); |
| 78 case Runtime::kInlineValueOf: | 78 case Runtime::kInlineValueOf: |
| 79 return ReduceValueOf(node); | 79 return ReduceValueOf(node); |
| 80 case Runtime::kInlineIsMinusZero: | 80 case Runtime::kInlineIsMinusZero: |
| 81 return ReduceIsMinusZero(node); | 81 return ReduceIsMinusZero(node); |
| 82 case Runtime::kInlineFixedArrayGet: | 82 case Runtime::kInlineFixedArrayGet: |
| 83 return ReduceFixedArrayGet(node); | 83 return ReduceFixedArrayGet(node); |
| 84 case Runtime::kInlineFixedArraySet: | 84 case Runtime::kInlineFixedArraySet: |
| 85 return ReduceFixedArraySet(node); | 85 return ReduceFixedArraySet(node); |
| 86 case Runtime::kInlineGetTypeFeedbackVector: | |
| 87 return ReduceGetTypeFeedbackVector(node); | |
| 88 case Runtime::kInlineGetCallerJSFunction: | |
| 89 return ReduceGetCallerJSFunction(node); | |
| 90 case Runtime::kInlineToInteger: | 86 case Runtime::kInlineToInteger: |
| 91 return ReduceToInteger(node); | 87 return ReduceToInteger(node); |
| 92 case Runtime::kInlineToLength: | 88 case Runtime::kInlineToLength: |
| 93 return ReduceToLength(node); | 89 return ReduceToLength(node); |
| 94 case Runtime::kInlineToName: | 90 case Runtime::kInlineToName: |
| 95 return ReduceToName(node); | 91 return ReduceToName(node); |
| 96 case Runtime::kInlineToNumber: | 92 case Runtime::kInlineToNumber: |
| 97 return ReduceToNumber(node); | 93 return ReduceToNumber(node); |
| 98 case Runtime::kInlineToObject: | 94 case Runtime::kInlineToObject: |
| 99 return ReduceToObject(node); | 95 return ReduceToObject(node); |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 Node* effect = NodeProperties::GetEffectInput(node); | 448 Node* effect = NodeProperties::GetEffectInput(node); |
| 453 Node* control = NodeProperties::GetControlInput(node); | 449 Node* control = NodeProperties::GetControlInput(node); |
| 454 Node* store = (graph()->NewNode( | 450 Node* store = (graph()->NewNode( |
| 455 simplified()->StoreElement(AccessBuilder::ForFixedArrayElement()), base, | 451 simplified()->StoreElement(AccessBuilder::ForFixedArrayElement()), base, |
| 456 index, value, effect, control)); | 452 index, value, effect, control)); |
| 457 ReplaceWithValue(node, value, store); | 453 ReplaceWithValue(node, value, store); |
| 458 return Changed(store); | 454 return Changed(store); |
| 459 } | 455 } |
| 460 | 456 |
| 461 | 457 |
| 462 Reduction JSIntrinsicLowering::ReduceGetTypeFeedbackVector(Node* node) { | |
| 463 Node* func = node->InputAt(0); | |
| 464 Node* effect = NodeProperties::GetEffectInput(node); | |
| 465 Node* control = NodeProperties::GetControlInput(node); | |
| 466 FieldAccess access = AccessBuilder::ForJSFunctionSharedFunctionInfo(); | |
| 467 Node* load = | |
| 468 graph()->NewNode(simplified()->LoadField(access), func, effect, control); | |
| 469 access = AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector(); | |
| 470 return Change(node, simplified()->LoadField(access), load, load, control); | |
| 471 } | |
| 472 | |
| 473 | |
| 474 Reduction JSIntrinsicLowering::ReduceGetCallerJSFunction(Node* node) { | |
| 475 Node* effect = NodeProperties::GetEffectInput(node); | |
| 476 Node* control = NodeProperties::GetControlInput(node); | |
| 477 | |
| 478 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 0); | |
| 479 Node* outer_frame = frame_state->InputAt(kFrameStateOuterStateInput); | |
| 480 if (outer_frame->opcode() == IrOpcode::kFrameState) { | |
| 481 // Use the runtime implementation to throw the appropriate error if the | |
| 482 // containing function is inlined. | |
| 483 return NoChange(); | |
| 484 } | |
| 485 | |
| 486 // TODO(danno): This implementation forces intrinsic lowering to happen after | |
| 487 // inlining, which is fine for now, but eventually the frame-querying logic | |
| 488 // probably should go later, e.g. in instruction selection, so that there is | |
| 489 // no phase-ordering dependency. | |
| 490 FieldAccess access = AccessBuilder::ForFrameCallerFramePtr(); | |
| 491 Node* fp = graph()->NewNode(machine()->LoadFramePointer()); | |
| 492 Node* next_fp = | |
| 493 graph()->NewNode(simplified()->LoadField(access), fp, effect, control); | |
| 494 return Change(node, simplified()->LoadField(AccessBuilder::ForFrameMarker()), | |
| 495 next_fp, effect, control); | |
| 496 } | |
| 497 | |
| 498 | |
| 499 Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) { | 458 Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) { |
| 500 if (mode() != kDeoptimizationEnabled) return NoChange(); | 459 if (mode() != kDeoptimizationEnabled) return NoChange(); |
| 501 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); | 460 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); |
| 502 Node* const effect = NodeProperties::GetEffectInput(node); | 461 Node* const effect = NodeProperties::GetEffectInput(node); |
| 503 Node* const control = NodeProperties::GetControlInput(node); | 462 Node* const control = NodeProperties::GetControlInput(node); |
| 504 | 463 |
| 505 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. | 464 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. |
| 506 Node* deoptimize = | 465 Node* deoptimize = |
| 507 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); | 466 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); |
| 508 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 467 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 } | 643 } |
| 685 | 644 |
| 686 | 645 |
| 687 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 646 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { |
| 688 return jsgraph()->simplified(); | 647 return jsgraph()->simplified(); |
| 689 } | 648 } |
| 690 | 649 |
| 691 } // namespace compiler | 650 } // namespace compiler |
| 692 } // namespace internal | 651 } // namespace internal |
| 693 } // namespace v8 | 652 } // namespace v8 |
| OLD | NEW |