Jlm
gamma.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2010 2011 2012 2013 2014 Helge Bahmann <hcb@chaoticmind.net>
3  * Copyright 2013 2014 2016 Nico Reißmann <nico.reissmann@gmail.com>
4  * See COPYING for terms of redistribution.
5  */
6 
7 #ifndef JLM_RVSDG_GAMMA_HPP
8 #define JLM_RVSDG_GAMMA_HPP
9 
10 #include <optional>
11 
12 #include <jlm/rvsdg/control.hpp>
14 
15 namespace jlm::rvsdg
16 {
17 
18 class Output;
19 class Type;
20 
22 {
23 public:
24  ~GammaOperation() noexcept override;
25 
26  explicit GammaOperation(size_t numAlternatives) noexcept
27  : GammaOperation(numAlternatives, {})
28  {}
29 
31  size_t numAlternatives,
32  std::vector<std::shared_ptr<const Type>> matchContentTypes) noexcept
34  numAlternatives_(numAlternatives),
35  MatchContentTypes_(std::move(matchContentTypes))
36  {}
37 
38  inline size_t
39  nalternatives() const noexcept
40  {
41  return numAlternatives_;
42  }
43 
44  [[nodiscard]] std::string
45  debug_string() const override;
46 
47  [[nodiscard]] std::unique_ptr<Operation>
48  copy() const override;
49 
50  bool
51  operator==(const Operation & other) const noexcept override;
52 
56  [[nodiscard]] std::shared_ptr<const Type>
57  GetMatchContentType(std::size_t alternative) const;
58 
59 private:
61  std::vector<std::shared_ptr<const Type>> MatchContentTypes_;
62 };
63 
98 class GammaNode : public StructuralNode
99 {
100 public:
101  ~GammaNode() noexcept override;
102 
103 private:
104  GammaNode(rvsdg::Output & predicate, std::unique_ptr<GammaOperation> op);
105 
106  GammaNode(
107  rvsdg::Output & predicate,
108  size_t nalternatives,
109  std::vector<std::shared_ptr<const Type>> match_content_types);
110 
111 public:
115  struct MatchVar
116  {
124  std::vector<rvsdg::Output *> matchContent;
125  };
126 
130  struct EntryVar
131  {
139  std::vector<rvsdg::Output *> branchArgument;
140  };
141 
145  struct ExitVar
146  {
150  std::vector<rvsdg::Input *> branchResult;
155  };
156 
157  [[nodiscard]] const GammaOperation &
158  GetOperation() const noexcept override;
159 
160  static GammaNode *
161  create(jlm::rvsdg::Output * predicate, size_t nalternatives)
162  {
163  return new GammaNode(*predicate, nalternatives, {});
164  }
165 
166  static GammaNode &
169  size_t numAlternatives,
170  std::vector<std::shared_ptr<const Type>> matchContentTypes)
171  {
172  return *new GammaNode(predicate, numAlternatives, std::move(matchContentTypes));
173  }
174 
175  static GammaNode &
176  Create(jlm::rvsdg::Output & predicate, std::unique_ptr<GammaOperation> op)
177  {
178  return *new GammaNode(predicate, std::move(op));
179  }
180 
181  inline rvsdg::Input *
182  predicate() const noexcept;
183 
196  EntryVar
197  AddEntryVar(rvsdg::Output * origin);
198 
199  MatchVar
200  GetMatchVar() const;
201 
205  std::vector<EntryVar>
206  GetEntryVars() const;
207 
225  std::variant<MatchVar, EntryVar>
226  MapInput(const rvsdg::Input & input) const;
227 
245  std::variant<MatchVar, EntryVar>
246  MapBranchArgument(const rvsdg::Output & output) const;
247 
261  ExitVar
262  AddExitVar(std::vector<rvsdg::Output *> values);
263 
267  std::vector<ExitVar>
268  GetExitVars() const;
269 
286  ExitVar
287  MapOutputExitVar(const rvsdg::Output & output) const;
288 
304  ExitVar
305  MapBranchResultExitVar(const rvsdg::Input & input) const;
306 
316  void
317  RemoveExitVars(const std::vector<ExitVar> & exitVars);
318 
328  void
329  RemoveEntryVars(const std::vector<EntryVar> & entryVars);
330 
336  void
338  {
339  std::vector<ExitVar> exitVars;
340  for (auto exitVar : GetExitVars())
341  {
342  if (exitVar.output->IsDead())
343  {
344  exitVars.push_back(exitVar);
345  }
346  }
347 
348  RemoveExitVars(exitVars);
349  }
350 
351  GammaNode *
352  copy(jlm::rvsdg::Region * region, SubstitutionMap & smap) const override;
353 
354 private:
367  EntryVar
368  GetEntryVar(std::size_t index) const;
369 
370  std::unique_ptr<GammaOperation> Operation_;
371 };
372 
392 std::optional<rvsdg::Output *>
393 GetGammaInvariantOrigin(const GammaNode & gamma, const GammaNode::ExitVar & exitvar);
394 
395 /* gamma node method definitions */
396 
397 inline rvsdg::Input *
398 GammaNode::predicate() const noexcept
399 {
400  return StructuralNode::input(0);
401 }
402 
422 bool
424 
450 bool
452 
475 bool
477 
478 }
479 
480 #endif
Conditional operator / pattern matching.
Definition: gamma.hpp:99
void RemoveEntryVars(const std::vector< EntryVar > &entryVars)
Removes the given entry variables.
Definition: gamma.cpp:420
const GammaOperation & GetOperation() const noexcept override
Definition: gamma.cpp:254
ExitVar MapOutputExitVar(const rvsdg::Output &output) const
Maps gamma output to exit variable description.
Definition: gamma.cpp:377
std::unique_ptr< GammaOperation > Operation_
Definition: gamma.hpp:370
std::variant< MatchVar, EntryVar > MapInput(const rvsdg::Input &input) const
Maps gamma input to its role (match variable or entry variable).
Definition: gamma.cpp:314
static GammaNode & Create(jlm::rvsdg::Output &predicate, size_t numAlternatives, std::vector< std::shared_ptr< const Type >> matchContentTypes)
Definition: gamma.hpp:167
GammaNode * copy(jlm::rvsdg::Region *region, SubstitutionMap &smap) const override
Copy a node with substitutions.
Definition: gamma.cpp:439
EntryVar AddEntryVar(rvsdg::Output *origin)
Routes a variable into the gamma branches.
Definition: gamma.cpp:260
EntryVar GetEntryVar(std::size_t index) const
Gets entry variable by index.
Definition: gamma.cpp:278
GammaNode(rvsdg::Output &predicate, std::unique_ptr< GammaOperation > op)
Definition: gamma.cpp:228
static GammaNode & Create(jlm::rvsdg::Output &predicate, std::unique_ptr< GammaOperation > op)
Definition: gamma.hpp:176
void RemoveExitVars(const std::vector< ExitVar > &exitVars)
Removes the given exit variables.
Definition: gamma.cpp:401
std::variant< MatchVar, EntryVar > MapBranchArgument(const rvsdg::Output &output) const
Maps branch subregion entry argument to its role (pattern match or entry variable).
Definition: gamma.cpp:328
std::vector< ExitVar > GetExitVars() const
Gets all exit variables for this gamma.
Definition: gamma.cpp:361
std::vector< EntryVar > GetEntryVars() const
Gets all entry variables for this gamma.
Definition: gamma.cpp:303
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
Definition: gamma.hpp:161
ExitVar AddExitVar(std::vector< rvsdg::Output * > values)
Routes per-branch result of gamma to output.
Definition: gamma.cpp:342
ExitVar MapBranchResultExitVar(const rvsdg::Input &input) const
Maps gamma region exit result to exit variable description.
Definition: gamma.cpp:389
rvsdg::Input * predicate() const noexcept
Definition: gamma.hpp:398
~GammaNode() noexcept override
MatchVar GetMatchVar() const
Definition: gamma.cpp:291
std::shared_ptr< const Type > GetMatchContentType(std::size_t alternative) const
Returns the type of pattern matching content produced in a branch.
Definition: gamma.cpp:218
std::unique_ptr< Operation > copy() const override
Definition: gamma.cpp:205
GammaOperation(size_t numAlternatives, std::vector< std::shared_ptr< const Type >> matchContentTypes) noexcept
Definition: gamma.hpp:30
GammaOperation(size_t numAlternatives) noexcept
Definition: gamma.hpp:26
bool operator==(const Operation &other) const noexcept override
Definition: gamma.cpp:211
std::vector< std::shared_ptr< const Type > > MatchContentTypes_
Definition: gamma.hpp:61
std::string debug_string() const override
Definition: gamma.cpp:199
~GammaOperation() noexcept override
Definition: gamma.cpp:195
size_t nalternatives() const noexcept
Definition: gamma.hpp:39
rvsdg::Region * region() const noexcept
Definition: node.hpp:761
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
bool ReduceGammaControlConstant(Node &node)
Definition: gamma.cpp:171
bool ReduceGammaWithStaticallyKnownPredicate(Node &node)
Definition: gamma.cpp:158
std::optional< rvsdg::Output * > GetGammaInvariantOrigin(const GammaNode &gamma, const GammaNode::ExitVar &exitvar)
Determines whether a gamma exit var is path-invariant.
Definition: gamma.cpp:470
bool ReduceGammaInvariantVariables(Node &node)
Definition: gamma.cpp:186
A variable routed into all gamma regions.
Definition: gamma.hpp:131
rvsdg::Input * input
Variable at entry point (input to gamma node).
Definition: gamma.hpp:135
std::vector< rvsdg::Output * > branchArgument
Variable inside each of the branch regions (argument per subregion).
Definition: gamma.hpp:139
A variable routed out of all gamma regions as result.
Definition: gamma.hpp:146
rvsdg::Output * output
Output of gamma.
Definition: gamma.hpp:154
std::vector< rvsdg::Input * > branchResult
Variable exit points (results per subregion).
Definition: gamma.hpp:150
The match/discriminator variable of this gamma node.
Definition: gamma.hpp:116
rvsdg::Input * input
The variable matched over (i.e. the "selector" of the gamma branch).
Definition: gamma.hpp:120
std::vector< rvsdg::Output * > matchContent
The content of the match per branch.
Definition: gamma.hpp:124