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