V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
effect-control-linearizer.h
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 
41  void Run();
42 
43  private:
44  void ProcessNode(Node* node, Node** frame_state, Node** effect,
45  Node** control);
46 
47  bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
48  Node** control);
49  Node* LowerChangeBitToTagged(Node* node);
50  Node* LowerChangeInt31ToTaggedSigned(Node* node);
51  Node* LowerChangeInt32ToTagged(Node* node);
52  Node* LowerChangeInt64ToTagged(Node* node);
53  Node* LowerChangeUint32ToTagged(Node* node);
54  Node* LowerChangeUint64ToTagged(Node* node);
55  Node* LowerChangeFloat64ToTagged(Node* node);
56  Node* LowerChangeFloat64ToTaggedPointer(Node* node);
57  Node* LowerChangeTaggedSignedToInt32(Node* node);
58  Node* LowerChangeTaggedSignedToInt64(Node* node);
59  Node* LowerChangeTaggedToBit(Node* node);
60  Node* LowerChangeTaggedToInt32(Node* node);
61  Node* LowerChangeTaggedToUint32(Node* node);
62  Node* LowerChangeTaggedToInt64(Node* node);
63  Node* LowerChangeTaggedToTaggedSigned(Node* node);
64  Node* LowerPoisonIndex(Node* node);
65  Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
66  void LowerCheckMaps(Node* node, Node* frame_state);
67  Node* LowerCompareMaps(Node* node);
68  Node* LowerCheckNumber(Node* node, Node* frame_state);
69  Node* LowerCheckReceiver(Node* node, Node* frame_state);
70  Node* LowerCheckReceiverOrNullOrUndefined(Node* node, Node* frame_state);
71  Node* LowerCheckString(Node* node, Node* frame_state);
72  Node* LowerCheckSymbol(Node* node, Node* frame_state);
73  void LowerCheckIf(Node* node, Node* frame_state);
74  Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
75  Node* LowerCheckedInt32Sub(Node* node, Node* frame_state);
76  Node* LowerCheckedInt32Div(Node* node, Node* frame_state);
77  Node* LowerCheckedInt32Mod(Node* node, Node* frame_state);
78  Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
79  Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
80  Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
81  Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
82  Node* LowerCheckedInt64ToInt32(Node* node, Node* frame_state);
83  Node* LowerCheckedInt64ToTaggedSigned(Node* node, Node* frame_state);
84  Node* LowerCheckedUint32Bounds(Node* node, Node* frame_state);
85  Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state);
86  Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
87  Node* LowerCheckedUint64Bounds(Node* node, Node* frame_state);
88  Node* LowerCheckedUint64ToInt32(Node* node, Node* frame_state);
89  Node* LowerCheckedUint64ToTaggedSigned(Node* node, Node* frame_state);
90  Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
91  Node* LowerCheckedFloat64ToInt64(Node* node, Node* frame_state);
92  Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state);
93  Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state);
94  Node* LowerCheckedTaggedToInt64(Node* node, Node* frame_state);
95  Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state);
96  Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state);
97  Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state);
98  Node* LowerChangeTaggedToFloat64(Node* node);
99  void TruncateTaggedPointerToBit(Node* node, GraphAssemblerLabel<1>* done);
100  Node* LowerTruncateTaggedToBit(Node* node);
101  Node* LowerTruncateTaggedPointerToBit(Node* node);
102  Node* LowerTruncateTaggedToFloat64(Node* node);
103  Node* LowerTruncateTaggedToWord32(Node* node);
104  Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state);
105  Node* LowerAllocate(Node* node);
106  Node* LowerNumberToString(Node* node);
107  Node* LowerObjectIsArrayBufferView(Node* node);
108  Node* LowerObjectIsBigInt(Node* node);
109  Node* LowerObjectIsCallable(Node* node);
110  Node* LowerObjectIsConstructor(Node* node);
111  Node* LowerObjectIsDetectableCallable(Node* node);
112  Node* LowerObjectIsMinusZero(Node* node);
113  Node* LowerNumberIsMinusZero(Node* node);
114  Node* LowerObjectIsNaN(Node* node);
115  Node* LowerNumberIsNaN(Node* node);
116  Node* LowerObjectIsNonCallable(Node* node);
117  Node* LowerObjectIsNumber(Node* node);
118  Node* LowerObjectIsReceiver(Node* node);
119  Node* LowerObjectIsSmi(Node* node);
120  Node* LowerObjectIsString(Node* node);
121  Node* LowerObjectIsSymbol(Node* node);
122  Node* LowerObjectIsUndetectable(Node* node);
123  Node* LowerNumberIsFloat64Hole(Node* node);
124  Node* LowerNumberIsFinite(Node* node);
125  Node* LowerObjectIsFiniteNumber(Node* node);
126  Node* LowerNumberIsInteger(Node* node);
127  Node* LowerObjectIsInteger(Node* node);
128  Node* LowerNumberIsSafeInteger(Node* node);
129  Node* LowerObjectIsSafeInteger(Node* node);
130  Node* LowerArgumentsFrame(Node* node);
131  Node* LowerArgumentsLength(Node* node);
132  Node* LowerNewDoubleElements(Node* node);
133  Node* LowerNewSmiOrObjectElements(Node* node);
134  Node* LowerNewArgumentsElements(Node* node);
135  Node* LowerNewConsString(Node* node);
136  Node* LowerSameValue(Node* node);
137  Node* LowerDeadValue(Node* node);
138  Node* LowerStringConcat(Node* node);
139  Node* LowerStringToNumber(Node* node);
140  Node* LowerStringCharCodeAt(Node* node);
141  Node* LowerStringCodePointAt(Node* node, UnicodeEncoding encoding);
142  Node* LowerStringToLowerCaseIntl(Node* node);
143  Node* LowerStringToUpperCaseIntl(Node* node);
144  Node* LowerStringFromSingleCharCode(Node* node);
145  Node* LowerStringFromSingleCodePoint(Node* node);
146  Node* LowerStringIndexOf(Node* node);
147  Node* LowerStringSubstring(Node* node);
148  Node* LowerStringLength(Node* node);
149  Node* LowerStringEqual(Node* node);
150  Node* LowerStringLessThan(Node* node);
151  Node* LowerStringLessThanOrEqual(Node* node);
152  Node* LowerCheckFloat64Hole(Node* node, Node* frame_state);
153  Node* LowerCheckNotTaggedHole(Node* node, Node* frame_state);
154  Node* LowerConvertTaggedHoleToUndefined(Node* node);
155  void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state);
156  void LowerCheckEqualsSymbol(Node* node, Node* frame_state);
157  Node* LowerTypeOf(Node* node);
158  Node* LowerToBoolean(Node* node);
159  Node* LowerPlainPrimitiveToNumber(Node* node);
160  Node* LowerPlainPrimitiveToWord32(Node* node);
161  Node* LowerPlainPrimitiveToFloat64(Node* node);
162  Node* LowerEnsureWritableFastElements(Node* node);
163  Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state);
164  void LowerTransitionElementsKind(Node* node);
165  Node* LowerLoadFieldByIndex(Node* node);
166  Node* LowerLoadTypedElement(Node* node);
167  Node* LowerLoadDataViewElement(Node* node);
168  void LowerStoreTypedElement(Node* node);
169  void LowerStoreDataViewElement(Node* node);
170  void LowerStoreSignedSmallElement(Node* node);
171  Node* LowerFindOrderedHashMapEntry(Node* node);
172  Node* LowerFindOrderedHashMapEntryForInt32Key(Node* node);
173  void LowerTransitionAndStoreElement(Node* node);
174  void LowerTransitionAndStoreNumberElement(Node* node);
175  void LowerTransitionAndStoreNonNumberElement(Node* node);
176  void LowerRuntimeAbort(Node* node);
177  Node* LowerConvertReceiver(Node* node);
178  Node* LowerDateNow(Node* node);
179 
180  // Lowering of optional operators.
181  Maybe<Node*> LowerFloat64RoundUp(Node* node);
182  Maybe<Node*> LowerFloat64RoundDown(Node* node);
183  Maybe<Node*> LowerFloat64RoundTiesEven(Node* node);
184  Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
185 
186  Node* AllocateHeapNumberWithValue(Node* node);
187  Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
188  const VectorSlotPair& feedback, Node* value,
189  Node* frame_state);
190  Node* BuildCheckedFloat64ToInt64(CheckForMinusZeroMode mode,
191  const VectorSlotPair& feedback, Node* value,
192  Node* frame_state);
193  Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode,
194  const VectorSlotPair& feedback,
195  Node* value,
196  Node* frame_state);
197  Node* BuildReverseBytes(ExternalArrayType type, Node* value);
198  Node* BuildFloat64RoundDown(Node* value);
199  Node* BuildFloat64RoundTruncate(Node* input);
200  Node* BuildUint32Mod(Node* lhs, Node* rhs);
201  Node* ComputeUnseededHash(Node* value);
202  Node* LowerStringComparison(Callable const& callable, Node* node);
203  Node* IsElementsKindGreaterThan(Node* kind, ElementsKind reference_kind);
204 
205  Node* ChangeInt32ToSmi(Node* value);
206  Node* ChangeInt32ToIntPtr(Node* value);
207  Node* ChangeInt64ToSmi(Node* value);
208  Node* ChangeIntPtrToInt32(Node* value);
209  Node* ChangeIntPtrToSmi(Node* value);
210  Node* ChangeUint32ToUintPtr(Node* value);
211  Node* ChangeUint32ToSmi(Node* value);
212  Node* ChangeSmiToIntPtr(Node* value);
213  Node* ChangeSmiToInt32(Node* value);
214  Node* ChangeSmiToInt64(Node* value);
215  Node* ObjectIsSmi(Node* value);
216  Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte);
217 
218  Node* SmiMaxValueConstant();
219  Node* SmiShiftBitsConstant();
220  void TransitionElementsTo(Node* node, Node* array, ElementsKind from,
221  ElementsKind to);
222 
223  Factory* factory() const;
224  Isolate* isolate() const;
225  JSGraph* jsgraph() const { return js_graph_; }
226  Graph* graph() const;
227  Schedule* schedule() const { return schedule_; }
228  Zone* temp_zone() const { return temp_zone_; }
229  CommonOperatorBuilder* common() const;
230  SimplifiedOperatorBuilder* simplified() const;
231  MachineOperatorBuilder* machine() const;
232 
233  GraphAssembler* gasm() { return &graph_assembler_; }
234 
235  JSGraph* js_graph_;
236  Schedule* schedule_;
237  Zone* temp_zone_;
238  MaskArrayIndexEnable mask_array_index_;
239  RegionObservability region_observability_ = RegionObservability::kObservable;
240  SourcePositionTable* source_positions_;
241  NodeOriginTable* node_origins_;
242  GraphAssembler graph_assembler_;
243  Node* frame_state_zapper_; // For tracking down compiler::Node::New crashes.
244 };
245 
246 } // namespace compiler
247 } // namespace internal
248 } // namespace v8
249 
250 #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
Definition: v8.h:56
Definition: libplatform.h:13