Jlm
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 
19 namespace jlm::rvsdg
20 {
21 
22 class ControlType final : public Type
23 {
24 public:
25  ~ControlType() noexcept override;
26 
27  explicit ControlType(size_t nalternatives);
28 
29  [[nodiscard]] std::string
30  debug_string() const override;
31 
32  bool
33  operator==(const jlm::rvsdg::Type & other) const noexcept override;
34 
35  std::size_t
36  ComputeHash() const noexcept override;
37 
38  TypeKind
39  Kind() const noexcept override;
40 
41  inline size_t
42  nalternatives() const noexcept
43  {
44  return nalternatives_;
45  }
46 
58  static std::shared_ptr<const ControlType>
59  Create(std::size_t nalternatives);
60 
61 private:
63 };
64 
66 {
67 public:
69 
70  inline bool
71  operator==(const ControlValueRepresentation & other) const noexcept
72  {
73  return alternative_ == other.alternative_ && nalternatives_ == other.nalternatives_;
74  }
75 
76  inline bool
77  operator!=(const ControlValueRepresentation & other) const noexcept
78  {
79  return !(*this == other);
80  }
81 
82  inline size_t
83  alternative() const noexcept
84  {
85  return alternative_;
86  }
87 
88  inline size_t
89  nalternatives() const noexcept
90  {
91  return nalternatives_;
92  }
93 
94 private:
95  size_t alternative_;
97 };
98 
100 {
101 public:
102  ~ControlConstantOperation() noexcept override;
103 
105 
106  bool
107  operator==(const Operation & other) const noexcept override;
108 
109  std::string
110  debug_string() const override;
111 
112  [[nodiscard]] std::unique_ptr<Operation>
113  copy() const override;
114 
115  [[nodiscard]] const ControlValueRepresentation &
116  value() const noexcept
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 &
134  createFalse(Region & region)
135  {
136  return create(region, 2, 0);
137  }
138 
139  static Output &
140  createTrue(Region & region)
141  {
142  return create(region, 2, 1);
143  }
144 
145 private:
147 };
148 
157 class MatchOperation final : public UnaryOperation
158 {
159  typedef std::unordered_map<uint64_t, uint64_t>::const_iterator const_iterator;
160 
161 public:
162  ~MatchOperation() noexcept override;
163 
165  size_t nbits,
166  const std::unordered_map<uint64_t, uint64_t> & mapping,
167  uint64_t default_alternative,
168  size_t nalternatives);
169 
170  bool
171  operator==(const Operation & other) const noexcept override;
172 
174  can_reduce_operand(const jlm::rvsdg::Output * arg) const noexcept override;
175 
176  jlm::rvsdg::Output *
177  reduce_operand(unop_reduction_path_t path, jlm::rvsdg::Output * arg) const override;
178 
179  [[nodiscard]] std::string
180  debug_string() const override;
181 
182  [[nodiscard]] std::unique_ptr<Operation>
183  copy() const override;
184 
185  inline uint64_t
186  nalternatives() const noexcept
187  {
188  return std::static_pointer_cast<const ControlType>(result(0))->nalternatives();
189  }
190 
191  inline uint64_t
192  alternative(uint64_t value) const noexcept
193  {
194  auto it = mapping_.find(value);
195  if (it != mapping_.end())
196  return it->second;
197 
198  return default_alternative_;
199  }
200 
201  inline uint64_t
202  default_alternative() const noexcept
203  {
204  return default_alternative_;
205  }
206 
207  inline size_t
208  nbits() const noexcept
209  {
210  return std::static_pointer_cast<const BitType>(argument(0))->nbits();
211  }
212 
213  inline const_iterator
214  begin() const
215  {
216  return mapping_.begin();
217  }
218 
219  inline const_iterator
220  end() const
221  {
222  return mapping_.end();
223  }
224 
225  static Node &
227  Output & predicate,
228  const std::unordered_map<uint64_t, uint64_t> & mapping,
229  const uint64_t defaultAlternative,
230  const size_t numAlternatives)
231  {
232  const auto bitType = CheckAndExtractBitType(*predicate.Type());
233  return CreateOpNode<MatchOperation>(
234  { &predicate },
235  bitType.nbits(),
236  mapping,
237  defaultAlternative,
238  numAlternatives);
239  }
240 
241  static Output *
243  Output & predicate,
244  const std::unordered_map<uint64_t, uint64_t> & mapping,
245  const uint64_t defaultAlternative,
246  const size_t numAlternatives)
247  {
248  return CreateNode(predicate, mapping, defaultAlternative, numAlternatives).output(0);
249  }
250 
251 private:
252  static const BitType &
254  {
255  if (auto bitType = dynamic_cast<const BitType *>(&type))
256  {
257  return *bitType;
258  }
259 
260  throw util::TypeError("BitType", type.debug_string());
261  }
262 
264  std::unordered_map<uint64_t, uint64_t> mapping_;
265 };
266 
268 match(
269  size_t nbits,
270  const std::unordered_map<uint64_t, uint64_t> & mapping,
271  uint64_t default_alternative,
272  size_t nalternatives,
273  jlm::rvsdg::Output * operand);
274 
275 }
276 
277 #endif
ControlValueRepresentation value_
Definition: control.hpp:146
~ControlConstantOperation() noexcept override
std::string debug_string() const override
Definition: control.cpp:100
std::unique_ptr< Operation > copy() const override
Definition: control.cpp:106
static Output & createTrue(Region &region)
Definition: control.hpp:140
static Output & create(Region &region, size_t numAlternatives, size_t alternative)
Definition: control.hpp:128
const ControlValueRepresentation & value() const noexcept
Definition: control.hpp:116
static Output & create(Region &region, ControlValueRepresentation value)
Definition: control.hpp:122
static Output & createFalse(Region &region)
Definition: control.hpp:134
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
ControlValueRepresentation(size_t alternative, size_t nalternatives)
Definition: control.cpp:77
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
static const BitType & CheckAndExtractBitType(const rvsdg::Type &type)
Definition: control.hpp:253
std::unordered_map< uint64_t, uint64_t > mapping_
Definition: control.hpp:264
unop_reduction_path_t can_reduce_operand(const jlm::rvsdg::Output *arg) const noexcept override
Definition: control.cpp:132
std::unordered_map< uint64_t, uint64_t >::const_iterator const_iterator
Definition: control.hpp:159
jlm::rvsdg::Output * reduce_operand(unop_reduction_path_t path, jlm::rvsdg::Output *arg) const override
Definition: control.cpp:145
const_iterator end() const
Definition: control.hpp:220
~MatchOperation() noexcept override
uint64_t alternative(uint64_t value) const noexcept
Definition: control.hpp:192
uint64_t nalternatives() const noexcept
Definition: control.hpp:186
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:242
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:226
const_iterator begin() const
Definition: control.hpp:214
size_t nbits() const noexcept
Definition: control.hpp:208
uint64_t default_alternative() const noexcept
Definition: control.hpp:202
std::unique_ptr< Operation > copy() const override
Definition: control.cpp:173
std::string debug_string() const override
Definition: control.cpp:162
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
Unary operator.
Definition: unary.hpp:26
size_t unop_reduction_path_t
Definition: unary.hpp:18
static std::string type(const Node *n)
Definition: view.cpp:255
TypeKind
The kinds of types supported in rvsdg.
Definition: type.hpp:22
jlm::rvsdg::Output * match(size_t nbits, const std::unordered_map< uint64_t, uint64_t > &mapping, uint64_t default_alternative, size_t nalternatives, jlm::rvsdg::Output *operand)
Definition: control.cpp:179