• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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