1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "src/compiler/operator-properties.h"
7 #include "src/compiler/js-operator.h"
8 #include "src/compiler/linkage.h"
9 #include "src/compiler/opcodes.h"
16 bool OperatorProperties::HasContextInput(const Operator* op) {
17 IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
18 return IrOpcode::IsJsOpcode(opcode);
23 bool OperatorProperties::HasFrameStateInput(const Operator* op) {
24 if (!FLAG_turbo_deoptimization) {
27 switch (op->opcode()) {
28 case IrOpcode::kFrameState:
30 case IrOpcode::kJSCallRuntime: {
31 const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
32 return Linkage::NeedsFrameState(p.id());
35 // Strict equality cannot lazily deoptimize.
36 case IrOpcode::kJSStrictEqual:
37 case IrOpcode::kJSStrictNotEqual:
41 case IrOpcode::kJSCallFunction:
42 case IrOpcode::kJSCallConstruct:
45 case IrOpcode::kJSEqual:
46 case IrOpcode::kJSGreaterThan:
47 case IrOpcode::kJSGreaterThanOrEqual:
48 case IrOpcode::kJSHasProperty:
49 case IrOpcode::kJSInstanceOf:
50 case IrOpcode::kJSLessThan:
51 case IrOpcode::kJSLessThanOrEqual:
52 case IrOpcode::kJSNotEqual:
55 case IrOpcode::kJSAdd:
56 case IrOpcode::kJSBitwiseAnd:
57 case IrOpcode::kJSBitwiseOr:
58 case IrOpcode::kJSBitwiseXor:
59 case IrOpcode::kJSDivide:
60 case IrOpcode::kJSModulus:
61 case IrOpcode::kJSMultiply:
62 case IrOpcode::kJSShiftLeft:
63 case IrOpcode::kJSShiftRight:
64 case IrOpcode::kJSShiftRightLogical:
65 case IrOpcode::kJSSubtract:
68 case IrOpcode::kJSCreateWithContext:
71 case IrOpcode::kJSToObject:
72 case IrOpcode::kJSToNumber:
73 case IrOpcode::kJSToName:
76 case IrOpcode::kJSLoadNamed:
77 case IrOpcode::kJSLoadProperty:
78 case IrOpcode::kJSStoreNamed:
79 case IrOpcode::kJSStoreProperty:
80 case IrOpcode::kJSDeleteProperty:
90 int OperatorProperties::GetTotalInputCount(const Operator* op) {
91 return op->ValueInputCount() + GetContextInputCount(op) +
92 GetFrameStateInputCount(op) + op->EffectInputCount() +
93 op->ControlInputCount();
98 bool OperatorProperties::IsBasicBlockBegin(const Operator* op) {
99 Operator::Opcode const opcode = op->opcode();
100 return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
101 opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
102 opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
103 opcode == IrOpcode::kIfFalse || opcode == IrOpcode::kIfValue ||
104 opcode == IrOpcode::kIfDefault;
107 } // namespace compiler
108 } // namespace internal