| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 05a86c85002360779baa2775c1ea8181af192e7d..65054e14d0c82bc387d546a60c99b8a7fad26220 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -252,17 +252,8 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
| if (buffer->descriptor->ReturnCount() == 1) {
|
| buffer->output_nodes[0] = call;
|
| } else {
|
| - // Iterate over all uses of {call} and collect the projections into the
|
| - // {result} buffer.
|
| - for (UseIter i = call->uses().begin(); i != call->uses().end(); ++i) {
|
| - if ((*i)->opcode() == IrOpcode::kProjection) {
|
| - int index = OpParameter<int32_t>(*i);
|
| - ASSERT_GE(index, 0);
|
| - ASSERT_LT(index, buffer->descriptor->ReturnCount());
|
| - ASSERT_EQ(NULL, buffer->output_nodes[index]);
|
| - buffer->output_nodes[index] = *i;
|
| - }
|
| - }
|
| + call->CollectProjections(buffer->descriptor->ReturnCount(),
|
| + buffer->output_nodes);
|
| }
|
|
|
| // Filter out the outputs that aren't live because no projection uses them.
|
| @@ -447,13 +438,10 @@ void InstructionSelector::VisitNode(Node* node) {
|
| case IrOpcode::kIfFalse:
|
| case IrOpcode::kEffectPhi:
|
| case IrOpcode::kMerge:
|
| - case IrOpcode::kProjection:
|
| case IrOpcode::kLazyDeoptimization:
|
| case IrOpcode::kContinuation:
|
| // No code needed for these graph artifacts.
|
| return;
|
| - case IrOpcode::kPhi:
|
| - return VisitPhi(node);
|
| case IrOpcode::kParameter: {
|
| int index = OpParameter<int>(node);
|
| MachineRepresentation rep = linkage()
|
| @@ -463,6 +451,10 @@ void InstructionSelector::VisitNode(Node* node) {
|
| MarkAsRepresentation(rep, node);
|
| return VisitParameter(node);
|
| }
|
| + case IrOpcode::kPhi:
|
| + return VisitPhi(node);
|
| + case IrOpcode::kProjection:
|
| + return VisitProjection(node);
|
| case IrOpcode::kInt32Constant:
|
| case IrOpcode::kInt64Constant:
|
| case IrOpcode::kExternalConstant:
|
| @@ -515,6 +507,8 @@ void InstructionSelector::VisitNode(Node* node) {
|
| return VisitWord64Equal(node);
|
| case IrOpcode::kInt32Add:
|
| return VisitInt32Add(node);
|
| + case IrOpcode::kInt32AddWithOverflow:
|
| + return VisitInt32AddWithOverflow(node);
|
| case IrOpcode::kInt32Sub:
|
| return VisitInt32Sub(node);
|
| case IrOpcode::kInt32Mul:
|
| @@ -736,6 +730,13 @@ void InstructionSelector::VisitWord64Compare(Node* node,
|
| #endif // V8_TARGET_ARCH_32_BIT || !V8_TURBOFAN_TARGET
|
|
|
|
|
| +void InstructionSelector::VisitParameter(Node* node) {
|
| + OperandGenerator g(this);
|
| + Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetParameterLocation(
|
| + OpParameter<int>(node))));
|
| +}
|
| +
|
| +
|
| void InstructionSelector::VisitPhi(Node* node) {
|
| // TODO(bmeurer): Emit a PhiInstruction here.
|
| for (InputIter i = node->inputs().begin(); i != node->inputs().end(); ++i) {
|
| @@ -744,10 +745,10 @@ void InstructionSelector::VisitPhi(Node* node) {
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitParameter(Node* node) {
|
| - OperandGenerator g(this);
|
| - Emit(kArchNop, g.DefineAsLocation(node, linkage()->GetParameterLocation(
|
| - OpParameter<int>(node))));
|
| +void InstructionSelector::VisitProjection(Node* node) {
|
| + for (InputIter i = node->inputs().begin(); i != node->inputs().end(); ++i) {
|
| + MarkAsUsed(*i);
|
| + }
|
| }
|
|
|
|
|
|
|