Jlm
Loading...
Searching...
No Matches
control.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2010 2011 2012 2014 Helge Bahmann <hcb@chaoticmind.net>
3 * Copyright 2014 2015 Nico Reißmann <nico.reissmann@gmail.com>
4 * See COPYING for terms of redistribution.
5 */
6
7#ifndef JLM_RVSDG_CONTROL_HPP
8#define JLM_RVSDG_CONTROL_HPP
9
11#include <jlm/rvsdg/node.hpp>
12#include <jlm/rvsdg/nullary.hpp>
13#include <jlm/rvsdg/unary.hpp>
14#include <jlm/util/strfmt.hpp>
15
16#include <cstdint>
17#include <unordered_map>
18
19namespace jlm::rvsdg
20{
21
22class ControlType final : public Type
23{
24public:
26
28
29 [[nodiscard]] std::string
31
32 bool
34
35 std::size_t
37
40
41 inline size_t
46
58 static std::shared_ptr<const ControlType>
59 Create(std::size_t nalternatives);
60
61private:
63};
64
66{
67public:
69
70 inline bool
72 {
73 return alternative_ == other.alternative_ && nalternatives_ == other.nalternatives_;
74 }
75
76 inline bool
78 {
79 return !(*this == other);
80 }
81
82 inline size_t
84 {
85 return alternative_;
86 }
87
88 inline size_t
93
94private:
97};
98
100{
101public:
103
105
106 bool
108
109 std::string
111
114
117 {
118 return value_;
119 }
120
121 static Output &
123 {
124 return *CreateOpNode<ControlConstantOperation>(region, std::move(value)).output(0);
125 }
126
127 static Output &
128 create(Region & region, size_t numAlternatives, size_t alternative)
129 {
130 return create(region, { alternative, numAlternatives });
131 }
132
133 static Output &
135 {
136 return create(region, 2, 0);
137 }
138
139 static Output &
141 {
142 return create(region, 2, 1);
143 }
144
145private:
147};
148
160{
161public:
163
167
168 bool
169 operator==(const Operation & other) const noexcept override;
170
171 std::string
172 debug_string() const override;
173
174 [[nodiscard]] std::unique_ptr<Operation>
175 copy() const override;
176
177 [[nodiscard]] size_t
179 {
180 JLM_ASSERT(std::dynamic_pointer_cast<const ControlType>(result(0)));
181 return std::static_pointer_cast<const ControlType>(result(0))->nalternatives();
182 }
183
184 static Node &
185 createNode(Region & region, const size_t numAlternatives)
186 {
188 }
189};
190
200{
201 typedef std::unordered_map<uint64_t, uint64_t>::const_iterator const_iterator;
202
203public:
205
207 size_t nbits,
210 size_t nalternatives);
211
212 bool
214
215 [[nodiscard]] std::string
217
220
223 {
224 return std::static_pointer_cast<const ControlType>(result(0))->nalternatives();
225 }
226
227 inline uint64_t
228 alternative(uint64_t value) const noexcept
229 {
230 auto it = mapping_.find(value);
231 if (it != mapping_.end())
232 return it->second;
233
235 }
236
237 inline uint64_t
242
243 inline size_t
245 {
246 return std::static_pointer_cast<const BitType>(argument(0))->nbits();
247 }
248
249 inline const_iterator
250 begin() const
251 {
252 return mapping_.begin();
253 }
254
255 inline const_iterator
256 end() const
257 {
258 return mapping_.end();
259 }
260
261 static Node &
263 Output & predicate,
264 const std::unordered_map<uint64_t, uint64_t> & mapping,
266 const size_t numAlternatives)
267 {
268 const auto bitType = CheckAndExtractBitType(*predicate.Type());
270 { &predicate },
271 bitType.nbits(),
272 mapping,
274 numAlternatives);
275 }
276
277 static Output *
279 Output & predicate,
280 const std::unordered_map<uint64_t, uint64_t> & mapping,
282 const size_t numAlternatives)
283 {
284 return CreateNode(predicate, mapping, defaultAlternative, numAlternatives).output(0);
285 }
286
287private:
288 static const BitType &
290 {
291 if (auto bitType = dynamic_cast<const BitType *>(&type))
292 {
293 return *bitType;
294 }
295
296 throw util::TypeError("BitType", type.debug_string());
297 }
298
300 std::unordered_map<uint64_t, uint64_t> mapping_;
301};
302
303}
304
305#endif
ControlValueRepresentation value_
Definition control.hpp:146
~ControlConstantOperation() noexcept override
static Output & create(Region &region, ControlValueRepresentation value)
Definition control.hpp:122
static Output & create(Region &region, size_t numAlternatives, size_t alternative)
Definition control.hpp:128
std::string debug_string() const override
Definition control.cpp:100
std::unique_ptr< Operation > copy() const override
Definition control.cpp:106
static Output & createFalse(Region &region)
Definition control.hpp:134
const ControlValueRepresentation & value() const noexcept
Definition control.hpp:116
static Output & createTrue(Region &region)
Definition control.hpp:140
std::string debug_string() const override
Definition control.cpp:23
std::size_t ComputeHash() const noexcept override
Definition control.cpp:36
~ControlType() noexcept override
size_t nalternatives() const noexcept
Definition control.hpp:42
TypeKind Kind() const noexcept override
Return the kind of this type.
Definition control.cpp:44
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
Definition control.cpp:50
size_t nalternatives() const noexcept
Definition control.hpp:89
bool operator!=(const ControlValueRepresentation &other) const noexcept
Definition control.hpp:77
bool operator==(const ControlValueRepresentation &other) const noexcept
Definition control.hpp:71
size_t alternative() const noexcept
Definition control.hpp:83
std::unordered_map< uint64_t, uint64_t > mapping_
Definition control.hpp:300
const_iterator end() const
Definition control.hpp:256
~MatchOperation() noexcept override
static const BitType & CheckAndExtractBitType(const rvsdg::Type &type)
Definition control.hpp:289
uint64_t alternative(uint64_t value) const noexcept
Definition control.hpp:228
uint64_t nalternatives() const noexcept
Definition control.hpp:222
const_iterator begin() const
Definition control.hpp:250
size_t nbits() const noexcept
Definition control.hpp:244
uint64_t default_alternative() const noexcept
Definition control.hpp:238
static Output * Create(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
Definition control.hpp:278
std::unique_ptr< Operation > copy() const override
Definition control.cpp:177
std::unordered_map< uint64_t, uint64_t >::const_iterator const_iterator
Definition control.hpp:201
std::string debug_string() const override
Definition control.cpp:153
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
Definition control.hpp:262
NodeOutput * output(size_t index) const noexcept
Definition node.hpp:650
Nullary operator (operator taking no formal arguments)
Definition nullary.hpp:22
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
Definition node.hpp:366
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
Definition operation.cpp:23
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
Definition operation.cpp:36
virtual std::string debug_string() const =0
Unary operator.
Definition unary.hpp:24
~UndefControlConstantOperation() noexcept override
bool operator==(const Operation &other) const noexcept override
Definition control.cpp:114
std::unique_ptr< Operation > copy() const override
Definition control.cpp:127
size_t numAlternatives() const noexcept
Definition control.hpp:178
std::string debug_string() const override
Definition control.cpp:121
static Node & createNode(Region &region, const size_t numAlternatives)
Definition control.hpp:185
#define JLM_ASSERT(x)
Definition common.hpp:16
TypeKind
The kinds of types supported in rvsdg.
Definition type.hpp:22
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872