1 // Copyright 2014 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_COMMON_OPERATOR_H_
6 #define V8_COMPILER_COMMON_OPERATOR_H_
7
8 #include "src/assembler.h"
9 #include "src/compiler/frame-states.h"
10 #include "src/machine-type.h"
11 #include "src/zone-containers.h"
12
13 namespace v8 {
14 namespace internal {
15 namespace compiler {
16
17 // Forward declarations.
18 class CallDescriptor;
19 struct CommonOperatorGlobalCache;
20 class Operator;
21
22
23 // Prediction hint for branches.
24 enum class BranchHint : uint8_t { kNone, kTrue, kFalse };
25
NegateBranchHint(BranchHint hint)26 inline BranchHint NegateBranchHint(BranchHint hint) {
27 switch (hint) {
28 case BranchHint::kNone:
29 return hint;
30 case BranchHint::kTrue:
31 return BranchHint::kFalse;
32 case BranchHint::kFalse:
33 return BranchHint::kTrue;
34 }
35 UNREACHABLE();
36 return hint;
37 }
38
hash_value(BranchHint hint)39 inline size_t hash_value(BranchHint hint) { return static_cast<size_t>(hint); }
40
41 std::ostream& operator<<(std::ostream&, BranchHint);
42
43 BranchHint BranchHintOf(const Operator* const);
44
45
46 // Deoptimize bailout kind.
47 enum class DeoptimizeKind : uint8_t { kEager, kSoft };
48
49 size_t hash_value(DeoptimizeKind kind);
50
51 std::ostream& operator<<(std::ostream&, DeoptimizeKind);
52
53 DeoptimizeKind DeoptimizeKindOf(const Operator* const);
54
55
56 // Prediction whether throw-site is surrounded by any local catch-scope.
57 enum class IfExceptionHint { kLocallyUncaught, kLocallyCaught };
58
59 size_t hash_value(IfExceptionHint hint);
60
61 std::ostream& operator<<(std::ostream&, IfExceptionHint);
62
63
64 class SelectParameters final {
65 public:
66 explicit SelectParameters(MachineRepresentation representation,
67 BranchHint hint = BranchHint::kNone)
representation_(representation)68 : representation_(representation), hint_(hint) {}
69
representation()70 MachineRepresentation representation() const { return representation_; }
hint()71 BranchHint hint() const { return hint_; }
72
73 private:
74 const MachineRepresentation representation_;
75 const BranchHint hint_;
76 };
77
78 bool operator==(SelectParameters const&, SelectParameters const&);
79 bool operator!=(SelectParameters const&, SelectParameters const&);
80
81 size_t hash_value(SelectParameters const& p);
82
83 std::ostream& operator<<(std::ostream&, SelectParameters const& p);
84
85 SelectParameters const& SelectParametersOf(const Operator* const);
86
87 CallDescriptor const* CallDescriptorOf(const Operator* const);
88
89 size_t ProjectionIndexOf(const Operator* const);
90
91 MachineRepresentation PhiRepresentationOf(const Operator* const);
92
93
94 // The {IrOpcode::kParameter} opcode represents an incoming parameter to the
95 // function. This class bundles the index and a debug name for such operators.
96 class ParameterInfo final {
97 public:
ParameterInfo(int index,const char * debug_name)98 ParameterInfo(int index, const char* debug_name)
99 : index_(index), debug_name_(debug_name) {}
100
index()101 int index() const { return index_; }
debug_name()102 const char* debug_name() const { return debug_name_; }
103
104 private:
105 int index_;
106 const char* debug_name_;
107 };
108
109 std::ostream& operator<<(std::ostream&, ParameterInfo const&);
110
111 int ParameterIndexOf(const Operator* const);
112 const ParameterInfo& ParameterInfoOf(const Operator* const);
113
114 class RelocatablePtrConstantInfo final {
115 public:
116 enum Type { kInt32, kInt64 };
117
RelocatablePtrConstantInfo(int32_t value,RelocInfo::Mode rmode)118 RelocatablePtrConstantInfo(int32_t value, RelocInfo::Mode rmode)
119 : value_(value), rmode_(rmode), type_(kInt32) {}
RelocatablePtrConstantInfo(int64_t value,RelocInfo::Mode rmode)120 RelocatablePtrConstantInfo(int64_t value, RelocInfo::Mode rmode)
121 : value_(value), rmode_(rmode), type_(kInt64) {}
122
value()123 intptr_t value() const { return value_; }
rmode()124 RelocInfo::Mode rmode() const { return rmode_; }
type()125 Type type() const { return type_; }
126
127 private:
128 intptr_t value_;
129 RelocInfo::Mode rmode_;
130 Type type_;
131 };
132
133 bool operator==(RelocatablePtrConstantInfo const& lhs,
134 RelocatablePtrConstantInfo const& rhs);
135 bool operator!=(RelocatablePtrConstantInfo const& lhs,
136 RelocatablePtrConstantInfo const& rhs);
137
138 std::ostream& operator<<(std::ostream&, RelocatablePtrConstantInfo const&);
139
140 size_t hash_value(RelocatablePtrConstantInfo const& p);
141
142 // Used to mark a region (as identified by BeginRegion/FinishRegion) as either
143 // JavaScript-observable or not (i.e. allocations are not JavaScript observable
144 // themselves, but transitioning stores are).
145 enum class RegionObservability : uint8_t { kObservable, kNotObservable };
146
147 size_t hash_value(RegionObservability);
148
149 std::ostream& operator<<(std::ostream&, RegionObservability);
150
151 RegionObservability RegionObservabilityOf(Operator const*) WARN_UNUSED_RESULT;
152
153 std::ostream& operator<<(std::ostream& os,
154 const ZoneVector<MachineType>* types);
155
156 // Interface for building common operators that can be used at any level of IR,
157 // including JavaScript, mid-level, and low-level.
158 class CommonOperatorBuilder final : public ZoneObject {
159 public:
160 explicit CommonOperatorBuilder(Zone* zone);
161
162 const Operator* Dead();
163 const Operator* End(size_t control_input_count);
164 const Operator* Branch(BranchHint = BranchHint::kNone);
165 const Operator* IfTrue();
166 const Operator* IfFalse();
167 const Operator* IfSuccess();
168 const Operator* IfException(IfExceptionHint hint);
169 const Operator* Switch(size_t control_output_count);
170 const Operator* IfValue(int32_t value);
171 const Operator* IfDefault();
172 const Operator* Throw();
173 const Operator* Deoptimize(DeoptimizeKind kind);
174 const Operator* DeoptimizeIf();
175 const Operator* DeoptimizeUnless();
176 const Operator* Return(int value_input_count = 1);
177 const Operator* Terminate();
178
179 const Operator* Start(int value_output_count);
180 const Operator* Loop(int control_input_count);
181 const Operator* Merge(int control_input_count);
182 const Operator* Parameter(int index, const char* debug_name = nullptr);
183
184 const Operator* OsrNormalEntry();
185 const Operator* OsrLoopEntry();
186 const Operator* OsrValue(int index);
187
188 const Operator* Int32Constant(int32_t);
189 const Operator* Int64Constant(int64_t);
190 const Operator* Float32Constant(volatile float);
191 const Operator* Float64Constant(volatile double);
192 const Operator* ExternalConstant(const ExternalReference&);
193 const Operator* NumberConstant(volatile double);
194 const Operator* HeapConstant(const Handle<HeapObject>&);
195
196 const Operator* RelocatableInt32Constant(int32_t value,
197 RelocInfo::Mode rmode);
198 const Operator* RelocatableInt64Constant(int64_t value,
199 RelocInfo::Mode rmode);
200
201 const Operator* Select(MachineRepresentation, BranchHint = BranchHint::kNone);
202 const Operator* Phi(MachineRepresentation representation,
203 int value_input_count);
204 const Operator* EffectPhi(int effect_input_count);
205 const Operator* Checkpoint();
206 const Operator* BeginRegion(RegionObservability);
207 const Operator* FinishRegion();
208 const Operator* StateValues(int arguments);
209 const Operator* ObjectState(int pointer_slots, int id);
210 const Operator* TypedStateValues(const ZoneVector<MachineType>* types);
211 const Operator* FrameState(BailoutId bailout_id,
212 OutputFrameStateCombine state_combine,
213 const FrameStateFunctionInfo* function_info);
214 const Operator* Call(const CallDescriptor* descriptor);
215 const Operator* TailCall(const CallDescriptor* descriptor);
216 const Operator* Projection(size_t index);
217
218 // Constructs a new merge or phi operator with the same opcode as {op}, but
219 // with {size} inputs.
220 const Operator* ResizeMergeOrPhi(const Operator* op, int size);
221
222 // Constructs function info for frame state construction.
223 const FrameStateFunctionInfo* CreateFrameStateFunctionInfo(
224 FrameStateType type, int parameter_count, int local_count,
225 Handle<SharedFunctionInfo> shared_info);
226
227 private:
zone()228 Zone* zone() const { return zone_; }
229
230 const CommonOperatorGlobalCache& cache_;
231 Zone* const zone_;
232
233 DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder);
234 };
235
236 } // namespace compiler
237 } // namespace internal
238 } // namespace v8
239
240 #endif // V8_COMPILER_COMMON_OPERATOR_H_
241