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/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compiler/access-builder.h" | 9 #include "src/compiler/access-builder.h" |
10 #include "src/compiler/compiler-source-position-table.h" | 10 #include "src/compiler/compiler-source-position-table.h" |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 op, parameters_state_values_, registers_state_values, | 431 op, parameters_state_values_, registers_state_values, |
432 accumulator_state_values, Context(), builder()->GetFunctionClosure(), | 432 accumulator_state_values, Context(), builder()->GetFunctionClosure(), |
433 builder()->graph()->start()); | 433 builder()->graph()->start()); |
434 | 434 |
435 return result; | 435 return result; |
436 } | 436 } |
437 | 437 |
438 BytecodeGraphBuilder::BytecodeGraphBuilder( | 438 BytecodeGraphBuilder::BytecodeGraphBuilder( |
439 Zone* local_zone, Handle<SharedFunctionInfo> shared_info, | 439 Zone* local_zone, Handle<SharedFunctionInfo> shared_info, |
440 Handle<FeedbackVector> feedback_vector, BailoutId osr_ast_id, | 440 Handle<FeedbackVector> feedback_vector, BailoutId osr_ast_id, |
441 JSGraph* jsgraph, float invocation_frequency, | 441 JSGraph* jsgraph, CallFrequency invocation_frequency, |
442 SourcePositionTable* source_positions, int inlining_id, | 442 SourcePositionTable* source_positions, int inlining_id, |
443 JSTypeHintLowering::Flags flags) | 443 JSTypeHintLowering::Flags flags) |
444 : local_zone_(local_zone), | 444 : local_zone_(local_zone), |
445 jsgraph_(jsgraph), | 445 jsgraph_(jsgraph), |
446 invocation_frequency_(invocation_frequency), | 446 invocation_frequency_(invocation_frequency), |
447 bytecode_array_(handle(shared_info->bytecode_array())), | 447 bytecode_array_(handle(shared_info->bytecode_array())), |
448 exception_handler_table_( | 448 exception_handler_table_( |
449 handle(HandlerTable::cast(bytecode_array()->handler_table()))), | 449 handle(HandlerTable::cast(bytecode_array()->handler_table()))), |
450 feedback_vector_(feedback_vector), | 450 feedback_vector_(feedback_vector), |
451 type_hint_lowering_(jsgraph, feedback_vector, flags), | 451 type_hint_lowering_(jsgraph, feedback_vector, flags), |
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1365 DCHECK_EQ(interpreter::Bytecodes::GetReceiverMode( | 1365 DCHECK_EQ(interpreter::Bytecodes::GetReceiverMode( |
1366 bytecode_iterator().current_bytecode()), | 1366 bytecode_iterator().current_bytecode()), |
1367 receiver_mode); | 1367 receiver_mode); |
1368 PrepareEagerCheckpoint(); | 1368 PrepareEagerCheckpoint(); |
1369 | 1369 |
1370 // Slot index of 0 is used indicate no feedback slot is available. Assert | 1370 // Slot index of 0 is used indicate no feedback slot is available. Assert |
1371 // the assumption that slot index 0 is never a valid feedback slot. | 1371 // the assumption that slot index 0 is never a valid feedback slot. |
1372 STATIC_ASSERT(FeedbackVector::kReservedIndexCount > 0); | 1372 STATIC_ASSERT(FeedbackVector::kReservedIndexCount > 0); |
1373 VectorSlotPair feedback = CreateVectorSlotPair(slot_id); | 1373 VectorSlotPair feedback = CreateVectorSlotPair(slot_id); |
1374 | 1374 |
1375 float const frequency = ComputeCallFrequency(slot_id); | 1375 CallFrequency frequency = ComputeCallFrequency(slot_id); |
1376 const Operator* call = javascript()->Call(arg_count, frequency, feedback, | 1376 const Operator* call = javascript()->Call(arg_count, frequency, feedback, |
1377 receiver_mode, tail_call_mode); | 1377 receiver_mode, tail_call_mode); |
1378 Node* value = ProcessCallArguments(call, args, static_cast<int>(arg_count)); | 1378 Node* value = ProcessCallArguments(call, args, static_cast<int>(arg_count)); |
1379 environment()->BindAccumulator(value, Environment::kAttachFrameState); | 1379 environment()->BindAccumulator(value, Environment::kAttachFrameState); |
1380 } | 1380 } |
1381 | 1381 |
1382 void BytecodeGraphBuilder::BuildCallVarArgs(TailCallMode tail_call_mode, | 1382 void BytecodeGraphBuilder::BuildCallVarArgs(TailCallMode tail_call_mode, |
1383 ConvertReceiverMode receiver_mode) { | 1383 ConvertReceiverMode receiver_mode) { |
1384 DCHECK_EQ(interpreter::Bytecodes::GetReceiverMode( | 1384 DCHECK_EQ(interpreter::Bytecodes::GetReceiverMode( |
1385 bytecode_iterator().current_bytecode()), | 1385 bytecode_iterator().current_bytecode()), |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 size_t reg_count = bytecode_iterator().GetRegisterCountOperand(2); | 1647 size_t reg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1648 // Slot index of 0 is used indicate no feedback slot is available. Assert | 1648 // Slot index of 0 is used indicate no feedback slot is available. Assert |
1649 // the assumption that slot index 0 is never a valid feedback slot. | 1649 // the assumption that slot index 0 is never a valid feedback slot. |
1650 STATIC_ASSERT(FeedbackVector::kReservedIndexCount > 0); | 1650 STATIC_ASSERT(FeedbackVector::kReservedIndexCount > 0); |
1651 int const slot_id = bytecode_iterator().GetIndexOperand(3); | 1651 int const slot_id = bytecode_iterator().GetIndexOperand(3); |
1652 VectorSlotPair feedback = CreateVectorSlotPair(slot_id); | 1652 VectorSlotPair feedback = CreateVectorSlotPair(slot_id); |
1653 | 1653 |
1654 Node* new_target = environment()->LookupAccumulator(); | 1654 Node* new_target = environment()->LookupAccumulator(); |
1655 Node* callee = environment()->LookupRegister(callee_reg); | 1655 Node* callee = environment()->LookupRegister(callee_reg); |
1656 | 1656 |
1657 float const frequency = ComputeCallFrequency(slot_id); | 1657 CallFrequency frequency = ComputeCallFrequency(slot_id); |
1658 const Operator* call = javascript()->Construct( | 1658 const Operator* call = javascript()->Construct( |
1659 static_cast<uint32_t>(reg_count + 2), frequency, feedback); | 1659 static_cast<uint32_t>(reg_count + 2), frequency, feedback); |
1660 Node* value = | 1660 Node* value = |
1661 ProcessConstructArguments(call, callee, new_target, receiver, reg_count); | 1661 ProcessConstructArguments(call, callee, new_target, receiver, reg_count); |
1662 environment()->BindAccumulator(value, Environment::kAttachFrameState); | 1662 environment()->BindAccumulator(value, Environment::kAttachFrameState); |
1663 } | 1663 } |
1664 | 1664 |
1665 void BytecodeGraphBuilder::VisitThrow() { | 1665 void BytecodeGraphBuilder::VisitThrow() { |
1666 BuildLoopExitsForFunctionExit(); | 1666 BuildLoopExitsForFunctionExit(); |
1667 Node* value = environment()->LookupAccumulator(); | 1667 Node* value = environment()->LookupAccumulator(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 if (slot_index == 0) { | 1715 if (slot_index == 0) { |
1716 return CompareOperationHint::kAny; | 1716 return CompareOperationHint::kAny; |
1717 } | 1717 } |
1718 FeedbackSlot slot = | 1718 FeedbackSlot slot = |
1719 feedback_vector()->ToSlot(bytecode_iterator().GetIndexOperand(1)); | 1719 feedback_vector()->ToSlot(bytecode_iterator().GetIndexOperand(1)); |
1720 DCHECK_EQ(FeedbackSlotKind::kCompareOp, feedback_vector()->GetKind(slot)); | 1720 DCHECK_EQ(FeedbackSlotKind::kCompareOp, feedback_vector()->GetKind(slot)); |
1721 CompareICNexus nexus(feedback_vector(), slot); | 1721 CompareICNexus nexus(feedback_vector(), slot); |
1722 return nexus.GetCompareOperationFeedback(); | 1722 return nexus.GetCompareOperationFeedback(); |
1723 } | 1723 } |
1724 | 1724 |
1725 float BytecodeGraphBuilder::ComputeCallFrequency(int slot_id) const { | 1725 CallFrequency BytecodeGraphBuilder::ComputeCallFrequency(int slot_id) const { |
| 1726 if (invocation_frequency_.IsUnknown()) return CallFrequency(); |
1726 CallICNexus nexus(feedback_vector(), feedback_vector()->ToSlot(slot_id)); | 1727 CallICNexus nexus(feedback_vector(), feedback_vector()->ToSlot(slot_id)); |
1727 return nexus.ComputeCallFrequency() * invocation_frequency_; | 1728 return CallFrequency(nexus.ComputeCallFrequency() * |
| 1729 invocation_frequency_.value()); |
1728 } | 1730 } |
1729 | 1731 |
1730 void BytecodeGraphBuilder::VisitAdd() { | 1732 void BytecodeGraphBuilder::VisitAdd() { |
1731 BuildBinaryOp( | 1733 BuildBinaryOp( |
1732 javascript()->Add(GetBinaryOperationHint(kBinaryOperationHintIndex))); | 1734 javascript()->Add(GetBinaryOperationHint(kBinaryOperationHintIndex))); |
1733 } | 1735 } |
1734 | 1736 |
1735 void BytecodeGraphBuilder::VisitSub() { | 1737 void BytecodeGraphBuilder::VisitSub() { |
1736 BuildBinaryOp(javascript()->Subtract()); | 1738 BuildBinaryOp(javascript()->Subtract()); |
1737 } | 1739 } |
(...skipping 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2801 it->source_position().ScriptOffset(), start_position_.InliningId())); | 2803 it->source_position().ScriptOffset(), start_position_.InliningId())); |
2802 it->Advance(); | 2804 it->Advance(); |
2803 } else { | 2805 } else { |
2804 DCHECK_GT(it->code_offset(), offset); | 2806 DCHECK_GT(it->code_offset(), offset); |
2805 } | 2807 } |
2806 } | 2808 } |
2807 | 2809 |
2808 } // namespace compiler | 2810 } // namespace compiler |
2809 } // namespace internal | 2811 } // namespace internal |
2810 } // namespace v8 | 2812 } // namespace v8 |
OLD | NEW |