Index: src/compiler/operator-properties-inl.h |
diff --git a/src/compiler/operator-properties-inl.h b/src/compiler/operator-properties-inl.h |
index fc9149dedb9c8f3a91c7ac27f33eadcf9f00d48d..42833fdeb417027543f0ed87ff293663d2b2c259 100644 |
--- a/src/compiler/operator-properties-inl.h |
+++ b/src/compiler/operator-properties-inl.h |
@@ -7,6 +7,7 @@ |
#include "src/v8.h" |
+#include "src/compiler/js-operator.h" |
#include "src/compiler/opcodes.h" |
#include "src/compiler/operator-properties.h" |
@@ -59,6 +60,10 @@ inline int OperatorProperties::GetControlInputCount(Operator* op) { |
#undef OPCODE_CASE |
return static_cast<ControlOperator*>(op)->ControlInputCount(); |
default: |
+ // If a node can lazily deoptimize, it needs control dependency. |
+ if (CanLazilyDeoptimize(op)) { |
+ return 1; |
+ } |
// Operators that have write effects must have a control |
// dependency. Effect dependencies only ensure the correct order of |
// write/read operations without consideration of control flow. Without an |
@@ -130,17 +135,52 @@ inline bool OperatorProperties::IsScheduleRoot(Operator* op) { |
} |
inline bool OperatorProperties::CanLazilyDeoptimize(Operator* op) { |
- if (op->opcode() == IrOpcode::kCall) { |
- CallOperator* call_op = reinterpret_cast<CallOperator*>(op); |
- CallDescriptor* descriptor = call_op->parameter(); |
- return descriptor->CanLazilyDeoptimize(); |
+ // TODO(jarin) This function allows turning on lazy deoptimization |
+ // incrementally. It will change as we turn on lazy deopt for |
+ // more nodes. |
+ |
+ if (!FLAG_turbo_deoptimization) { |
+ return false; |
} |
- if (op->opcode() == IrOpcode::kJSCallRuntime) { |
- // TODO(jarin) At the moment, we only support lazy deoptimization for |
- // the %DeoptimizeFunction runtime function. |
- Runtime::FunctionId function = |
- reinterpret_cast<Operator1<Runtime::FunctionId>*>(op)->parameter(); |
- return function == Runtime::kDeoptimizeFunction; |
+ |
+ switch (op->opcode()) { |
+ case IrOpcode::kCall: { |
+ CallOperator* call_op = reinterpret_cast<CallOperator*>(op); |
+ CallDescriptor* descriptor = call_op->parameter(); |
+ return descriptor->CanLazilyDeoptimize(); |
+ } |
+ case IrOpcode::kJSCallRuntime: { |
+ Runtime::FunctionId function = |
+ reinterpret_cast<Operator1<Runtime::FunctionId>*>(op)->parameter(); |
+ // TODO(jarin) At the moment, we only support lazy deoptimization for |
+ // the %DeoptimizeFunction runtime function. |
+ return function == Runtime::kDeoptimizeFunction; |
+ } |
+ |
+ // JS function calls |
+ case IrOpcode::kJSCallFunction: |
+ case IrOpcode::kJSCallConstruct: |
+ |
+ // Binary operations |
+ case IrOpcode::kJSBitwiseOr: |
+ case IrOpcode::kJSBitwiseXor: |
+ case IrOpcode::kJSBitwiseAnd: |
+ case IrOpcode::kJSShiftLeft: |
+ case IrOpcode::kJSShiftRight: |
+ case IrOpcode::kJSShiftRightLogical: |
+ case IrOpcode::kJSAdd: |
+ case IrOpcode::kJSSubtract: |
+ case IrOpcode::kJSMultiply: |
+ case IrOpcode::kJSDivide: |
+ case IrOpcode::kJSModulus: |
+ case IrOpcode::kJSLoadProperty: |
+ case IrOpcode::kJSStoreProperty: |
+ case IrOpcode::kJSLoadNamed: |
+ case IrOpcode::kJSStoreNamed: |
+ return true; |
+ |
+ default: |
+ return false; |
} |
return false; |
} |