Line data Source code
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 :
11 : namespace v8 {
12 : namespace internal {
13 : namespace compiler {
14 :
15 : // static
16 978440999 : bool OperatorProperties::HasContextInput(const Operator* op) {
17 978440999 : IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
18 978148330 : return IrOpcode::IsJsOpcode(opcode);
19 : }
20 :
21 :
22 : // static
23 955672201 : bool OperatorProperties::HasFrameStateInput(const Operator* op) {
24 955672201 : switch (op->opcode()) {
25 : case IrOpcode::kCheckpoint:
26 : case IrOpcode::kFrameState:
27 : return true;
28 : case IrOpcode::kJSCallRuntime: {
29 8073162 : const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
30 8073163 : return Linkage::NeedsFrameStateInput(p.id());
31 : }
32 :
33 : // Strict equality cannot lazily deoptimize.
34 : case IrOpcode::kJSStrictEqual:
35 3945183 : return false;
36 :
37 : // Generator creation cannot call back into arbitrary JavaScript.
38 : case IrOpcode::kJSCreateGeneratorObject:
39 11194 : return false;
40 :
41 : // Binary operations
42 : case IrOpcode::kJSAdd:
43 : case IrOpcode::kJSSubtract:
44 : case IrOpcode::kJSMultiply:
45 : case IrOpcode::kJSDivide:
46 : case IrOpcode::kJSModulus:
47 :
48 : // Bitwise operations
49 : case IrOpcode::kJSBitwiseOr:
50 : case IrOpcode::kJSBitwiseXor:
51 : case IrOpcode::kJSBitwiseAnd:
52 :
53 : // Shift operations
54 : case IrOpcode::kJSShiftLeft:
55 : case IrOpcode::kJSShiftRight:
56 : case IrOpcode::kJSShiftRightLogical:
57 :
58 : // Compare operations
59 : case IrOpcode::kJSEqual:
60 : case IrOpcode::kJSGreaterThan:
61 : case IrOpcode::kJSGreaterThanOrEqual:
62 : case IrOpcode::kJSLessThan:
63 : case IrOpcode::kJSLessThanOrEqual:
64 : case IrOpcode::kJSHasProperty:
65 : case IrOpcode::kJSHasInPrototypeChain:
66 : case IrOpcode::kJSInstanceOf:
67 : case IrOpcode::kJSOrdinaryHasInstance:
68 :
69 : // Object operations
70 : case IrOpcode::kJSCreate:
71 : case IrOpcode::kJSCreateArguments:
72 : case IrOpcode::kJSCreateArray:
73 : case IrOpcode::kJSCreateLiteralArray:
74 : case IrOpcode::kJSCreateLiteralObject:
75 : case IrOpcode::kJSCreateLiteralRegExp:
76 :
77 : // Property access operations
78 : case IrOpcode::kJSLoadNamed:
79 : case IrOpcode::kJSStoreNamed:
80 : case IrOpcode::kJSLoadProperty:
81 : case IrOpcode::kJSStoreProperty:
82 : case IrOpcode::kJSLoadGlobal:
83 : case IrOpcode::kJSStoreGlobal:
84 : case IrOpcode::kJSStoreNamedOwn:
85 : case IrOpcode::kJSStoreDataPropertyInLiteral:
86 : case IrOpcode::kJSDeleteProperty:
87 :
88 : // Context operations
89 : case IrOpcode::kJSCreateScriptContext:
90 :
91 : // Conversions
92 : case IrOpcode::kJSToInteger:
93 : case IrOpcode::kJSToLength:
94 : case IrOpcode::kJSToName:
95 : case IrOpcode::kJSToNumber:
96 : case IrOpcode::kJSToObject:
97 : case IrOpcode::kJSToString:
98 :
99 : // Call operations
100 : case IrOpcode::kJSConstructForwardVarargs:
101 : case IrOpcode::kJSConstruct:
102 : case IrOpcode::kJSConstructWithArrayLike:
103 : case IrOpcode::kJSConstructWithSpread:
104 : case IrOpcode::kJSCallForwardVarargs:
105 : case IrOpcode::kJSCall:
106 : case IrOpcode::kJSCallWithArrayLike:
107 : case IrOpcode::kJSCallWithSpread:
108 :
109 : // Misc operations
110 : case IrOpcode::kJSForInEnumerate:
111 : case IrOpcode::kJSForInNext:
112 : case IrOpcode::kJSStackCheck:
113 : case IrOpcode::kJSDebugger:
114 : case IrOpcode::kJSGetSuperConstructor:
115 : return true;
116 :
117 : default:
118 732099854 : return false;
119 : }
120 : }
121 :
122 :
123 : // static
124 878007 : int OperatorProperties::GetTotalInputCount(const Operator* op) {
125 585338 : return op->ValueInputCount() + GetContextInputCount(op) +
126 292669 : GetFrameStateInputCount(op) + op->EffectInputCount() +
127 292669 : op->ControlInputCount();
128 : }
129 :
130 :
131 : // static
132 42 : bool OperatorProperties::IsBasicBlockBegin(const Operator* op) {
133 : Operator::Opcode const opcode = op->opcode();
134 42 : return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
135 42 : opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
136 42 : opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
137 42 : opcode == IrOpcode::kIfFalse || opcode == IrOpcode::kIfSuccess ||
138 84 : opcode == IrOpcode::kIfException || opcode == IrOpcode::kIfValue ||
139 42 : opcode == IrOpcode::kIfDefault;
140 : }
141 :
142 : } // namespace compiler
143 : } // namespace internal
144 : } // namespace v8
|