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/node.h"
10 #include "src/compiler/simplified-operator.h"
11 #include "src/globals.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 // Forward declarations.
17 class Callable;
18 class Zone;
19 
20 namespace compiler {
21 
22 class CommonOperatorBuilder;
23 class SimplifiedOperatorBuilder;
24 class MachineOperatorBuilder;
25 class JSGraph;
26 class Graph;
27 class Schedule;
28 class SourcePositionTable;
29 
30 class V8_EXPORT_PRIVATE EffectControlLinearizer {
31  public:
32   EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
33                           SourcePositionTable* source_positions);
34 
35   void Run();
36 
37  private:
38   void ProcessNode(Node* node, Node** frame_state, Node** effect,
39                    Node** control);
40 
41   struct ValueEffectControl {
42     Node* value;
43     Node* effect;
44     Node* control;
ValueEffectControlValueEffectControl45     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,
50                             Node** control);
51   ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect,
52                                             Node* control);
53   ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect,
54                                                     Node* control);
55   ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect,
56                                               Node* control);
57   ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect,
58                                                Node* control);
59   ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect,
60                                                 Node* control);
61   ValueEffectControl LowerChangeFloat64ToTaggedPointer(Node* node, Node* effect,
62                                                        Node* control);
63   ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect,
64                                                     Node* control);
65   ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect,
66                                             Node* control);
67   ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect,
68                                               Node* control);
69   ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect,
70                                                Node* control);
71   ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state,
72                                       Node* effect, Node* control);
73   ValueEffectControl LowerCheckMaps(Node* node, Node* frame_state, Node* effect,
74                                     Node* control);
75   ValueEffectControl LowerCheckNumber(Node* node, Node* frame_state,
76                                       Node* effect, Node* control);
77   ValueEffectControl LowerCheckString(Node* node, Node* frame_state,
78                                       Node* effect, Node* control);
79   ValueEffectControl LowerCheckIf(Node* node, Node* frame_state, Node* effect,
80                                   Node* control);
81   ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state,
82                                           Node* effect, Node* control);
83   ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state,
84                                           Node* effect, Node* control);
85   ValueEffectControl LowerCheckedInt32Div(Node* node, Node* frame_state,
86                                           Node* effect, Node* control);
87   ValueEffectControl LowerCheckedInt32Mod(Node* node, Node* frame_state,
88                                           Node* effect, Node* control);
89   ValueEffectControl LowerCheckedUint32Div(Node* node, Node* frame_state,
90                                            Node* effect, Node* control);
91   ValueEffectControl LowerCheckedUint32Mod(Node* node, Node* frame_state,
92                                            Node* effect, Node* control);
93   ValueEffectControl LowerCheckedInt32Mul(Node* node, Node* frame_state,
94                                           Node* effect, Node* control);
95   ValueEffectControl LowerCheckedInt32ToTaggedSigned(Node* node,
96                                                      Node* frame_state,
97                                                      Node* effect,
98                                                      Node* control);
99   ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state,
100                                                Node* effect, Node* control);
101   ValueEffectControl LowerCheckedUint32ToTaggedSigned(Node* node,
102                                                       Node* frame_state,
103                                                       Node* effect,
104                                                       Node* control);
105   ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state,
106                                                 Node* effect, Node* control);
107   ValueEffectControl LowerCheckedTaggedSignedToInt32(Node* node,
108                                                      Node* frame_state,
109                                                      Node* effect,
110                                                      Node* control);
111   ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state,
112                                                Node* effect, Node* control);
113   ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state,
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 LowerArrayBufferWasNeutered(Node* node, Node* effect,
147                                                  Node* control);
148   ValueEffectControl LowerStringCharCodeAt(Node* node, Node* effect,
149                                            Node* control);
150   ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect,
151                                              Node* control);
152   ValueEffectControl LowerStringFromCodePoint(Node* node, Node* effect,
153                                               Node* control);
154   ValueEffectControl LowerStringEqual(Node* node, Node* effect, Node* control);
155   ValueEffectControl LowerStringLessThan(Node* node, Node* effect,
156                                          Node* control);
157   ValueEffectControl LowerStringLessThanOrEqual(Node* node, Node* effect,
158                                                 Node* control);
159   ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state,
160                                            Node* effect, Node* control);
161   ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state,
162                                           Node* effect, Node* control);
163   ValueEffectControl LowerConvertTaggedHoleToUndefined(Node* node, Node* effect,
164                                                        Node* control);
165   ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect,
166                                                  Node* control);
167   ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect,
168                                                  Node* control);
169   ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect,
170                                                   Node* control);
171   ValueEffectControl LowerEnsureWritableFastElements(Node* node, Node* effect,
172                                                      Node* control);
173   ValueEffectControl LowerMaybeGrowFastElements(Node* node, Node* frame_state,
174                                                 Node* effect, Node* control);
175   ValueEffectControl LowerTransitionElementsKind(Node* node, Node* effect,
176                                                  Node* control);
177   ValueEffectControl LowerLoadTypedElement(Node* node, Node* effect,
178                                            Node* control);
179   ValueEffectControl LowerStoreTypedElement(Node* node, Node* effect,
180                                             Node* control);
181 
182   // Lowering of optional operators.
183   ValueEffectControl LowerFloat64RoundUp(Node* node, Node* effect,
184                                          Node* control);
185   ValueEffectControl LowerFloat64RoundDown(Node* node, Node* effect,
186                                            Node* control);
187   ValueEffectControl LowerFloat64RoundTiesEven(Node* node, Node* effect,
188                                                Node* control);
189   ValueEffectControl LowerFloat64RoundTruncate(Node* node, Node* effect,
190                                                Node* control);
191 
192   ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect,
193                                                  Node* control);
194   ValueEffectControl BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
195                                                 Node* value, Node* frame_state,
196                                                 Node* effect, Node* control);
197   ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64(
198       CheckTaggedInputMode mode, Node* value, Node* frame_state, Node* effect,
199       Node* control);
200   ValueEffectControl BuildFloat64RoundDown(Node* value, Node* effect,
201                                            Node* control);
202   ValueEffectControl LowerStringComparison(Callable const& callable, Node* node,
203                                            Node* effect, Node* control);
204 
205   Node* ChangeInt32ToSmi(Node* value);
206   Node* ChangeUint32ToSmi(Node* value);
207   Node* ChangeInt32ToFloat64(Node* value);
208   Node* ChangeUint32ToFloat64(Node* value);
209   Node* ChangeSmiToInt32(Node* value);
210   Node* ObjectIsSmi(Node* value);
211 
212   Node* SmiMaxValueConstant();
213   Node* SmiShiftBitsConstant();
214 
215   Factory* factory() const;
216   Isolate* isolate() const;
jsgraph()217   JSGraph* jsgraph() const { return js_graph_; }
218   Graph* graph() const;
schedule()219   Schedule* schedule() const { return schedule_; }
temp_zone()220   Zone* temp_zone() const { return temp_zone_; }
221   CommonOperatorBuilder* common() const;
222   SimplifiedOperatorBuilder* simplified() const;
223   MachineOperatorBuilder* machine() const;
224 
225   Operator const* ToNumberOperator();
226 
227   JSGraph* js_graph_;
228   Schedule* schedule_;
229   Zone* temp_zone_;
230   RegionObservability region_observability_ = RegionObservability::kObservable;
231   SourcePositionTable* source_positions_;
232 
233   SetOncePointer<Operator const> to_number_operator_;
234 };
235 
236 }  // namespace compiler
237 }  // namespace internal
238 }  // namespace v8
239 
240 #endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
241