| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
| 10 #include "src/compiler/instruction-selector-impl.h" | 10 #include "src/compiler/instruction-selector-impl.h" |
| (...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 (buffer->frame_state_descriptor->type() == | 637 (buffer->frame_state_descriptor->type() == |
| 638 FrameStateType::kArgumentsAdaptor || | 638 FrameStateType::kArgumentsAdaptor || |
| 639 buffer->frame_state_descriptor->type() == | 639 buffer->frame_state_descriptor->type() == |
| 640 FrameStateType::kTailCallerFunction)) { | 640 FrameStateType::kTailCallerFunction)) { |
| 641 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); | 641 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); |
| 642 buffer->frame_state_descriptor = | 642 buffer->frame_state_descriptor = |
| 643 buffer->frame_state_descriptor->outer_state(); | 643 buffer->frame_state_descriptor->outer_state(); |
| 644 } | 644 } |
| 645 } | 645 } |
| 646 | 646 |
| 647 InstructionSequence::StateId state_id = | 647 int const state_id = sequence()->AddDeoptimizationEntry( |
| 648 sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor); | 648 buffer->frame_state_descriptor, DeoptimizeReason::kNoReason); |
| 649 buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt())); | 649 buffer->instruction_args.push_back(g.TempImmediate(state_id)); |
| 650 | 650 |
| 651 StateObjectDeduplicator deduplicator(instruction_zone()); | 651 StateObjectDeduplicator deduplicator(instruction_zone()); |
| 652 | 652 |
| 653 frame_state_entries = | 653 frame_state_entries = |
| 654 1 + AddInputsToFrameStateDescriptor( | 654 1 + AddInputsToFrameStateDescriptor( |
| 655 buffer->frame_state_descriptor, frame_state, &g, &deduplicator, | 655 buffer->frame_state_descriptor, frame_state, &g, &deduplicator, |
| 656 &buffer->instruction_args, FrameStateInputKind::kStackSlot, | 656 &buffer->instruction_args, FrameStateInputKind::kStackSlot, |
| 657 instruction_zone()); | 657 instruction_zone()); |
| 658 | 658 |
| 659 DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size()); | 659 DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size()); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 // is 2^31-1, so don't assume that it's non-zero below. | 826 // is 2^31-1, so don't assume that it's non-zero below. |
| 827 sw.value_range = 1u + bit_cast<uint32_t>(sw.max_value) - | 827 sw.value_range = 1u + bit_cast<uint32_t>(sw.max_value) - |
| 828 bit_cast<uint32_t>(sw.min_value); | 828 bit_cast<uint32_t>(sw.min_value); |
| 829 return VisitSwitch(input, sw); | 829 return VisitSwitch(input, sw); |
| 830 } | 830 } |
| 831 case BasicBlock::kReturn: { | 831 case BasicBlock::kReturn: { |
| 832 DCHECK_EQ(IrOpcode::kReturn, input->opcode()); | 832 DCHECK_EQ(IrOpcode::kReturn, input->opcode()); |
| 833 return VisitReturn(input); | 833 return VisitReturn(input); |
| 834 } | 834 } |
| 835 case BasicBlock::kDeoptimize: { | 835 case BasicBlock::kDeoptimize: { |
| 836 DeoptimizeKind kind = DeoptimizeKindOf(input->op()); | 836 DeoptimizeParameters p = DeoptimizeParametersOf(input->op()); |
| 837 Node* value = input->InputAt(0); | 837 Node* value = input->InputAt(0); |
| 838 return VisitDeoptimize(kind, value); | 838 return VisitDeoptimize(p.kind(), p.reason(), value); |
| 839 } | 839 } |
| 840 case BasicBlock::kThrow: | 840 case BasicBlock::kThrow: |
| 841 DCHECK_EQ(IrOpcode::kThrow, input->opcode()); | 841 DCHECK_EQ(IrOpcode::kThrow, input->opcode()); |
| 842 return VisitThrow(input->InputAt(0)); | 842 return VisitThrow(input->InputAt(0)); |
| 843 case BasicBlock::kNone: { | 843 case BasicBlock::kNone: { |
| 844 // Exit block doesn't have control. | 844 // Exit block doesn't have control. |
| 845 DCHECK_NULL(input); | 845 DCHECK_NULL(input); |
| 846 break; | 846 break; |
| 847 } | 847 } |
| 848 default: | 848 default: |
| (...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 const int ret_count = ret->op()->ValueInputCount(); | 1876 const int ret_count = ret->op()->ValueInputCount(); |
| 1877 auto value_locations = zone()->NewArray<InstructionOperand>(ret_count); | 1877 auto value_locations = zone()->NewArray<InstructionOperand>(ret_count); |
| 1878 for (int i = 0; i < ret_count; ++i) { | 1878 for (int i = 0; i < ret_count; ++i) { |
| 1879 value_locations[i] = | 1879 value_locations[i] = |
| 1880 g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i)); | 1880 g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i)); |
| 1881 } | 1881 } |
| 1882 Emit(kArchRet, 0, nullptr, ret_count, value_locations); | 1882 Emit(kArchRet, 0, nullptr, ret_count, value_locations); |
| 1883 } | 1883 } |
| 1884 } | 1884 } |
| 1885 | 1885 |
| 1886 Instruction* InstructionSelector::EmitDeoptimize(InstructionCode opcode, | 1886 Instruction* InstructionSelector::EmitDeoptimize( |
| 1887 InstructionOperand output, | 1887 InstructionCode opcode, InstructionOperand output, InstructionOperand a, |
| 1888 InstructionOperand a, | 1888 InstructionOperand b, DeoptimizeReason reason, Node* frame_state) { |
| 1889 InstructionOperand b, | |
| 1890 Node* frame_state) { | |
| 1891 size_t output_count = output.IsInvalid() ? 0 : 1; | 1889 size_t output_count = output.IsInvalid() ? 0 : 1; |
| 1892 InstructionOperand inputs[] = {a, b}; | 1890 InstructionOperand inputs[] = {a, b}; |
| 1893 size_t input_count = arraysize(inputs); | 1891 size_t input_count = arraysize(inputs); |
| 1894 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, | 1892 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, |
| 1895 frame_state); | 1893 reason, frame_state); |
| 1896 } | 1894 } |
| 1897 | 1895 |
| 1898 Instruction* InstructionSelector::EmitDeoptimize( | 1896 Instruction* InstructionSelector::EmitDeoptimize( |
| 1899 InstructionCode opcode, size_t output_count, InstructionOperand* outputs, | 1897 InstructionCode opcode, size_t output_count, InstructionOperand* outputs, |
| 1900 size_t input_count, InstructionOperand* inputs, Node* frame_state) { | 1898 size_t input_count, InstructionOperand* inputs, DeoptimizeReason reason, |
| 1899 Node* frame_state) { |
| 1901 OperandGenerator g(this); | 1900 OperandGenerator g(this); |
| 1902 FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state); | 1901 FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state); |
| 1903 InstructionOperandVector args(instruction_zone()); | 1902 InstructionOperandVector args(instruction_zone()); |
| 1904 args.reserve(input_count + 1 + descriptor->GetTotalSize()); | 1903 args.reserve(input_count + 1 + descriptor->GetTotalSize()); |
| 1905 for (size_t i = 0; i < input_count; ++i) { | 1904 for (size_t i = 0; i < input_count; ++i) { |
| 1906 args.push_back(inputs[i]); | 1905 args.push_back(inputs[i]); |
| 1907 } | 1906 } |
| 1908 opcode |= MiscField::encode(static_cast<int>(input_count)); | 1907 opcode |= MiscField::encode(static_cast<int>(input_count)); |
| 1909 InstructionSequence::StateId const state_id = | 1908 int const state_id = sequence()->AddDeoptimizationEntry(descriptor, reason); |
| 1910 sequence()->AddFrameStateDescriptor(descriptor); | 1909 args.push_back(g.TempImmediate(state_id)); |
| 1911 args.push_back(g.TempImmediate(state_id.ToInt())); | |
| 1912 StateObjectDeduplicator deduplicator(instruction_zone()); | 1910 StateObjectDeduplicator deduplicator(instruction_zone()); |
| 1913 AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator, | 1911 AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator, |
| 1914 &args, FrameStateInputKind::kAny, | 1912 &args, FrameStateInputKind::kAny, |
| 1915 instruction_zone()); | 1913 instruction_zone()); |
| 1916 return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0, | 1914 return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0, |
| 1917 nullptr); | 1915 nullptr); |
| 1918 } | 1916 } |
| 1919 | 1917 |
| 1920 void InstructionSelector::EmitIdentity(Node* node) { | 1918 void InstructionSelector::EmitIdentity(Node* node) { |
| 1921 OperandGenerator g(this); | 1919 OperandGenerator g(this); |
| 1922 Node* value = node->InputAt(0); | 1920 Node* value = node->InputAt(0); |
| 1923 Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); | 1921 Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); |
| 1924 } | 1922 } |
| 1925 | 1923 |
| 1926 void InstructionSelector::VisitDeoptimize(DeoptimizeKind kind, Node* value) { | 1924 void InstructionSelector::VisitDeoptimize(DeoptimizeKind kind, |
| 1925 DeoptimizeReason reason, |
| 1926 Node* value) { |
| 1927 InstructionCode opcode = kArchDeoptimize; | 1927 InstructionCode opcode = kArchDeoptimize; |
| 1928 switch (kind) { | 1928 switch (kind) { |
| 1929 case DeoptimizeKind::kEager: | 1929 case DeoptimizeKind::kEager: |
| 1930 opcode |= MiscField::encode(Deoptimizer::EAGER); | 1930 opcode |= MiscField::encode(Deoptimizer::EAGER); |
| 1931 break; | 1931 break; |
| 1932 case DeoptimizeKind::kSoft: | 1932 case DeoptimizeKind::kSoft: |
| 1933 opcode |= MiscField::encode(Deoptimizer::SOFT); | 1933 opcode |= MiscField::encode(Deoptimizer::SOFT); |
| 1934 break; | 1934 break; |
| 1935 } | 1935 } |
| 1936 EmitDeoptimize(opcode, 0, nullptr, 0, nullptr, value); | 1936 EmitDeoptimize(opcode, 0, nullptr, 0, nullptr, reason, value); |
| 1937 } | 1937 } |
| 1938 | 1938 |
| 1939 | 1939 |
| 1940 void InstructionSelector::VisitThrow(Node* value) { | 1940 void InstructionSelector::VisitThrow(Node* value) { |
| 1941 OperandGenerator g(this); | 1941 OperandGenerator g(this); |
| 1942 Emit(kArchThrowTerminator, g.NoOutput()); | 1942 Emit(kArchThrowTerminator, g.NoOutput()); |
| 1943 } | 1943 } |
| 1944 | 1944 |
| 1945 void InstructionSelector::VisitDebugBreak(Node* node) { | 1945 void InstructionSelector::VisitDebugBreak(Node* node) { |
| 1946 OperandGenerator g(this); | 1946 OperandGenerator g(this); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 return new (instruction_zone()) FrameStateDescriptor( | 1988 return new (instruction_zone()) FrameStateDescriptor( |
| 1989 instruction_zone(), state_info.type(), state_info.bailout_id(), | 1989 instruction_zone(), state_info.type(), state_info.bailout_id(), |
| 1990 state_info.state_combine(), parameters, locals, stack, | 1990 state_info.state_combine(), parameters, locals, stack, |
| 1991 state_info.shared_info(), outer_state); | 1991 state_info.shared_info(), outer_state); |
| 1992 } | 1992 } |
| 1993 | 1993 |
| 1994 | 1994 |
| 1995 } // namespace compiler | 1995 } // namespace compiler |
| 1996 } // namespace internal | 1996 } // namespace internal |
| 1997 } // namespace v8 | 1997 } // namespace v8 |
| OLD | NEW |