operator-properties.cc revision 958fae7ec3f466955f8e5b50fa5b8d38b9e91675
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.
4
5#include "src/compiler/operator-properties.h"
6
7#include "src/compiler/js-operator.h"
8#include "src/compiler/linkage.h"
9#include "src/compiler/opcodes.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15// static
16bool OperatorProperties::HasContextInput(const Operator* op) {
17  IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
18  return IrOpcode::IsJsOpcode(opcode);
19}
20
21
22// static
23bool OperatorProperties::HasFrameStateInput(const Operator* op) {
24  if (!FLAG_turbo_deoptimization) {
25    return false;
26  }
27  switch (op->opcode()) {
28    case IrOpcode::kFrameState:
29      return true;
30    case IrOpcode::kJSCallRuntime: {
31      const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
32      return Linkage::NeedsFrameState(p.id());
33    }
34
35    // Strict equality cannot lazily deoptimize.
36    case IrOpcode::kJSStrictEqual:
37    case IrOpcode::kJSStrictNotEqual:
38      return false;
39
40    // Calls
41    case IrOpcode::kJSCallFunction:
42    case IrOpcode::kJSCallConstruct:
43
44    // Compare operations
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:
53
54    // Binary operations
55    case IrOpcode::kJSAdd:
56    case IrOpcode::kJSBitwiseAnd:
57    case IrOpcode::kJSBitwiseOr:
58    case IrOpcode::kJSBitwiseXor:
59    case IrOpcode::kJSDivide:
60    case IrOpcode::kJSLoadNamed:
61    case IrOpcode::kJSLoadProperty:
62    case IrOpcode::kJSModulus:
63    case IrOpcode::kJSMultiply:
64    case IrOpcode::kJSShiftLeft:
65    case IrOpcode::kJSShiftRight:
66    case IrOpcode::kJSShiftRightLogical:
67    case IrOpcode::kJSStoreNamed:
68    case IrOpcode::kJSStoreProperty:
69    case IrOpcode::kJSSubtract:
70
71    // Conversions
72    case IrOpcode::kJSToObject:
73
74    // Other
75    case IrOpcode::kJSDeleteProperty:
76      return true;
77
78    default:
79      return false;
80  }
81}
82
83
84// static
85int OperatorProperties::GetTotalInputCount(const Operator* op) {
86  return op->ValueInputCount() + GetContextInputCount(op) +
87         GetFrameStateInputCount(op) + op->EffectInputCount() +
88         op->ControlInputCount();
89}
90
91
92// static
93bool OperatorProperties::IsBasicBlockBegin(const Operator* op) {
94  Operator::Opcode const opcode = op->opcode();
95  return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
96         opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
97         opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
98         opcode == IrOpcode::kIfFalse;
99}
100
101}  // namespace compiler
102}  // namespace internal
103}  // namespace v8
104