Line data Source code
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
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
6 : #define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
7 :
8 : #include "src/compiler/common-operator.h"
9 : #include "src/compiler/graph-assembler.h"
10 : #include "src/compiler/node.h"
11 : #include "src/compiler/simplified-operator.h"
12 : #include "src/globals.h"
13 :
14 : namespace v8 {
15 : namespace internal {
16 :
17 : // Forward declarations.
18 : class Callable;
19 : class Zone;
20 :
21 : namespace compiler {
22 :
23 : class CommonOperatorBuilder;
24 : class SimplifiedOperatorBuilder;
25 : class MachineOperatorBuilder;
26 : class JSGraph;
27 : class Graph;
28 : class Schedule;
29 : class SourcePositionTable;
30 : class NodeOriginTable;
31 :
32 : class V8_EXPORT_PRIVATE EffectControlLinearizer {
33 : public:
34 : enum MaskArrayIndexEnable { kDoNotMaskArrayIndex, kMaskArrayIndex };
35 :
36 : EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
37 : SourcePositionTable* source_positions,
38 : NodeOriginTable* node_origins,
39 : MaskArrayIndexEnable mask_array_index,
40 : std::vector<Handle<Map>>* embedded_maps);
41 :
42 : void Run();
43 :
44 : private:
45 : void ProcessNode(Node* node, Node** frame_state, Node** effect,
46 : Node** control);
47 :
48 : bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
49 : Node** control);
50 : Node* LowerChangeBitToTagged(Node* node);
51 : Node* LowerChangeInt31ToTaggedSigned(Node* node);
52 : Node* LowerChangeInt32ToTagged(Node* node);
53 : Node* LowerChangeInt64ToTagged(Node* node);
54 : Node* LowerChangeUint32ToTagged(Node* node);
55 : Node* LowerChangeUint64ToTagged(Node* node);
56 : Node* LowerChangeFloat64ToTagged(Node* node);
57 : Node* LowerChangeFloat64ToTaggedPointer(Node* node);
58 : Node* LowerChangeTaggedSignedToInt32(Node* node);
59 : Node* LowerChangeTaggedSignedToInt64(Node* node);
60 : Node* LowerChangeTaggedToBit(Node* node);
61 : Node* LowerChangeTaggedToInt32(Node* node);
62 : Node* LowerChangeTaggedToUint32(Node* node);
63 : Node* LowerChangeTaggedToInt64(Node* node);
64 : Node* LowerChangeTaggedToTaggedSigned(Node* node);
65 : Node* LowerChangeCompressedToTaggedSigned(Node* node);
66 : Node* LowerChangeTaggedToCompressedSigned(Node* node);
67 : Node* LowerPoisonIndex(Node* node);
68 : Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
69 : Node* LowerCheckNonEmptyOneByteString(Node* node, Node* frame_state);
70 : Node* LowerCheckNonEmptyTwoByteString(Node* node, Node* frame_state);
71 : Node* LowerCheckNonEmptyString(Node* node, Node* frame_state);
72 : void LowerCheckMaps(Node* node, Node* frame_state);
73 : Node* LowerCompareMaps(Node* node);
74 : Node* LowerCheckNumber(Node* node, Node* frame_state);
75 : Node* LowerCheckReceiver(Node* node, Node* frame_state);
76 : Node* LowerCheckReceiverOrNullOrUndefined(Node* node, Node* frame_state);
77 : Node* LowerCheckString(Node* node, Node* frame_state);
78 : Node* LowerCheckSymbol(Node* node, Node* frame_state);
79 : void LowerCheckIf(Node* node, Node* frame_state);
80 : Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
81 : Node* LowerCheckedInt32Sub(Node* node, Node* frame_state);
82 : Node* LowerCheckedInt32Div(Node* node, Node* frame_state);
83 : Node* LowerCheckedInt32Mod(Node* node, Node* frame_state);
84 : Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
85 : Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
86 : Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
87 : Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
88 : Node* LowerCheckedInt64ToInt32(Node* node, Node* frame_state);
89 : Node* LowerCheckedInt64ToTaggedSigned(Node* node, Node* frame_state);
90 : Node* LowerCheckedUint32Bounds(Node* node, Node* frame_state);
91 : Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state);
92 : Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
93 : Node* LowerCheckedUint64Bounds(Node* node, Node* frame_state);
94 : Node* LowerCheckedUint64ToInt32(Node* node, Node* frame_state);
95 : Node* LowerCheckedUint64ToTaggedSigned(Node* node, Node* frame_state);
96 : Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
97 : Node* LowerCheckedFloat64ToInt64(Node* node, Node* frame_state);
98 : Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state);
99 : Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state);
100 : Node* LowerCheckedTaggedToInt64(Node* node, Node* frame_state);
101 : Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state);
102 : Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state);
103 : Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state);
104 : Node* LowerCheckedCompressedToTaggedSigned(Node* node, Node* frame_state);
105 : Node* LowerCheckedCompressedToTaggedPointer(Node* node, Node* frame_state);
106 : Node* LowerCheckedTaggedToCompressedSigned(Node* node, Node* frame_state);
107 : Node* LowerCheckedTaggedToCompressedPointer(Node* node, Node* frame_state);
108 : Node* LowerChangeTaggedToFloat64(Node* node);
109 : void TruncateTaggedPointerToBit(Node* node, GraphAssemblerLabel<1>* done);
110 : Node* LowerTruncateTaggedToBit(Node* node);
111 : Node* LowerTruncateTaggedPointerToBit(Node* node);
112 : Node* LowerTruncateTaggedToFloat64(Node* node);
113 : Node* LowerTruncateTaggedToWord32(Node* node);
114 : Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state);
115 : Node* LowerAllocate(Node* node);
116 : Node* LowerNumberToString(Node* node);
117 : Node* LowerObjectIsArrayBufferView(Node* node);
118 : Node* LowerObjectIsBigInt(Node* node);
119 : Node* LowerObjectIsCallable(Node* node);
120 : Node* LowerObjectIsConstructor(Node* node);
121 : Node* LowerObjectIsDetectableCallable(Node* node);
122 : Node* LowerObjectIsMinusZero(Node* node);
123 : Node* LowerNumberIsMinusZero(Node* node);
124 : Node* LowerObjectIsNaN(Node* node);
125 : Node* LowerNumberIsNaN(Node* node);
126 : Node* LowerObjectIsNonCallable(Node* node);
127 : Node* LowerObjectIsNumber(Node* node);
128 : Node* LowerObjectIsReceiver(Node* node);
129 : Node* LowerObjectIsSmi(Node* node);
130 : Node* LowerObjectIsString(Node* node);
131 : Node* LowerObjectIsSymbol(Node* node);
132 : Node* LowerObjectIsUndetectable(Node* node);
133 : Node* LowerNumberIsFloat64Hole(Node* node);
134 : Node* LowerNumberIsFinite(Node* node);
135 : Node* LowerObjectIsFiniteNumber(Node* node);
136 : Node* LowerNumberIsInteger(Node* node);
137 : Node* LowerObjectIsInteger(Node* node);
138 : Node* LowerNumberIsSafeInteger(Node* node);
139 : Node* LowerObjectIsSafeInteger(Node* node);
140 : Node* LowerArgumentsFrame(Node* node);
141 : Node* LowerArgumentsLength(Node* node);
142 : Node* LowerNewDoubleElements(Node* node);
143 : Node* LowerNewSmiOrObjectElements(Node* node);
144 : Node* LowerNewArgumentsElements(Node* node);
145 : Node* LowerNewConsOneByteString(Node* node);
146 : Node* LowerNewConsTwoByteString(Node* node);
147 : Node* LowerNewConsString(Node* node);
148 : Node* LowerSameValue(Node* node);
149 : Node* LowerNumberSameValue(Node* node);
150 : Node* LowerDeadValue(Node* node);
151 : Node* LowerStringConcat(Node* node);
152 : Node* LowerStringToNumber(Node* node);
153 : Node* LowerStringCharCodeAt(Node* node);
154 : Node* LowerStringCodePointAt(Node* node, UnicodeEncoding encoding);
155 : Node* LowerStringToLowerCaseIntl(Node* node);
156 : Node* LowerStringToUpperCaseIntl(Node* node);
157 : Node* LowerStringFromSingleCharCode(Node* node);
158 : Node* LowerStringFromSingleCodePoint(Node* node);
159 : Node* LowerStringIndexOf(Node* node);
160 : Node* LowerStringSubstring(Node* node);
161 : Node* LowerStringLength(Node* node);
162 : Node* LowerStringEqual(Node* node);
163 : Node* LowerStringLessThan(Node* node);
164 : Node* LowerStringLessThanOrEqual(Node* node);
165 : Node* LowerCheckFloat64Hole(Node* node, Node* frame_state);
166 : Node* LowerCheckNotTaggedHole(Node* node, Node* frame_state);
167 : Node* LowerConvertTaggedHoleToUndefined(Node* node);
168 : void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state);
169 : void LowerCheckEqualsSymbol(Node* node, Node* frame_state);
170 : Node* LowerTypeOf(Node* node);
171 : Node* LowerToBoolean(Node* node);
172 : Node* LowerPlainPrimitiveToNumber(Node* node);
173 : Node* LowerPlainPrimitiveToWord32(Node* node);
174 : Node* LowerPlainPrimitiveToFloat64(Node* node);
175 : Node* LowerEnsureWritableFastElements(Node* node);
176 : Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state);
177 : void LowerTransitionElementsKind(Node* node);
178 : Node* LowerLoadFieldByIndex(Node* node);
179 : Node* LowerLoadMessage(Node* node);
180 : Node* LowerLoadTypedElement(Node* node);
181 : Node* LowerLoadDataViewElement(Node* node);
182 : Node* LowerLoadStackArgument(Node* node);
183 : void LowerStoreMessage(Node* node);
184 : void LowerStoreTypedElement(Node* node);
185 : void LowerStoreDataViewElement(Node* node);
186 : void LowerStoreSignedSmallElement(Node* node);
187 : Node* LowerFindOrderedHashMapEntry(Node* node);
188 : Node* LowerFindOrderedHashMapEntryForInt32Key(Node* node);
189 : void LowerTransitionAndStoreElement(Node* node);
190 : void LowerTransitionAndStoreNumberElement(Node* node);
191 : void LowerTransitionAndStoreNonNumberElement(Node* node);
192 : void LowerRuntimeAbort(Node* node);
193 : Node* LowerConvertReceiver(Node* node);
194 : Node* LowerDateNow(Node* node);
195 :
196 : // Lowering of optional operators.
197 : Maybe<Node*> LowerFloat64RoundUp(Node* node);
198 : Maybe<Node*> LowerFloat64RoundDown(Node* node);
199 : Maybe<Node*> LowerFloat64RoundTiesEven(Node* node);
200 : Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
201 :
202 : Node* AllocateHeapNumberWithValue(Node* node);
203 : Node* AllocateConsString(Node* map, Node* length, Node* first, Node* second);
204 : Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
205 : const VectorSlotPair& feedback, Node* value,
206 : Node* frame_state);
207 : Node* BuildCheckedFloat64ToInt64(CheckForMinusZeroMode mode,
208 : const VectorSlotPair& feedback, Node* value,
209 : Node* frame_state);
210 : Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode,
211 : const VectorSlotPair& feedback,
212 : Node* value,
213 : Node* frame_state);
214 : Node* BuildReverseBytes(ExternalArrayType type, Node* value);
215 : Node* BuildFloat64RoundDown(Node* value);
216 : Node* BuildFloat64RoundTruncate(Node* input);
217 : Node* BuildUint32Mod(Node* lhs, Node* rhs);
218 : Node* ComputeUnseededHash(Node* value);
219 : Node* LowerStringComparison(Callable const& callable, Node* node);
220 : Node* IsElementsKindGreaterThan(Node* kind, ElementsKind reference_kind);
221 :
222 : Node* ChangeInt32ToSmi(Node* value);
223 : Node* ChangeInt32ToIntPtr(Node* value);
224 : Node* ChangeInt64ToSmi(Node* value);
225 : Node* ChangeIntPtrToInt32(Node* value);
226 : Node* ChangeIntPtrToSmi(Node* value);
227 : Node* ChangeUint32ToUintPtr(Node* value);
228 : Node* ChangeUint32ToSmi(Node* value);
229 : Node* ChangeSmiToIntPtr(Node* value);
230 : Node* ChangeSmiToInt32(Node* value);
231 : Node* ChangeSmiToInt64(Node* value);
232 : Node* ObjectIsSmi(Node* value);
233 : Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte);
234 :
235 : Node* SmiMaxValueConstant();
236 : Node* SmiShiftBitsConstant();
237 : void TransitionElementsTo(Node* node, Node* array, ElementsKind from,
238 : ElementsKind to);
239 :
240 : Factory* factory() const;
241 : Isolate* isolate() const;
242 : JSGraph* jsgraph() const { return js_graph_; }
243 : Graph* graph() const;
244 : Schedule* schedule() const { return schedule_; }
245 : Zone* temp_zone() const { return temp_zone_; }
246 : CommonOperatorBuilder* common() const;
247 : SimplifiedOperatorBuilder* simplified() const;
248 : MachineOperatorBuilder* machine() const;
249 : std::vector<Handle<Map>>* embedded_maps() { return embedded_maps_; }
250 :
251 37688459 : GraphAssembler* gasm() { return &graph_assembler_; }
252 :
253 : JSGraph* js_graph_;
254 : Schedule* schedule_;
255 : Zone* temp_zone_;
256 : MaskArrayIndexEnable mask_array_index_;
257 : RegionObservability region_observability_ = RegionObservability::kObservable;
258 : SourcePositionTable* source_positions_;
259 : NodeOriginTable* node_origins_;
260 : GraphAssembler graph_assembler_;
261 : Node* frame_state_zapper_; // For tracking down compiler::Node::New crashes.
262 :
263 : // embedded_maps_ keeps track of maps we've embedded as Uint32 constants.
264 : // We do this in order to notify the garbage collector at code-gen time.
265 : std::vector<Handle<Map>>* embedded_maps_;
266 : };
267 :
268 : } // namespace compiler
269 : } // namespace internal
270 : } // namespace v8
271 :
272 : #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
|