blob: 77d53de8f35d137cd5a80bf500b61743513d3850 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2014 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// 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
Ben Murdochc5610432016-08-08 18:44:38 +01008#include "src/assembler.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009#include "src/compiler/frame-states.h"
10#include "src/machine-type.h"
11#include "src/zone-containers.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012
13namespace v8 {
14namespace internal {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015namespace compiler {
16
17// Forward declarations.
18class CallDescriptor;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040019struct CommonOperatorGlobalCache;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020class Operator;
21
22
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023// Prediction hint for branches.
24enum class BranchHint : uint8_t { kNone, kTrue, kFalse };
25
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026inline 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
Emily Bernierd0a1eb72015-03-24 16:35:39 -040039inline size_t hash_value(BranchHint hint) { return static_cast<size_t>(hint); }
40
41std::ostream& operator<<(std::ostream&, BranchHint);
42
43BranchHint BranchHintOf(const Operator* const);
44
45
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046// Deoptimize bailout kind.
47enum class DeoptimizeKind : uint8_t { kEager, kSoft };
Emily Bernierd0a1eb72015-03-24 16:35:39 -040048
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049size_t hash_value(DeoptimizeKind kind);
50
51std::ostream& operator<<(std::ostream&, DeoptimizeKind);
52
53DeoptimizeKind DeoptimizeKindOf(const Operator* const);
54
55
56// Prediction whether throw-site is surrounded by any local catch-scope.
57enum class IfExceptionHint { kLocallyUncaught, kLocallyCaught };
58
59size_t hash_value(IfExceptionHint hint);
60
61std::ostream& operator<<(std::ostream&, IfExceptionHint);
62
63
64class SelectParameters final {
65 public:
66 explicit SelectParameters(MachineRepresentation representation,
67 BranchHint hint = BranchHint::kNone)
68 : representation_(representation), hint_(hint) {}
69
70 MachineRepresentation representation() const { return representation_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040071 BranchHint hint() const { return hint_; }
72
73 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 const MachineRepresentation representation_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040075 const BranchHint hint_;
76};
77
78bool operator==(SelectParameters const&, SelectParameters const&);
79bool operator!=(SelectParameters const&, SelectParameters const&);
80
81size_t hash_value(SelectParameters const& p);
82
83std::ostream& operator<<(std::ostream&, SelectParameters const& p);
84
85SelectParameters const& SelectParametersOf(const Operator* const);
86
Ben Murdochc5610432016-08-08 18:44:38 +010087CallDescriptor const* CallDescriptorOf(const Operator* const);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040088
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000089size_t ProjectionIndexOf(const Operator* const);
90
91MachineRepresentation 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.
96class ParameterInfo final {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040097 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000098 ParameterInfo(int index, const char* debug_name)
99 : index_(index), debug_name_(debug_name) {}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400100
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000101 int index() const { return index_; }
102 const char* debug_name() const { return debug_name_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400103
104 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105 int index_;
106 const char* debug_name_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107};
108
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109std::ostream& operator<<(std::ostream&, ParameterInfo const&);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000110
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000111int ParameterIndexOf(const Operator* const);
112const ParameterInfo& ParameterInfoOf(const Operator* const);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400113
Ben Murdochc5610432016-08-08 18:44:38 +0100114class RelocatablePtrConstantInfo final {
115 public:
116 enum Type { kInt32, kInt64 };
117
118 RelocatablePtrConstantInfo(int32_t value, RelocInfo::Mode rmode)
119 : value_(value), rmode_(rmode), type_(kInt32) {}
120 RelocatablePtrConstantInfo(int64_t value, RelocInfo::Mode rmode)
121 : value_(value), rmode_(rmode), type_(kInt64) {}
122
123 intptr_t value() const { return value_; }
124 RelocInfo::Mode rmode() const { return rmode_; }
125 Type type() const { return type_; }
126
127 private:
128 intptr_t value_;
129 RelocInfo::Mode rmode_;
130 Type type_;
131};
132
133bool operator==(RelocatablePtrConstantInfo const& lhs,
134 RelocatablePtrConstantInfo const& rhs);
135bool operator!=(RelocatablePtrConstantInfo const& lhs,
136 RelocatablePtrConstantInfo const& rhs);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100137
Ben Murdochc5610432016-08-08 18:44:38 +0100138std::ostream& operator<<(std::ostream&, RelocatablePtrConstantInfo const&);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100139
Ben Murdochc5610432016-08-08 18:44:38 +0100140size_t hash_value(RelocatablePtrConstantInfo const& p);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141
Ben Murdoch61f157c2016-09-16 13:49:30 +0100142// 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).
145enum class RegionObservability : uint8_t { kObservable, kNotObservable };
146
147size_t hash_value(RegionObservability);
148
149std::ostream& operator<<(std::ostream&, RegionObservability);
150
151RegionObservability RegionObservabilityOf(Operator const*) WARN_UNUSED_RESULT;
152
153std::ostream& operator<<(std::ostream& os,
154 const ZoneVector<MachineType>* types);
155
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156// Interface for building common operators that can be used at any level of IR,
157// including JavaScript, mid-level, and low-level.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158class CommonOperatorBuilder final : public ZoneObject {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000159 public:
160 explicit CommonOperatorBuilder(Zone* zone);
161
162 const Operator* Dead();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000163 const Operator* End(size_t control_input_count);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400164 const Operator* Branch(BranchHint = BranchHint::kNone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000165 const Operator* IfTrue();
166 const Operator* IfFalse();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000167 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();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000172 const Operator* Throw();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173 const Operator* Deoptimize(DeoptimizeKind kind);
Ben Murdochda12d292016-06-02 14:46:10 +0100174 const Operator* DeoptimizeIf();
175 const Operator* DeoptimizeUnless();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 const Operator* Return(int value_input_count = 1);
177 const Operator* Terminate();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000178
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179 const Operator* Start(int value_output_count);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400180 const Operator* Loop(int control_input_count);
181 const Operator* Merge(int control_input_count);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 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);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187
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);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194 const Operator* HeapConstant(const Handle<HeapObject>&);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195
Ben Murdochc5610432016-08-08 18:44:38 +0100196 const Operator* RelocatableInt32Constant(int32_t value,
197 RelocInfo::Mode rmode);
198 const Operator* RelocatableInt64Constant(int64_t value,
199 RelocInfo::Mode rmode);
200
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 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);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100205 const Operator* Checkpoint();
206 const Operator* BeginRegion(RegionObservability);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207 const Operator* FinishRegion();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208 const Operator* StateValues(int arguments);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209 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);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000214 const Operator* Call(const CallDescriptor* descriptor);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000215 const Operator* TailCall(const CallDescriptor* descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216 const Operator* Projection(size_t index);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217
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,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100225 Handle<SharedFunctionInfo> shared_info);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000226
227 private:
228 Zone* zone() const { return zone_; }
229
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400230 const CommonOperatorGlobalCache& cache_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000231 Zone* const zone_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400232
233 DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000234};
235
236} // namespace compiler
237} // namespace internal
238} // namespace v8
239
240#endif // V8_COMPILER_COMMON_OPERATOR_H_