blob: 280b4b7735c5a72b3f6e884b7f34f26e64e69d42 [file] [log] [blame]
Ben Murdochc5610432016-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 Murdoch61f157c2016-09-16 13:49:30 +010033 void ProcessNode(Node* node, Node** frame_state, Node** effect,
34 Node** control);
Ben Murdochc5610432016-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 Murdoch61f157c2016-09-16 13:49:30 +010044 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
45 Node** control);
Ben Murdochc5610432016-08-08 18:44:38 +010046 ValueEffectControl LowerTypeGuard(Node* node, Node* effect, Node* control);
47 ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect,
48 Node* control);
49 ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect,
50 Node* control);
51 ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect,
52 Node* control);
53 ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect,
54 Node* control);
55 ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect,
56 Node* control);
57 ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect,
58 Node* control);
59 ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect,
60 Node* control);
61 ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect,
62 Node* control);
63 ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect,
64 Node* control);
Ben Murdoch61f157c2016-09-16 13:49:30 +010065 ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state,
66 Node* effect, Node* control);
67 ValueEffectControl LowerCheckTaggedPointer(Node* node, Node* frame_state,
68 Node* effect, Node* control);
69 ValueEffectControl LowerCheckTaggedSigned(Node* node, Node* frame_state,
70 Node* effect, Node* control);
71 ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state,
72 Node* effect, Node* control);
73 ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state,
74 Node* effect, Node* control);
75 ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state,
76 Node* effect, Node* control);
77 ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state,
78 Node* effect, Node* control);
79 ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state,
80 Node* effect, Node* control);
81 ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state,
82 Node* effect, Node* control);
Ben Murdochc5610432016-08-08 18:44:38 +010083 ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect,
84 Node* control);
Ben Murdoch61f157c2016-09-16 13:49:30 +010085 ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect,
86 Node* control);
Ben Murdochc5610432016-08-08 18:44:38 +010087 ValueEffectControl LowerTruncateTaggedToWord32(Node* node, Node* effect,
88 Node* control);
89 ValueEffectControl LowerObjectIsCallable(Node* node, Node* effect,
90 Node* control);
91 ValueEffectControl LowerObjectIsNumber(Node* node, Node* effect,
92 Node* control);
93 ValueEffectControl LowerObjectIsReceiver(Node* node, Node* effect,
94 Node* control);
95 ValueEffectControl LowerObjectIsSmi(Node* node, Node* effect, Node* control);
96 ValueEffectControl LowerObjectIsString(Node* node, Node* effect,
97 Node* control);
98 ValueEffectControl LowerObjectIsUndetectable(Node* node, Node* effect,
99 Node* control);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100100 ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect,
101 Node* control);
102 ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state,
103 Node* effect, Node* control);
104 ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state,
105 Node* effect, Node* control);
106 ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect,
107 Node* control);
108 ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect,
109 Node* control);
110 ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect,
111 Node* control);
112
Ben Murdochc5610432016-08-08 18:44:38 +0100113 ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect,
114 Node* control);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100115 ValueEffectControl BuildCheckedFloat64ToInt32(Node* value, Node* frame_state,
116 Node* effect, Node* control);
117 ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64(Node* value,
118 Node* frame_state,
119 Node* effect,
120 Node* control);
Ben Murdochc5610432016-08-08 18:44:38 +0100121
122 Node* ChangeInt32ToSmi(Node* value);
123 Node* ChangeUint32ToSmi(Node* value);
124 Node* ChangeInt32ToFloat64(Node* value);
125 Node* ChangeUint32ToFloat64(Node* value);
126 Node* ChangeSmiToInt32(Node* value);
127 Node* ObjectIsSmi(Node* value);
128
129 Node* SmiMaxValueConstant();
130 Node* SmiShiftBitsConstant();
131
Ben Murdoch61f157c2016-09-16 13:49:30 +0100132 Factory* factory() const;
133 Isolate* isolate() const;
Ben Murdochc5610432016-08-08 18:44:38 +0100134 JSGraph* jsgraph() const { return js_graph_; }
135 Graph* graph() const;
136 Schedule* schedule() const { return schedule_; }
137 Zone* temp_zone() const { return temp_zone_; }
138 CommonOperatorBuilder* common() const;
139 SimplifiedOperatorBuilder* simplified() const;
140 MachineOperatorBuilder* machine() const;
141
Ben Murdoch61f157c2016-09-16 13:49:30 +0100142 Operator const* ToNumberOperator();
143
Ben Murdochc5610432016-08-08 18:44:38 +0100144 JSGraph* js_graph_;
145 Schedule* schedule_;
146 Zone* temp_zone_;
Ben Murdoch61f157c2016-09-16 13:49:30 +0100147 RegionObservability region_observability_ = RegionObservability::kObservable;
148
149 SetOncePointer<Operator const> to_number_operator_;
Ben Murdochc5610432016-08-08 18:44:38 +0100150};
151
152} // namespace compiler
153} // namespace internal
154} // namespace v8
155
156#endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_