| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 11d52cfeffca53ccb79ba09dd5eb30d75f5d431b..0d0314dda328d26c78b9bf3f5cf6fcd2c38d69c2 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -574,147 +574,6 @@ void InstructionSelector::VisitControl(BasicBlock* block) {
|
| }
|
|
|
|
|
| -MachineType InstructionSelector::GetMachineType(Node* node) {
|
| - DCHECK_NOT_NULL(schedule()->block(node)); // should only use scheduled nodes.
|
| - switch (node->opcode()) {
|
| - case IrOpcode::kStart:
|
| - case IrOpcode::kLoop:
|
| - case IrOpcode::kEnd:
|
| - case IrOpcode::kBranch:
|
| - case IrOpcode::kIfTrue:
|
| - case IrOpcode::kIfFalse:
|
| - case IrOpcode::kSwitch:
|
| - case IrOpcode::kIfValue:
|
| - case IrOpcode::kIfDefault:
|
| - case IrOpcode::kEffectPhi:
|
| - case IrOpcode::kEffectSet:
|
| - case IrOpcode::kMerge:
|
| - // No code needed for these graph artifacts.
|
| - return kMachNone;
|
| - case IrOpcode::kFinish:
|
| - return kMachAnyTagged;
|
| - case IrOpcode::kParameter:
|
| - return linkage()->GetParameterType(OpParameter<int>(node));
|
| - case IrOpcode::kOsrValue:
|
| - return kMachAnyTagged;
|
| - case IrOpcode::kPhi:
|
| - return OpParameter<MachineType>(node);
|
| - case IrOpcode::kProjection:
|
| - // TODO(jarin) Really project from outputs.
|
| - return kMachAnyTagged;
|
| - case IrOpcode::kInt32Constant:
|
| - return kMachInt32;
|
| - case IrOpcode::kInt64Constant:
|
| - return kMachInt64;
|
| - case IrOpcode::kExternalConstant:
|
| - return kMachPtr;
|
| - case IrOpcode::kFloat64Constant:
|
| - return kMachFloat64;
|
| - case IrOpcode::kHeapConstant:
|
| - case IrOpcode::kNumberConstant:
|
| - return kMachAnyTagged;
|
| - case IrOpcode::kCall:
|
| - return kMachAnyTagged;
|
| - case IrOpcode::kFrameState:
|
| - case IrOpcode::kStateValues:
|
| - return kMachNone;
|
| - case IrOpcode::kLoad:
|
| - return OpParameter<LoadRepresentation>(node);
|
| - case IrOpcode::kStore:
|
| - return kMachNone;
|
| - case IrOpcode::kCheckedLoad:
|
| - return OpParameter<MachineType>(node);
|
| - case IrOpcode::kCheckedStore:
|
| - return kMachNone;
|
| - case IrOpcode::kWord32And:
|
| - case IrOpcode::kWord32Or:
|
| - case IrOpcode::kWord32Xor:
|
| - case IrOpcode::kWord32Shl:
|
| - case IrOpcode::kWord32Shr:
|
| - case IrOpcode::kWord32Sar:
|
| - case IrOpcode::kWord32Ror:
|
| - return kMachInt32;
|
| - case IrOpcode::kWord32Equal:
|
| - return kMachBool;
|
| - case IrOpcode::kWord64And:
|
| - case IrOpcode::kWord64Or:
|
| - case IrOpcode::kWord64Xor:
|
| - case IrOpcode::kWord64Shl:
|
| - case IrOpcode::kWord64Shr:
|
| - case IrOpcode::kWord64Sar:
|
| - case IrOpcode::kWord64Ror:
|
| - return kMachInt64;
|
| - case IrOpcode::kWord64Equal:
|
| - return kMachBool;
|
| - case IrOpcode::kInt32Add:
|
| - case IrOpcode::kInt32AddWithOverflow:
|
| - case IrOpcode::kInt32Sub:
|
| - case IrOpcode::kInt32SubWithOverflow:
|
| - case IrOpcode::kInt32Mul:
|
| - case IrOpcode::kInt32Div:
|
| - case IrOpcode::kInt32Mod:
|
| - return kMachInt32;
|
| - case IrOpcode::kInt32LessThan:
|
| - case IrOpcode::kInt32LessThanOrEqual:
|
| - case IrOpcode::kUint32LessThan:
|
| - case IrOpcode::kUint32LessThanOrEqual:
|
| - return kMachBool;
|
| - case IrOpcode::kInt64Add:
|
| - case IrOpcode::kInt64Sub:
|
| - case IrOpcode::kInt64Mul:
|
| - case IrOpcode::kInt64Div:
|
| - case IrOpcode::kInt64Mod:
|
| - return kMachInt64;
|
| - case IrOpcode::kInt64LessThan:
|
| - case IrOpcode::kInt64LessThanOrEqual:
|
| - return kMachBool;
|
| - case IrOpcode::kChangeFloat32ToFloat64:
|
| - case IrOpcode::kChangeInt32ToFloat64:
|
| - case IrOpcode::kChangeUint32ToFloat64:
|
| - return kMachFloat64;
|
| - case IrOpcode::kChangeFloat64ToInt32:
|
| - return kMachInt32;
|
| - case IrOpcode::kChangeFloat64ToUint32:
|
| - return kMachUint32;
|
| - case IrOpcode::kChangeInt32ToInt64:
|
| - return kMachInt64;
|
| - case IrOpcode::kChangeUint32ToUint64:
|
| - return kMachUint64;
|
| - case IrOpcode::kTruncateFloat64ToFloat32:
|
| - return kMachFloat32;
|
| - case IrOpcode::kTruncateFloat64ToInt32:
|
| - case IrOpcode::kTruncateInt64ToInt32:
|
| - return kMachInt32;
|
| - case IrOpcode::kFloat64Add:
|
| - case IrOpcode::kFloat64Sub:
|
| - case IrOpcode::kFloat64Mul:
|
| - case IrOpcode::kFloat64Div:
|
| - case IrOpcode::kFloat64Mod:
|
| - case IrOpcode::kFloat64Max:
|
| - case IrOpcode::kFloat64Min:
|
| - case IrOpcode::kFloat64Sqrt:
|
| - case IrOpcode::kFloat64RoundDown:
|
| - case IrOpcode::kFloat64RoundTruncate:
|
| - case IrOpcode::kFloat64RoundTiesAway:
|
| - return kMachFloat64;
|
| - case IrOpcode::kFloat64Equal:
|
| - case IrOpcode::kFloat64LessThan:
|
| - case IrOpcode::kFloat64LessThanOrEqual:
|
| - return kMachBool;
|
| - case IrOpcode::kFloat64ExtractLowWord32:
|
| - case IrOpcode::kFloat64ExtractHighWord32:
|
| - return kMachInt32;
|
| - case IrOpcode::kFloat64InsertLowWord32:
|
| - case IrOpcode::kFloat64InsertHighWord32:
|
| - return kMachFloat64;
|
| - default:
|
| - V8_Fatal(__FILE__, __LINE__, "Unexpected operator #%d:%s @ node #%d",
|
| - node->opcode(), node->op()->mnemonic(), node->id());
|
| - }
|
| - return kMachNone;
|
| -}
|
| -
|
| -
|
| void InstructionSelector::VisitNode(Node* node) {
|
| DCHECK_NOT_NULL(schedule()->block(node)); // should only use scheduled nodes.
|
| SourcePosition source_position = source_positions_->GetSourcePosition(node);
|
| @@ -1149,9 +1008,9 @@ FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
|
| Node* state) {
|
| DCHECK(state->opcode() == IrOpcode::kFrameState);
|
| DCHECK_EQ(5, state->InputCount());
|
| - DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(0)->opcode());
|
| - DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(1)->opcode());
|
| - DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(2)->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, state->InputAt(0)->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, state->InputAt(1)->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, state->InputAt(2)->opcode());
|
| FrameStateCallInfo state_info = OpParameter<FrameStateCallInfo>(state);
|
|
|
| int parameters =
|
| @@ -1197,9 +1056,9 @@ void InstructionSelector::AddFrameStateInputs(
|
| Node* stack = state->InputAt(2);
|
| Node* context = state->InputAt(3);
|
|
|
| - DCHECK_EQ(IrOpcode::kStateValues, parameters->op()->opcode());
|
| - DCHECK_EQ(IrOpcode::kStateValues, locals->op()->opcode());
|
| - DCHECK_EQ(IrOpcode::kStateValues, stack->op()->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, parameters->op()->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, locals->op()->opcode());
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, stack->op()->opcode());
|
|
|
| DCHECK_EQ(descriptor->parameters_count(),
|
| StateValuesAccess(parameters).size());
|
| @@ -1211,21 +1070,22 @@ void InstructionSelector::AddFrameStateInputs(
|
|
|
| OperandGenerator g(this);
|
| size_t value_index = 0;
|
| - for (Node* input_node : StateValuesAccess(parameters)) {
|
| - inputs->push_back(UseOrImmediate(&g, input_node));
|
| - descriptor->SetType(value_index++, GetMachineType(input_node));
|
| + for (StateValuesAccess::TypedNode input_node :
|
| + StateValuesAccess(parameters)) {
|
| + inputs->push_back(UseOrImmediate(&g, input_node.node));
|
| + descriptor->SetType(value_index++, input_node.type);
|
| }
|
| if (descriptor->HasContext()) {
|
| inputs->push_back(UseOrImmediate(&g, context));
|
| descriptor->SetType(value_index++, kMachAnyTagged);
|
| }
|
| - for (Node* input_node : StateValuesAccess(locals)) {
|
| - inputs->push_back(UseOrImmediate(&g, input_node));
|
| - descriptor->SetType(value_index++, GetMachineType(input_node));
|
| + for (StateValuesAccess::TypedNode input_node : StateValuesAccess(locals)) {
|
| + inputs->push_back(UseOrImmediate(&g, input_node.node));
|
| + descriptor->SetType(value_index++, input_node.type);
|
| }
|
| - for (Node* input_node : StateValuesAccess(stack)) {
|
| - inputs->push_back(UseOrImmediate(&g, input_node));
|
| - descriptor->SetType(value_index++, GetMachineType(input_node));
|
| + for (StateValuesAccess::TypedNode input_node : StateValuesAccess(stack)) {
|
| + inputs->push_back(UseOrImmediate(&g, input_node.node));
|
| + descriptor->SetType(value_index++, input_node.type);
|
| }
|
| DCHECK(value_index == descriptor->GetSize());
|
| }
|
|
|