• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
31 class V8_EXPORT_PRIVATE EffectControlLinearizer {
32  public:
33   EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
34                           SourcePositionTable* source_positions);
35 
36   void Run();
37 
38  private:
39   void ProcessNode(Node* node, Node** frame_state, Node** effect,
40                    Node** control);
41 
42   bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
43                             Node** control);
44   Node* LowerChangeBitToTagged(Node* node);
45   Node* LowerChangeInt31ToTaggedSigned(Node* node);
46   Node* LowerChangeInt32ToTagged(Node* node);
47   Node* LowerChangeUint32ToTagged(Node* node);
48   Node* LowerChangeFloat64ToTagged(Node* node);
49   Node* LowerChangeFloat64ToTaggedPointer(Node* node);
50   Node* LowerChangeTaggedSignedToInt32(Node* node);
51   Node* LowerChangeTaggedToBit(Node* node);
52   Node* LowerChangeTaggedToInt32(Node* node);
53   Node* LowerChangeTaggedToUint32(Node* node);
54   Node* LowerChangeTaggedToTaggedSigned(Node* node);
55   Node* LowerCheckBounds(Node* node, Node* frame_state);
56   Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
57   Node* LowerCheckMaps(Node* node, Node* frame_state);
58   Node* LowerCheckNumber(Node* node, Node* frame_state);
59   Node* LowerCheckReceiver(Node* node, Node* frame_state);
60   Node* LowerCheckString(Node* node, Node* frame_state);
61   Node* LowerCheckIf(Node* node, Node* frame_state);
62   Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
63   Node* LowerCheckedInt32Sub(Node* node, Node* frame_state);
64   Node* LowerCheckedInt32Div(Node* node, Node* frame_state);
65   Node* LowerCheckedInt32Mod(Node* node, Node* frame_state);
66   Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
67   Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
68   Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
69   Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
70   Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state);
71   Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
72   Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
73   Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state);
74   Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state);
75   Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state);
76   Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state);
77   Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state);
78   Node* LowerChangeTaggedToFloat64(Node* node);
79   Node* LowerTruncateTaggedToBit(Node* node);
80   Node* LowerTruncateTaggedToFloat64(Node* node);
81   Node* LowerTruncateTaggedToWord32(Node* node);
82   Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state);
83   Node* LowerObjectIsDetectableCallable(Node* node);
84   Node* LowerObjectIsNonCallable(Node* node);
85   Node* LowerObjectIsNumber(Node* node);
86   Node* LowerObjectIsReceiver(Node* node);
87   Node* LowerObjectIsSmi(Node* node);
88   Node* LowerObjectIsString(Node* node);
89   Node* LowerObjectIsUndetectable(Node* node);
90   Node* LowerNewRestParameterElements(Node* node);
91   Node* LowerNewUnmappedArgumentsElements(Node* node);
92   Node* LowerArrayBufferWasNeutered(Node* node);
93   Node* LowerStringCharAt(Node* node);
94   Node* LowerStringCharCodeAt(Node* node);
95   Node* LowerStringFromCharCode(Node* node);
96   Node* LowerStringFromCodePoint(Node* node);
97   Node* LowerStringIndexOf(Node* node);
98   Node* LowerStringEqual(Node* node);
99   Node* LowerStringLessThan(Node* node);
100   Node* LowerStringLessThanOrEqual(Node* node);
101   Node* LowerCheckFloat64Hole(Node* node, Node* frame_state);
102   Node* LowerCheckTaggedHole(Node* node, Node* frame_state);
103   Node* LowerConvertTaggedHoleToUndefined(Node* node);
104   Node* LowerPlainPrimitiveToNumber(Node* node);
105   Node* LowerPlainPrimitiveToWord32(Node* node);
106   Node* LowerPlainPrimitiveToFloat64(Node* node);
107   Node* LowerEnsureWritableFastElements(Node* node);
108   Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state);
109   void LowerTransitionElementsKind(Node* node);
110   Node* LowerLoadTypedElement(Node* node);
111   void LowerStoreTypedElement(Node* node);
112 
113   // Lowering of optional operators.
114   Maybe<Node*> LowerFloat64RoundUp(Node* node);
115   Maybe<Node*> LowerFloat64RoundDown(Node* node);
116   Maybe<Node*> LowerFloat64RoundTiesEven(Node* node);
117   Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
118 
119   Node* AllocateHeapNumberWithValue(Node* node);
120   Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, Node* value,
121                                    Node* frame_state);
122   Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode,
123                                                  Node* value,
124                                                  Node* frame_state);
125   Node* BuildFloat64RoundDown(Node* value);
126   Node* LowerStringComparison(Callable const& callable, Node* node);
127 
128   Node* ChangeInt32ToSmi(Node* value);
129   Node* ChangeUint32ToSmi(Node* value);
130   Node* ChangeSmiToInt32(Node* value);
131   Node* ObjectIsSmi(Node* value);
132 
133   Node* SmiMaxValueConstant();
134   Node* SmiShiftBitsConstant();
135 
136   Factory* factory() const;
137   Isolate* isolate() const;
jsgraph()138   JSGraph* jsgraph() const { return js_graph_; }
139   Graph* graph() const;
schedule()140   Schedule* schedule() const { return schedule_; }
temp_zone()141   Zone* temp_zone() const { return temp_zone_; }
142   CommonOperatorBuilder* common() const;
143   SimplifiedOperatorBuilder* simplified() const;
144   MachineOperatorBuilder* machine() const;
145 
gasm()146   GraphAssembler* gasm() { return &graph_assembler_; }
147 
148   JSGraph* js_graph_;
149   Schedule* schedule_;
150   Zone* temp_zone_;
151   RegionObservability region_observability_ = RegionObservability::kObservable;
152   SourcePositionTable* source_positions_;
153   GraphAssembler graph_assembler_;
154 };
155 
156 }  // namespace compiler
157 }  // namespace internal
158 }  // namespace v8
159 
160 #endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
161