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
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:
33  void ProcessNode(Node* node, Node** frame_state, Node** effect,
34                   Node** control);
35
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
44  bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
45                            Node** control);
46  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);
65  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);
83  ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect,
84                                                Node* control);
85  ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect,
86                                                  Node* control);
87  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);
100  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
113  ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect,
114                                                 Node* control);
115  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);
121
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
132  Factory* factory() const;
133  Isolate* isolate() const;
134  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
142  Operator const* ToNumberOperator();
143
144  JSGraph* js_graph_;
145  Schedule* schedule_;
146  Zone* temp_zone_;
147  RegionObservability region_observability_ = RegionObservability::kObservable;
148
149  SetOncePointer<Operator const> to_number_operator_;
150};
151
152}  // namespace compiler
153}  // namespace internal
154}  // namespace v8
155
156#endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
157