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" 10 #include "src/runtime/runtime.h" 17 bool OperatorProperties::HasContextInput(
const Operator* op) {
18 IrOpcode::Value opcode =
static_cast<IrOpcode::Value
>(op->opcode());
19 return IrOpcode::IsJsOpcode(opcode);
23 bool OperatorProperties::NeedsExactContext(
const Operator* op) {
24 DCHECK(HasContextInput(op));
25 IrOpcode::Value
const opcode =
static_cast<IrOpcode::Value
>(op->opcode());
27 #define CASE(Name) case IrOpcode::k##Name: 31 JS_SIMPLE_BINOP_LIST(CASE)
33 JS_CONSTRUCT_OP_LIST(CASE)
34 JS_SIMPLE_UNOP_LIST(CASE)
36 case IrOpcode::kJSCloneObject:
37 case IrOpcode::kJSCreate:
38 case IrOpcode::kJSCreateLiteralArray:
39 case IrOpcode::kJSCreateEmptyLiteralArray:
40 case IrOpcode::kJSCreateLiteralObject:
41 case IrOpcode::kJSCreateEmptyLiteralObject:
42 case IrOpcode::kJSCreateArrayFromIterable:
43 case IrOpcode::kJSCreateLiteralRegExp:
44 case IrOpcode::kJSForInEnumerate:
45 case IrOpcode::kJSForInNext:
46 case IrOpcode::kJSForInPrepare:
47 case IrOpcode::kJSGeneratorRestoreContext:
48 case IrOpcode::kJSGeneratorRestoreContinuation:
49 case IrOpcode::kJSGeneratorRestoreInputOrDebugPos:
50 case IrOpcode::kJSGeneratorRestoreRegister:
51 case IrOpcode::kJSGetSuperConstructor:
52 case IrOpcode::kJSLoadGlobal:
53 case IrOpcode::kJSLoadMessage:
54 case IrOpcode::kJSStackCheck:
55 case IrOpcode::kJSStoreGlobal:
56 case IrOpcode::kJSStoreMessage:
59 case IrOpcode::kJSCallRuntime:
60 return Runtime::NeedsExactContext(CallRuntimeParametersOf(op).
id());
62 case IrOpcode::kJSCreateArguments:
65 return CreateArgumentsTypeOf(op) == CreateArgumentsType::kMappedArguments;
67 case IrOpcode::kJSCreateBlockContext:
68 case IrOpcode::kJSCreateClosure:
69 case IrOpcode::kJSCreateFunctionContext:
70 case IrOpcode::kJSCreateGeneratorObject:
71 case IrOpcode::kJSCreateCatchContext:
72 case IrOpcode::kJSCreateWithContext:
73 case IrOpcode::kJSDebugger:
74 case IrOpcode::kJSDeleteProperty:
75 case IrOpcode::kJSGeneratorStore:
76 case IrOpcode::kJSHasProperty:
77 case IrOpcode::kJSLoadContext:
78 case IrOpcode::kJSLoadModule:
79 case IrOpcode::kJSLoadNamed:
80 case IrOpcode::kJSLoadProperty:
81 case IrOpcode::kJSStoreContext:
82 case IrOpcode::kJSStoreDataPropertyInLiteral:
83 case IrOpcode::kJSStoreInArrayLiteral:
84 case IrOpcode::kJSStoreModule:
85 case IrOpcode::kJSStoreNamed:
86 case IrOpcode::kJSStoreNamedOwn:
87 case IrOpcode::kJSStoreProperty:
90 case IrOpcode::kJSAsyncFunctionEnter:
91 case IrOpcode::kJSAsyncFunctionReject:
92 case IrOpcode::kJSAsyncFunctionResolve:
93 case IrOpcode::kJSCreateArrayIterator:
94 case IrOpcode::kJSCreateAsyncFunctionObject:
95 case IrOpcode::kJSCreateBoundFunction:
96 case IrOpcode::kJSCreateCollectionIterator:
97 case IrOpcode::kJSCreateIterResultObject:
98 case IrOpcode::kJSCreateStringIterator:
99 case IrOpcode::kJSCreateKeyValueArray:
100 case IrOpcode::kJSCreateObject:
101 case IrOpcode::kJSCreatePromise:
102 case IrOpcode::kJSCreateTypedArray:
103 case IrOpcode::kJSCreateArray:
104 case IrOpcode::kJSFulfillPromise:
105 case IrOpcode::kJSObjectIsArray:
106 case IrOpcode::kJSPerformPromiseThen:
107 case IrOpcode::kJSPromiseResolve:
108 case IrOpcode::kJSRegExpTest:
109 case IrOpcode::kJSRejectPromise:
110 case IrOpcode::kJSResolvePromise:
117 #define CASE(Name) case IrOpcode::k##Name: 120 CONTROL_OP_LIST(CASE)
121 MACHINE_OP_LIST(CASE)
122 MACHINE_SIMD_OP_LIST(CASE)
123 SIMPLIFIED_OP_LIST(CASE)
131 bool OperatorProperties::HasFrameStateInput(
const Operator* op) {
132 switch (op->opcode()) {
133 case IrOpcode::kCheckpoint:
134 case IrOpcode::kFrameState:
136 case IrOpcode::kJSCallRuntime: {
137 const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
138 return Linkage::NeedsFrameStateInput(p.id());
142 case IrOpcode::kJSStrictEqual:
146 case IrOpcode::kJSCreateGeneratorObject:
150 case IrOpcode::kJSAdd:
151 case IrOpcode::kJSSubtract:
152 case IrOpcode::kJSMultiply:
153 case IrOpcode::kJSDivide:
154 case IrOpcode::kJSModulus:
155 case IrOpcode::kJSExponentiate:
158 case IrOpcode::kJSBitwiseOr:
159 case IrOpcode::kJSBitwiseXor:
160 case IrOpcode::kJSBitwiseAnd:
163 case IrOpcode::kJSShiftLeft:
164 case IrOpcode::kJSShiftRight:
165 case IrOpcode::kJSShiftRightLogical:
168 case IrOpcode::kJSEqual:
169 case IrOpcode::kJSGreaterThan:
170 case IrOpcode::kJSGreaterThanOrEqual:
171 case IrOpcode::kJSLessThan:
172 case IrOpcode::kJSLessThanOrEqual:
173 case IrOpcode::kJSHasProperty:
174 case IrOpcode::kJSHasInPrototypeChain:
175 case IrOpcode::kJSInstanceOf:
176 case IrOpcode::kJSOrdinaryHasInstance:
179 case IrOpcode::kJSCreate:
180 case IrOpcode::kJSCreateArguments:
181 case IrOpcode::kJSCreateArray:
182 case IrOpcode::kJSCreateTypedArray:
183 case IrOpcode::kJSCreateLiteralArray:
184 case IrOpcode::kJSCreateArrayFromIterable:
185 case IrOpcode::kJSCreateLiteralObject:
186 case IrOpcode::kJSCreateLiteralRegExp:
187 case IrOpcode::kJSCreateObject:
188 case IrOpcode::kJSCloneObject:
191 case IrOpcode::kJSLoadNamed:
192 case IrOpcode::kJSStoreNamed:
193 case IrOpcode::kJSLoadProperty:
194 case IrOpcode::kJSStoreProperty:
195 case IrOpcode::kJSLoadGlobal:
196 case IrOpcode::kJSStoreGlobal:
197 case IrOpcode::kJSStoreNamedOwn:
198 case IrOpcode::kJSStoreDataPropertyInLiteral:
199 case IrOpcode::kJSDeleteProperty:
202 case IrOpcode::kJSToLength:
203 case IrOpcode::kJSToName:
204 case IrOpcode::kJSToNumber:
205 case IrOpcode::kJSToNumberConvertBigInt:
206 case IrOpcode::kJSToNumeric:
207 case IrOpcode::kJSToObject:
208 case IrOpcode::kJSToString:
209 case IrOpcode::kJSParseInt:
212 case IrOpcode::kJSConstructForwardVarargs:
213 case IrOpcode::kJSConstruct:
214 case IrOpcode::kJSConstructWithArrayLike:
215 case IrOpcode::kJSConstructWithSpread:
216 case IrOpcode::kJSCallForwardVarargs:
217 case IrOpcode::kJSCall:
218 case IrOpcode::kJSCallWithArrayLike:
219 case IrOpcode::kJSCallWithSpread:
222 case IrOpcode::kJSAsyncFunctionEnter:
223 case IrOpcode::kJSAsyncFunctionReject:
224 case IrOpcode::kJSAsyncFunctionResolve:
225 case IrOpcode::kJSForInEnumerate:
226 case IrOpcode::kJSForInNext:
227 case IrOpcode::kJSStackCheck:
228 case IrOpcode::kJSDebugger:
229 case IrOpcode::kJSGetSuperConstructor:
230 case IrOpcode::kJSBitwiseNot:
231 case IrOpcode::kJSDecrement:
232 case IrOpcode::kJSIncrement:
233 case IrOpcode::kJSNegate:
234 case IrOpcode::kJSPromiseResolve:
235 case IrOpcode::kJSRejectPromise:
236 case IrOpcode::kJSResolvePromise:
237 case IrOpcode::kJSPerformPromiseThen:
238 case IrOpcode::kJSObjectIsArray:
239 case IrOpcode::kJSRegExpTest:
249 int OperatorProperties::GetTotalInputCount(
const Operator* op) {
250 return op->ValueInputCount() + GetContextInputCount(op) +
251 GetFrameStateInputCount(op) + op->EffectInputCount() +
252 op->ControlInputCount();
257 bool OperatorProperties::IsBasicBlockBegin(
const Operator* op) {
258 Operator::Opcode
const opcode = op->opcode();
259 return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
260 opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
261 opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
262 opcode == IrOpcode::kIfFalse || opcode == IrOpcode::kIfSuccess ||
263 opcode == IrOpcode::kIfException || opcode == IrOpcode::kIfValue ||
264 opcode == IrOpcode::kIfDefault;