blob: 98f08c7b12e75865ec3e80c6d5f15a5637b3008d [file] [log] [blame]
Ben Murdochbcf72ee2016-08-08 18:44:38 +01001// 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
12namespace v8 {
13namespace internal {
14
15class Zone;
16
17namespace compiler {
18
19class CommonOperatorBuilder;
20class SimplifiedOperatorBuilder;
21class MachineOperatorBuilder;
22class JSGraph;
23class Graph;
24class Schedule;
25
26class EffectControlLinearizer {
27 public:
28 EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone);
29
30 void Run();
31
32 private:
Ben Murdoch13e2dad2016-09-16 13:49:30 +010033 void ProcessNode(Node* node, Node** frame_state, Node** effect,
34 Node** control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +010035
36 struct ValueEffectControl {
37 Node* value;
38 Node* effect;
39 Node* control;
40 ValueEffectControl(Node* value, Node* effect, Node* control)
41 : value(value), effect(effect), control(control) {}
42 };
43
Ben Murdoch13e2dad2016-09-16 13:49:30 +010044 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
45 Node** control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +010046 ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect,
47 Node* control);
48 ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect,
49 Node* control);
50 ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect,
51 Node* control);
52 ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect,
53 Node* control);
54 ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect,
55 Node* control);
56 ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect,
57 Node* control);
58 ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect,
59 Node* control);
60 ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect,
61 Node* control);
62 ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect,
63 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +010064 ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state,
65 Node* effect, Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +000066 ValueEffectControl LowerCheckMaps(Node* node, Node* frame_state, Node* effect,
67 Node* control);
68 ValueEffectControl LowerCheckNumber(Node* node, Node* frame_state,
69 Node* effect, Node* control);
70 ValueEffectControl LowerCheckString(Node* node, Node* frame_state,
71 Node* effect, Node* control);
72 ValueEffectControl LowerCheckIf(Node* node, Node* frame_state, Node* effect,
73 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +010074 ValueEffectControl LowerCheckTaggedPointer(Node* node, Node* frame_state,
75 Node* effect, Node* control);
76 ValueEffectControl LowerCheckTaggedSigned(Node* node, Node* frame_state,
77 Node* effect, Node* control);
78 ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state,
79 Node* effect, Node* control);
80 ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state,
81 Node* effect, Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +000082 ValueEffectControl LowerCheckedInt32Div(Node* node, Node* frame_state,
83 Node* effect, Node* control);
84 ValueEffectControl LowerCheckedInt32Mod(Node* node, Node* frame_state,
85 Node* effect, Node* control);
86 ValueEffectControl LowerCheckedUint32Div(Node* node, Node* frame_state,
87 Node* effect, Node* control);
88 ValueEffectControl LowerCheckedUint32Mod(Node* node, Node* frame_state,
89 Node* effect, Node* control);
90 ValueEffectControl LowerCheckedInt32Mul(Node* node, Node* frame_state,
91 Node* effect, Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +010092 ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state,
93 Node* effect, Node* control);
94 ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state,
95 Node* effect, Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +000096 ValueEffectControl LowerCheckedTaggedSignedToInt32(Node* node,
97 Node* frame_state,
98 Node* effect,
99 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100100 ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state,
101 Node* effect, Node* control);
102 ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state,
103 Node* effect, Node* control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100104 ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect,
105 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100106 ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect,
107 Node* control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100108 ValueEffectControl LowerTruncateTaggedToWord32(Node* node, Node* effect,
109 Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000110 ValueEffectControl LowerCheckedTruncateTaggedToWord32(Node* node,
111 Node* frame_state,
112 Node* effect,
113 Node* control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100114 ValueEffectControl LowerObjectIsCallable(Node* node, Node* effect,
115 Node* control);
116 ValueEffectControl LowerObjectIsNumber(Node* node, Node* effect,
117 Node* control);
118 ValueEffectControl LowerObjectIsReceiver(Node* node, Node* effect,
119 Node* control);
120 ValueEffectControl LowerObjectIsSmi(Node* node, Node* effect, Node* control);
121 ValueEffectControl LowerObjectIsString(Node* node, Node* effect,
122 Node* control);
123 ValueEffectControl LowerObjectIsUndetectable(Node* node, Node* effect,
124 Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000125 ValueEffectControl LowerStringCharCodeAt(Node* node, Node* effect,
126 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100127 ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect,
128 Node* control);
129 ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state,
130 Node* effect, Node* control);
131 ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state,
132 Node* effect, Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000133 ValueEffectControl LowerConvertTaggedHoleToUndefined(Node* node, Node* effect,
134 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100135 ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect,
136 Node* control);
137 ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect,
138 Node* control);
139 ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect,
140 Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000141 ValueEffectControl LowerEnsureWritableFastElements(Node* node, Node* effect,
142 Node* control);
143 ValueEffectControl LowerMaybeGrowFastElements(Node* node, Node* frame_state,
144 Node* effect, Node* control);
145 ValueEffectControl LowerTransitionElementsKind(Node* node, Node* effect,
146 Node* control);
147 ValueEffectControl LowerLoadTypedElement(Node* node, Node* effect,
148 Node* control);
149 ValueEffectControl LowerStoreTypedElement(Node* node, Node* effect,
150 Node* control);
151
152 // Lowering of optional operators.
153 ValueEffectControl LowerFloat64RoundUp(Node* node, Node* effect,
154 Node* control);
155 ValueEffectControl LowerFloat64RoundDown(Node* node, Node* effect,
156 Node* control);
157 ValueEffectControl LowerFloat64RoundTruncate(Node* node, Node* effect,
158 Node* control);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100159
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100160 ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect,
161 Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000162 ValueEffectControl BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
163 Node* value, Node* frame_state,
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100164 Node* effect, Node* control);
Ben Murdochf91f0612016-11-29 16:50:11 +0000165 ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64(
166 CheckTaggedInputMode mode, Node* value, Node* frame_state, Node* effect,
167 Node* control);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100168
169 Node* ChangeInt32ToSmi(Node* value);
170 Node* ChangeUint32ToSmi(Node* value);
171 Node* ChangeInt32ToFloat64(Node* value);
172 Node* ChangeUint32ToFloat64(Node* value);
173 Node* ChangeSmiToInt32(Node* value);
174 Node* ObjectIsSmi(Node* value);
175
176 Node* SmiMaxValueConstant();
177 Node* SmiShiftBitsConstant();
178
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100179 Factory* factory() const;
180 Isolate* isolate() const;
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100181 JSGraph* jsgraph() const { return js_graph_; }
182 Graph* graph() const;
183 Schedule* schedule() const { return schedule_; }
184 Zone* temp_zone() const { return temp_zone_; }
185 CommonOperatorBuilder* common() const;
186 SimplifiedOperatorBuilder* simplified() const;
187 MachineOperatorBuilder* machine() const;
188
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100189 Operator const* ToNumberOperator();
190
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100191 JSGraph* js_graph_;
192 Schedule* schedule_;
193 Zone* temp_zone_;
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100194 RegionObservability region_observability_ = RegionObservability::kObservable;
195
196 SetOncePointer<Operator const> to_number_operator_;
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100197};
198
199} // namespace compiler
200} // namespace internal
201} // namespace v8
202
203#endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_