OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ | 5 #ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ |
6 #define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ | 6 #define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ |
7 | 7 |
8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
9 #include "src/compiler/graph-assembler.h" | |
9 #include "src/compiler/node.h" | 10 #include "src/compiler/node.h" |
10 #include "src/compiler/simplified-operator.h" | 11 #include "src/compiler/simplified-operator.h" |
11 #include "src/globals.h" | 12 #include "src/globals.h" |
12 | 13 |
13 namespace v8 { | 14 namespace v8 { |
14 namespace internal { | 15 namespace internal { |
15 | 16 |
16 // Forward declarations. | 17 // Forward declarations. |
17 class Callable; | 18 class Callable; |
18 class Zone; | 19 class Zone; |
(...skipping 12 matching lines...) Expand all Loading... | |
31 public: | 32 public: |
32 EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone, | 33 EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone, |
33 SourcePositionTable* source_positions); | 34 SourcePositionTable* source_positions); |
34 | 35 |
35 void Run(); | 36 void Run(); |
36 | 37 |
37 private: | 38 private: |
38 void ProcessNode(Node* node, Node** frame_state, Node** effect, | 39 void ProcessNode(Node* node, Node** frame_state, Node** effect, |
39 Node** control); | 40 Node** control); |
40 | 41 |
41 struct ValueEffectControl { | |
42 Node* value; | |
43 Node* effect; | |
44 Node* control; | |
45 ValueEffectControl(Node* value, Node* effect, Node* control) | |
46 : value(value), effect(effect), control(control) {} | |
47 }; | |
48 | |
49 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect, | 42 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect, |
50 Node** control); | 43 Node** control); |
51 ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect, | 44 Node* LowerChangeBitToTagged(Node* node); |
52 Node* control); | 45 Node* LowerChangeInt31ToTaggedSigned(Node* node); |
53 ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect, | 46 Node* LowerChangeInt32ToTagged(Node* node); |
54 Node* control); | 47 Node* LowerChangeUint32ToTagged(Node* node); |
55 ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect, | 48 Node* LowerChangeFloat64ToTagged(Node* node); |
56 Node* control); | 49 Node* LowerChangeFloat64ToTaggedPointer(Node* node); |
57 ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect, | 50 Node* LowerChangeTaggedSignedToInt32(Node* node); |
58 Node* control); | 51 Node* LowerChangeTaggedToBit(Node* node); |
59 ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect, | 52 Node* LowerChangeTaggedToInt32(Node* node); |
60 Node* control); | 53 Node* LowerChangeTaggedToUint32(Node* node); |
61 ValueEffectControl LowerChangeFloat64ToTaggedPointer(Node* node, Node* effect, | 54 Node* LowerCheckBounds(Node* node, Node* frame_state); |
62 Node* control); | 55 Node* LowerCheckMaps(Node* node, Node* frame_state); |
63 ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect, | 56 Node* LowerCheckNumber(Node* node, Node* frame_state); |
64 Node* control); | 57 Node* LowerCheckString(Node* node, Node* frame_state); |
65 ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect, | 58 Node* LowerCheckIf(Node* node, Node* frame_state); |
66 Node* control); | 59 Node* LowerCheckedInt32Add(Node* node, Node* frame_state); |
67 ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect, | 60 Node* LowerCheckedInt32Sub(Node* node, Node* frame_state); |
68 Node* control); | 61 Node* LowerCheckedInt32Div(Node* node, Node* frame_state); |
69 ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect, | 62 Node* LowerCheckedInt32Mod(Node* node, Node* frame_state); |
70 Node* control); | 63 Node* LowerCheckedUint32Div(Node* node, Node* frame_state); |
71 ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state, | 64 Node* LowerCheckedUint32Mod(Node* node, Node* frame_state); |
72 Node* effect, Node* control); | 65 Node* LowerCheckedInt32Mul(Node* node, Node* frame_state); |
73 ValueEffectControl LowerCheckMaps(Node* node, Node* frame_state, Node* effect, | 66 Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state); |
74 Node* control); | 67 Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state); |
75 ValueEffectControl LowerCheckNumber(Node* node, Node* frame_state, | 68 Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state); |
76 Node* effect, Node* control); | 69 Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state); |
77 ValueEffectControl LowerCheckString(Node* node, Node* frame_state, | 70 Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state); |
78 Node* effect, Node* control); | 71 Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state); |
79 ValueEffectControl LowerCheckIf(Node* node, Node* frame_state, Node* effect, | 72 Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state); |
80 Node* control); | 73 Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state); |
81 ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state, | 74 Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state); |
82 Node* effect, Node* control); | 75 Node* LowerChangeTaggedToFloat64(Node* node); |
83 ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state, | 76 Node* LowerTruncateTaggedToBit(Node* node); |
84 Node* effect, Node* control); | 77 Node* LowerTruncateTaggedToFloat64(Node* node); |
85 ValueEffectControl LowerCheckedInt32Div(Node* node, Node* frame_state, | 78 Node* LowerTruncateTaggedToWord32(Node* node); |
86 Node* effect, Node* control); | 79 Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state); |
87 ValueEffectControl LowerCheckedInt32Mod(Node* node, Node* frame_state, | 80 Node* LowerObjectIsCallable(Node* node); |
88 Node* effect, Node* control); | 81 Node* LowerObjectIsNumber(Node* node); |
89 ValueEffectControl LowerCheckedUint32Div(Node* node, Node* frame_state, | 82 Node* LowerObjectIsReceiver(Node* node); |
90 Node* effect, Node* control); | 83 Node* LowerObjectIsSmi(Node* node); |
91 ValueEffectControl LowerCheckedUint32Mod(Node* node, Node* frame_state, | 84 Node* LowerObjectIsString(Node* node); |
92 Node* effect, Node* control); | 85 Node* LowerObjectIsUndetectable(Node* node); |
93 ValueEffectControl LowerCheckedInt32Mul(Node* node, Node* frame_state, | 86 Node* LowerNewRestParameterElements(Node* node); |
94 Node* effect, Node* control); | 87 Node* LowerNewUnmappedArgumentsElements(Node* node); |
95 ValueEffectControl LowerCheckedInt32ToTaggedSigned(Node* node, | 88 Node* LowerArrayBufferWasNeutered(Node* node); |
96 Node* frame_state, | 89 Node* LowerStringCharAt(Node* node); |
97 Node* effect, | 90 Node* LowerStringCharCodeAt(Node* node); |
98 Node* control); | 91 Node* LowerStringFromCharCode(Node* node); |
99 ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state, | 92 Node* LowerStringFromCodePoint(Node* node); |
100 Node* effect, Node* control); | 93 Node* LowerStringEqual(Node* node); |
101 ValueEffectControl LowerCheckedUint32ToTaggedSigned(Node* node, | 94 Node* LowerStringLessThan(Node* node); |
102 Node* frame_state, | 95 Node* LowerStringLessThanOrEqual(Node* node); |
103 Node* effect, | 96 Node* LowerCheckFloat64Hole(Node* node, Node* frame_state); |
104 Node* control); | 97 Node* LowerCheckTaggedHole(Node* node, Node* frame_state); |
105 ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state, | 98 Node* LowerConvertTaggedHoleToUndefined(Node* node); |
106 Node* effect, Node* control); | 99 Node* LowerPlainPrimitiveToNumber(Node* node); |
107 ValueEffectControl LowerCheckedTaggedSignedToInt32(Node* node, | 100 Node* LowerPlainPrimitiveToWord32(Node* node); |
108 Node* frame_state, | 101 Node* LowerPlainPrimitiveToFloat64(Node* node); |
109 Node* effect, | 102 Node* LowerEnsureWritableFastElements(Node* node); |
110 Node* control); | 103 Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state); |
111 ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state, | 104 void LowerTransitionElementsKind(Node* node); |
112 Node* effect, Node* control); | 105 Node* LowerLoadTypedElement(Node* node); |
113 ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state, | 106 void LowerStoreTypedElement(Node* node); |
114 Node* effect, Node* control); | |
115 ValueEffectControl LowerCheckedTaggedToTaggedSigned(Node* node, | |
116 Node* frame_state, | |
117 Node* effect, | |
118 Node* control); | |
119 ValueEffectControl LowerCheckedTaggedToTaggedPointer(Node* node, | |
120 Node* frame_state, | |
121 Node* effect, | |
122 Node* control); | |
123 ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect, | |
124 Node* control); | |
125 ValueEffectControl LowerTruncateTaggedToBit(Node* node, Node* effect, | |
126 Node* control); | |
127 ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect, | |
128 Node* control); | |
129 ValueEffectControl LowerTruncateTaggedToWord32(Node* node, Node* effect, | |
130 Node* control); | |
131 ValueEffectControl LowerCheckedTruncateTaggedToWord32(Node* node, | |
132 Node* frame_state, | |
133 Node* effect, | |
134 Node* control); | |
135 ValueEffectControl LowerObjectIsCallable(Node* node, Node* effect, | |
136 Node* control); | |
137 ValueEffectControl LowerObjectIsNumber(Node* node, Node* effect, | |
138 Node* control); | |
139 ValueEffectControl LowerObjectIsReceiver(Node* node, Node* effect, | |
140 Node* control); | |
141 ValueEffectControl LowerObjectIsSmi(Node* node, Node* effect, Node* control); | |
142 ValueEffectControl LowerObjectIsString(Node* node, Node* effect, | |
143 Node* control); | |
144 ValueEffectControl LowerObjectIsUndetectable(Node* node, Node* effect, | |
145 Node* control); | |
146 ValueEffectControl LowerNewRestParameterElements(Node* node, Node* effect, | |
147 Node* control); | |
148 ValueEffectControl LowerNewUnmappedArgumentsElements(Node* node, Node* effect, | |
149 Node* control); | |
150 ValueEffectControl LowerArrayBufferWasNeutered(Node* node, Node* effect, | |
151 Node* control); | |
152 ValueEffectControl LowerStringCharAt(Node* node, Node* effect, Node* control); | |
153 ValueEffectControl LowerStringCharCodeAt(Node* node, Node* effect, | |
154 Node* control); | |
155 ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect, | |
156 Node* control); | |
157 ValueEffectControl LowerStringFromCodePoint(Node* node, Node* effect, | |
158 Node* control); | |
159 ValueEffectControl LowerStringEqual(Node* node, Node* effect, Node* control); | |
160 ValueEffectControl LowerStringLessThan(Node* node, Node* effect, | |
161 Node* control); | |
162 ValueEffectControl LowerStringLessThanOrEqual(Node* node, Node* effect, | |
163 Node* control); | |
164 ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state, | |
165 Node* effect, Node* control); | |
166 ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state, | |
167 Node* effect, Node* control); | |
168 ValueEffectControl LowerConvertTaggedHoleToUndefined(Node* node, Node* effect, | |
169 Node* control); | |
170 ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect, | |
171 Node* control); | |
172 ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect, | |
173 Node* control); | |
174 ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect, | |
175 Node* control); | |
176 ValueEffectControl LowerEnsureWritableFastElements(Node* node, Node* effect, | |
177 Node* control); | |
178 ValueEffectControl LowerMaybeGrowFastElements(Node* node, Node* frame_state, | |
179 Node* effect, Node* control); | |
180 ValueEffectControl LowerTransitionElementsKind(Node* node, Node* effect, | |
181 Node* control); | |
182 ValueEffectControl LowerLoadTypedElement(Node* node, Node* effect, | |
183 Node* control); | |
184 ValueEffectControl LowerStoreTypedElement(Node* node, Node* effect, | |
185 Node* control); | |
186 | 107 |
187 // Lowering of optional operators. | 108 // Lowering of optional operators. |
188 ValueEffectControl LowerFloat64RoundUp(Node* node, Node* effect, | 109 Maybe<Node*> LowerFloat64RoundUp(Node* node); |
189 Node* control); | 110 Maybe<Node*> LowerFloat64RoundDown(Node* node); |
190 ValueEffectControl LowerFloat64RoundDown(Node* node, Node* effect, | 111 Maybe<Node*> LowerFloat64RoundTiesEven(Node* node); |
191 Node* control); | 112 Maybe<Node*> LowerFloat64RoundTruncate(Node* node); |
192 ValueEffectControl LowerFloat64RoundTiesEven(Node* node, Node* effect, | |
193 Node* control); | |
194 ValueEffectControl LowerFloat64RoundTruncate(Node* node, Node* effect, | |
195 Node* control); | |
196 | 113 |
197 ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect, | 114 Node* AllocateHeapNumberWithValue(Node* node); |
198 Node* control); | 115 Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, Node* value, |
199 ValueEffectControl BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, | 116 Node* frame_state); |
200 Node* value, Node* frame_state, | 117 Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode, |
201 Node* effect, Node* control); | 118 Node* value, |
202 ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64( | 119 Node* frame_state); |
203 CheckTaggedInputMode mode, Node* value, Node* frame_state, Node* effect, | 120 Node* BuildFloat64RoundDown(Node* value); |
204 Node* control); | 121 Node* LowerStringComparison(Callable const& callable, Node* node); |
205 ValueEffectControl BuildFloat64RoundDown(Node* value, Node* effect, | |
206 Node* control); | |
207 ValueEffectControl LowerStringComparison(Callable const& callable, Node* node, | |
208 Node* effect, Node* control); | |
209 | 122 |
210 Node* ChangeInt32ToSmi(Node* value); | 123 Node* ChangeInt32ToSmi(Node* value); |
Igor Sheludko
2017/01/02 13:23:26
I think these helper methods should live in the Gr
Jarin
2017/01/03 09:27:55
Acknowledged.
| |
211 Node* ChangeUint32ToSmi(Node* value); | 124 Node* ChangeUint32ToSmi(Node* value); |
212 Node* ChangeInt32ToFloat64(Node* value); | |
213 Node* ChangeUint32ToFloat64(Node* value); | |
214 Node* ChangeSmiToInt32(Node* value); | 125 Node* ChangeSmiToInt32(Node* value); |
215 Node* ObjectIsSmi(Node* value); | 126 Node* ObjectIsSmi(Node* value); |
216 | 127 |
217 Node* SmiMaxValueConstant(); | 128 Node* SmiMaxValueConstant(); |
218 Node* SmiShiftBitsConstant(); | 129 Node* SmiShiftBitsConstant(); |
Igor Sheludko
2017/01/02 13:23:26
Same here.
Jarin
2017/01/03 09:27:55
Acknowledged.
| |
219 | 130 |
220 Factory* factory() const; | 131 Factory* factory() const; |
221 Isolate* isolate() const; | 132 Isolate* isolate() const; |
222 JSGraph* jsgraph() const { return js_graph_; } | 133 JSGraph* jsgraph() const { return js_graph_; } |
223 Graph* graph() const; | 134 Graph* graph() const; |
224 Schedule* schedule() const { return schedule_; } | 135 Schedule* schedule() const { return schedule_; } |
225 Zone* temp_zone() const { return temp_zone_; } | 136 Zone* temp_zone() const { return temp_zone_; } |
226 CommonOperatorBuilder* common() const; | 137 CommonOperatorBuilder* common() const; |
227 SimplifiedOperatorBuilder* simplified() const; | 138 SimplifiedOperatorBuilder* simplified() const; |
228 MachineOperatorBuilder* machine() const; | 139 MachineOperatorBuilder* machine() const; |
229 | 140 |
230 Operator const* ToNumberOperator(); | 141 GraphAssembler* gasm() { return &graph_assembler_; } |
231 | 142 |
232 JSGraph* js_graph_; | 143 JSGraph* js_graph_; |
233 Schedule* schedule_; | 144 Schedule* schedule_; |
234 Zone* temp_zone_; | 145 Zone* temp_zone_; |
235 RegionObservability region_observability_ = RegionObservability::kObservable; | 146 RegionObservability region_observability_ = RegionObservability::kObservable; |
236 SourcePositionTable* source_positions_; | 147 SourcePositionTable* source_positions_; |
237 | 148 GraphAssembler graph_assembler_; |
238 SetOncePointer<Operator const> to_number_operator_; | |
239 }; | 149 }; |
240 | 150 |
241 } // namespace compiler | 151 } // namespace compiler |
242 } // namespace internal | 152 } // namespace internal |
243 } // namespace v8 | 153 } // namespace v8 |
244 | 154 |
245 #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ | 155 #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ |
OLD | NEW |