Chromium Code Reviews| Index: src/compiler/instruction-selector.cc |
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
| index ec34fe8c09aeef0fbf365601e1a43ec80aadea6b..0f046d681be8c96118bca4d91621b315fcf77dae 100644 |
| --- a/src/compiler/instruction-selector.cc |
| +++ b/src/compiler/instruction-selector.cc |
| @@ -344,9 +344,9 @@ namespace { |
| enum class FrameStateInputKind { kAny, kStackSlot }; |
| - |
| InstructionOperand OperandForDeopt(OperandGenerator* g, Node* input, |
| - FrameStateInputKind kind) { |
| + FrameStateInputKind kind, |
| + MachineRepresentation rep) { |
| switch (input->opcode()) { |
| case IrOpcode::kInt32Constant: |
| case IrOpcode::kNumberConstant: |
| @@ -358,11 +358,15 @@ InstructionOperand OperandForDeopt(OperandGenerator* g, Node* input, |
| UNREACHABLE(); |
| break; |
| default: |
| - switch (kind) { |
| - case FrameStateInputKind::kStackSlot: |
| - return g->UseUniqueSlot(input); |
| - case FrameStateInputKind::kAny: |
| - return g->UseAny(input); |
| + if (rep == MachineRepresentation::kNone) { |
| + return g->TempImmediate(FrameStateDescriptor::kImpossibleValue); |
| + } else { |
| + switch (kind) { |
| + case FrameStateInputKind::kStackSlot: |
| + return g->UseUniqueSlot(input); |
| + case FrameStateInputKind::kAny: |
| + return g->UseAny(input); |
| + } |
| } |
| } |
| UNREACHABLE(); |
| @@ -428,7 +432,7 @@ size_t AddOperandToStateValueDescriptor(StateValueDescriptor* descriptor, |
| break; |
| } |
| default: { |
| - inputs->push_back(OperandForDeopt(g, input, kind)); |
| + inputs->push_back(OperandForDeopt(g, input, kind, type.representation())); |
| descriptor->fields().push_back(StateValueDescriptor::Plain(zone, type)); |
| return 1; |
| } |
| @@ -885,6 +889,7 @@ void InstructionSelector::VisitNode(Node* node) { |
| return MarkAsReference(node), VisitOsrValue(node); |
| case IrOpcode::kPhi: { |
| MachineRepresentation rep = PhiRepresentationOf(node->op()); |
| + if (rep == MachineRepresentation::kNone) return; |
| MarkAsRepresentation(rep, node); |
| return VisitPhi(node); |
| } |
| @@ -1048,6 +1053,19 @@ void InstructionSelector::VisitNode(Node* node) { |
| return MarkAsWord32(node), VisitChangeFloat64ToInt32(node); |
| case IrOpcode::kChangeFloat64ToUint32: |
| return MarkAsWord32(node), VisitChangeFloat64ToUint32(node); |
| + case IrOpcode::kImpossibleToWord32: |
| + return MarkAsWord32(node), VisitImpossibleToWord32(node); |
| + case IrOpcode::kImpossibleToWord64: |
| + return MarkAsWord64(node), VisitImpossibleToWord64(node); |
| + case IrOpcode::kImpossibleToFloat32: |
| + return MarkAsFloat32(node), VisitImpossibleToFloat32(node); |
| + case IrOpcode::kImpossibleToFloat64: |
| + return MarkAsFloat64(node), VisitImpossibleToFloat64(node); |
| + case IrOpcode::kImpossibleToTagged: |
| + MarkAsRepresentation(MachineType::PointerRepresentation(), node); |
| + return VisitImpossibleToTagged(node); |
| + case IrOpcode::kImpossibleToBit: |
| + return MarkAsWord32(node), VisitImpossibleToBit(node); |
| case IrOpcode::kFloat64SilenceNaN: |
| MarkAsFloat64(node); |
| if (CanProduceSignalingNaN(node->InputAt(0))) { |
| @@ -1277,13 +1295,47 @@ void InstructionSelector::VisitNode(Node* node) { |
| } |
| } |
| +void InstructionSelector::VisitImpossibleToWord32(Node* node) { |
| + OperandGenerator g(this); |
| + Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0))); |
| +} |
| + |
| +void InstructionSelector::VisitImpossibleToWord64(Node* node) { |
| + OperandGenerator g(this); |
| + Emit(kArchImpossible, |
| + g.DefineAsConstant(node, Constant(static_cast<int64_t>(0)))); |
| +} |
| + |
| +void InstructionSelector::VisitImpossibleToFloat32(Node* node) { |
| + OperandGenerator g(this); |
| + Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0.0f))); |
| +} |
| + |
| +void InstructionSelector::VisitImpossibleToFloat64(Node* node) { |
| + OperandGenerator g(this); |
| + Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0.0))); |
| +} |
| + |
| +void InstructionSelector::VisitImpossibleToBit(Node* node) { |
| + OperandGenerator g(this); |
| + Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0))); |
| +} |
| + |
| +void InstructionSelector::VisitImpossibleToTagged(Node* node) { |
| + OperandGenerator g(this); |
| +#if V8_TARGET_ARCH_64_BIT |
|
Benedikt Meurer
2016/07/24 17:23:41
How about a simpler approach?
Emit(kArchImpossibl
Jarin
2016/07/24 18:15:40
I tried that, did not compile on Mac. See the diff
Benedikt Meurer
2016/07/25 03:36:51
Mhm, that's weird.
|
| + Emit(kArchImpossible, |
| + g.DefineAsConstant(node, Constant(static_cast<int64_t>(0)))); |
| +#else // V8_TARGET_ARCH_64_BIT |
| + Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0))); |
| +#endif // V8_TARGET_ARCH_64_BIT |
| +} |
| void InstructionSelector::VisitLoadStackPointer(Node* node) { |
| OperandGenerator g(this); |
| Emit(kArchStackPointer, g.DefineAsRegister(node)); |
| } |
| - |
| void InstructionSelector::VisitLoadFramePointer(Node* node) { |
| OperandGenerator g(this); |
| Emit(kArchFramePointer, g.DefineAsRegister(node)); |