| Index: src/compiler/operator-properties.cc
|
| diff --git a/src/compiler/operator-properties.cc b/src/compiler/operator-properties.cc
|
| index 64f384b4b41568bc852adcb4e3c1b8fc0dc050c5..072f207d605f74fb88eadcc99ec4ccea82b610d3 100644
|
| --- a/src/compiler/operator-properties.cc
|
| +++ b/src/compiler/operator-properties.cc
|
| @@ -20,13 +20,13 @@ bool OperatorProperties::HasContextInput(const Operator* op) {
|
|
|
|
|
| // static
|
| -bool OperatorProperties::HasFrameStateInput(const Operator* op) {
|
| +int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
|
| if (!FLAG_turbo_deoptimization) {
|
| - return false;
|
| + return 0;
|
| }
|
| switch (op->opcode()) {
|
| case IrOpcode::kFrameState:
|
| - return true;
|
| + return 1;
|
| case IrOpcode::kJSCallRuntime: {
|
| const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
|
| return Linkage::NeedsFrameState(p.id());
|
| @@ -35,7 +35,7 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) {
|
| // Strict equality cannot lazily deoptimize.
|
| case IrOpcode::kJSStrictEqual:
|
| case IrOpcode::kJSStrictNotEqual:
|
| - return false;
|
| + return 0;
|
|
|
| // Calls
|
| case IrOpcode::kJSCallFunction:
|
| @@ -51,19 +51,6 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) {
|
| case IrOpcode::kJSLessThanOrEqual:
|
| case IrOpcode::kJSNotEqual:
|
|
|
| - // Binary operations
|
| - case IrOpcode::kJSAdd:
|
| - case IrOpcode::kJSBitwiseAnd:
|
| - case IrOpcode::kJSBitwiseOr:
|
| - case IrOpcode::kJSBitwiseXor:
|
| - case IrOpcode::kJSDivide:
|
| - case IrOpcode::kJSModulus:
|
| - case IrOpcode::kJSMultiply:
|
| - case IrOpcode::kJSShiftLeft:
|
| - case IrOpcode::kJSShiftRight:
|
| - case IrOpcode::kJSShiftRightLogical:
|
| - case IrOpcode::kJSSubtract:
|
| -
|
| // Context operations
|
| case IrOpcode::kJSCreateWithContext:
|
|
|
| @@ -78,10 +65,26 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) {
|
| case IrOpcode::kJSStoreNamed:
|
| case IrOpcode::kJSStoreProperty:
|
| case IrOpcode::kJSDeleteProperty:
|
| - return true;
|
| + return 1;
|
| +
|
| + // Binary operators that can deopt in the middle the operation (e.g.,
|
| + // as a result of lazy deopt in ToNumber conversion) need a second frame
|
| + // state so that we can resume before the operation.
|
| + case IrOpcode::kJSMultiply:
|
| + case IrOpcode::kJSAdd:
|
| + case IrOpcode::kJSBitwiseAnd:
|
| + case IrOpcode::kJSBitwiseOr:
|
| + case IrOpcode::kJSBitwiseXor:
|
| + case IrOpcode::kJSDivide:
|
| + case IrOpcode::kJSModulus:
|
| + case IrOpcode::kJSShiftLeft:
|
| + case IrOpcode::kJSShiftRight:
|
| + case IrOpcode::kJSShiftRightLogical:
|
| + case IrOpcode::kJSSubtract:
|
| + return 2;
|
|
|
| default:
|
| - return false;
|
| + return 0;
|
| }
|
| }
|
|
|
|
|