blob: 7c59f47c34a8c212bfa615ef28f054122bfefdf0 [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 Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/compiler/frame-states.h"
9#include "src/machine-type.h"
10#include "src/zone-containers.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011
12namespace v8 {
13namespace internal {
14
15// Forward declarations.
16class ExternalReference;
Ben Murdoch097c5b22016-05-18 11:27:45 +010017class Type;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018
19namespace compiler {
20
21// Forward declarations.
22class CallDescriptor;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023struct CommonOperatorGlobalCache;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000024class Operator;
25
26
Emily Bernierd0a1eb72015-03-24 16:35:39 -040027// Prediction hint for branches.
28enum class BranchHint : uint8_t { kNone, kTrue, kFalse };
29
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030inline BranchHint NegateBranchHint(BranchHint hint) {
31 switch (hint) {
32 case BranchHint::kNone:
33 return hint;
34 case BranchHint::kTrue:
35 return BranchHint::kFalse;
36 case BranchHint::kFalse:
37 return BranchHint::kTrue;
38 }
39 UNREACHABLE();
40 return hint;
41}
42
Emily Bernierd0a1eb72015-03-24 16:35:39 -040043inline size_t hash_value(BranchHint hint) { return static_cast<size_t>(hint); }
44
45std::ostream& operator<<(std::ostream&, BranchHint);
46
47BranchHint BranchHintOf(const Operator* const);
48
49
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050// Deoptimize bailout kind.
51enum class DeoptimizeKind : uint8_t { kEager, kSoft };
Emily Bernierd0a1eb72015-03-24 16:35:39 -040052
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053size_t hash_value(DeoptimizeKind kind);
54
55std::ostream& operator<<(std::ostream&, DeoptimizeKind);
56
57DeoptimizeKind DeoptimizeKindOf(const Operator* const);
58
59
60// Prediction whether throw-site is surrounded by any local catch-scope.
61enum class IfExceptionHint { kLocallyUncaught, kLocallyCaught };
62
63size_t hash_value(IfExceptionHint hint);
64
65std::ostream& operator<<(std::ostream&, IfExceptionHint);
66
67
68class SelectParameters final {
69 public:
70 explicit SelectParameters(MachineRepresentation representation,
71 BranchHint hint = BranchHint::kNone)
72 : representation_(representation), hint_(hint) {}
73
74 MachineRepresentation representation() const { return representation_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040075 BranchHint hint() const { return hint_; }
76
77 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078 const MachineRepresentation representation_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040079 const BranchHint hint_;
80};
81
82bool operator==(SelectParameters const&, SelectParameters const&);
83bool operator!=(SelectParameters const&, SelectParameters const&);
84
85size_t hash_value(SelectParameters const& p);
86
87std::ostream& operator<<(std::ostream&, SelectParameters const& p);
88
89SelectParameters const& SelectParametersOf(const Operator* const);
90
91
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000092size_t ProjectionIndexOf(const Operator* const);
93
94MachineRepresentation PhiRepresentationOf(const Operator* const);
95
96
97// The {IrOpcode::kParameter} opcode represents an incoming parameter to the
98// function. This class bundles the index and a debug name for such operators.
99class ParameterInfo final {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400100 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000101 ParameterInfo(int index, const char* debug_name)
102 : index_(index), debug_name_(debug_name) {}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400103
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000104 int index() const { return index_; }
105 const char* debug_name() const { return debug_name_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400106
107 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108 int index_;
109 const char* debug_name_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000110};
111
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000112std::ostream& operator<<(std::ostream&, ParameterInfo const&);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114int ParameterIndexOf(const Operator* const);
115const ParameterInfo& ParameterInfoOf(const Operator* const);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400116
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117
118// Interface for building common operators that can be used at any level of IR,
119// including JavaScript, mid-level, and low-level.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120class CommonOperatorBuilder final : public ZoneObject {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121 public:
122 explicit CommonOperatorBuilder(Zone* zone);
123
124 const Operator* Dead();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000125 const Operator* End(size_t control_input_count);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400126 const Operator* Branch(BranchHint = BranchHint::kNone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000127 const Operator* IfTrue();
128 const Operator* IfFalse();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129 const Operator* IfSuccess();
130 const Operator* IfException(IfExceptionHint hint);
131 const Operator* Switch(size_t control_output_count);
132 const Operator* IfValue(int32_t value);
133 const Operator* IfDefault();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000134 const Operator* Throw();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000135 const Operator* Deoptimize(DeoptimizeKind kind);
Ben Murdochda12d292016-06-02 14:46:10 +0100136 const Operator* DeoptimizeIf();
137 const Operator* DeoptimizeUnless();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000138 const Operator* Return(int value_input_count = 1);
139 const Operator* Terminate();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000140
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 const Operator* Start(int value_output_count);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400142 const Operator* Loop(int control_input_count);
143 const Operator* Merge(int control_input_count);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000144 const Operator* Parameter(int index, const char* debug_name = nullptr);
145
146 const Operator* OsrNormalEntry();
147 const Operator* OsrLoopEntry();
148 const Operator* OsrValue(int index);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000149
150 const Operator* Int32Constant(int32_t);
151 const Operator* Int64Constant(int64_t);
152 const Operator* Float32Constant(volatile float);
153 const Operator* Float64Constant(volatile double);
154 const Operator* ExternalConstant(const ExternalReference&);
155 const Operator* NumberConstant(volatile double);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000156 const Operator* HeapConstant(const Handle<HeapObject>&);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158 const Operator* Select(MachineRepresentation, BranchHint = BranchHint::kNone);
159 const Operator* Phi(MachineRepresentation representation,
160 int value_input_count);
161 const Operator* EffectPhi(int effect_input_count);
162 const Operator* EffectSet(int arguments);
163 const Operator* Guard(Type* type);
164 const Operator* BeginRegion();
165 const Operator* FinishRegion();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000166 const Operator* StateValues(int arguments);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000167 const Operator* ObjectState(int pointer_slots, int id);
168 const Operator* TypedStateValues(const ZoneVector<MachineType>* types);
169 const Operator* FrameState(BailoutId bailout_id,
170 OutputFrameStateCombine state_combine,
171 const FrameStateFunctionInfo* function_info);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000172 const Operator* Call(const CallDescriptor* descriptor);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173 const Operator* TailCall(const CallDescriptor* descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174 const Operator* Projection(size_t index);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000175
176 // Constructs a new merge or phi operator with the same opcode as {op}, but
177 // with {size} inputs.
178 const Operator* ResizeMergeOrPhi(const Operator* op, int size);
179
180 // Constructs function info for frame state construction.
181 const FrameStateFunctionInfo* CreateFrameStateFunctionInfo(
182 FrameStateType type, int parameter_count, int local_count,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100183 Handle<SharedFunctionInfo> shared_info);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184
185 private:
186 Zone* zone() const { return zone_; }
187
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400188 const CommonOperatorGlobalCache& cache_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189 Zone* const zone_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400190
191 DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000192};
193
194} // namespace compiler
195} // namespace internal
196} // namespace v8
197
198#endif // V8_COMPILER_COMMON_OPERATOR_H_