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
158{
159 typedef std::unordered_map<uint64_t, uint64_t>::const_iterator const_iterator;
160
161public:
163
165 size_t nbits,
168 size_t nalternatives);
169
170 bool
172
173 [[nodiscard]] std::string
175
178
181 {
182 return std::static_pointer_cast<const ControlType>(result(0))->nalternatives();
183 }
184
185 inline uint64_t
186 alternative(uint64_t value) const noexcept
187 {
188 auto it = mapping_.find(value);
189 if (it != mapping_.end())
190 return it->second;
191
193 }
194
195 inline uint64_t
200
201 inline size_t
203 {
204 return std::static_pointer_cast<const BitType>(argument(0))->nbits();
205 }
206
207 inline const_iterator
208 begin() const
209 {
210 return mapping_.begin();
211 }
212
213 inline const_iterator
214 end() const
215 {
216 return mapping_.end();
217 }
218
219 static Node &
221 Output & predicate,
222 const std::unordered_map<uint64_t, uint64_t> & mapping,
224 const size_t numAlternatives)
225 {
226 const auto bitType = CheckAndExtractBitType(*predicate.Type());
228 { &predicate },
229 bitType.nbits(),
230 mapping,
233 }
234
235 static Output *
237 Output & predicate,
238 const std::unordered_map<uint64_t, uint64_t> & mapping,
240 const size_t numAlternatives)
241 {
243 }
244
245private:
246 static const BitType &
248 {
249 if (auto bitType = dynamic_cast<const BitType *>(&type))
250 {
251 return *bitType;
252 }
253
254 throw util::TypeError("BitType", type.debug_string());
255 }
256
258 std::unordered_map<uint64_t, uint64_t> mapping_;
259};
260
261}
262
263#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:258
const_iterator end() const
Definition control.hpp:214
~MatchOperation() noexcept override
static const BitType & CheckAndExtractBitType(const rvsdg::Type &type)
Definition control.hpp:247
uint64_t alternative(uint64_t value) const noexcept
Definition control.hpp:186
uint64_t nalternatives() const noexcept
Definition control.hpp:180
const_iterator begin() const
Definition control.hpp:208
size_t nbits() const noexcept
Definition control.hpp:202
uint64_t default_alternative() const noexcept
Definition control.hpp:196
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:236
std::unique_ptr< Operation > copy() const override
Definition control.cpp:156
std::unordered_map< uint64_t, uint64_t >::const_iterator const_iterator
Definition control.hpp:159
std::string debug_string() const override
Definition control.cpp:132
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:220
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
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