Jlm
NodeNormalization.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2024 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_RVSDG_NODENORMALIZATION_HPP
7 #define JLM_RVSDG_NODENORMALIZATION_HPP
8 
9 #include <jlm/rvsdg/node.hpp>
10 #include <jlm/rvsdg/region.hpp>
12 #include <jlm/util/common.hpp>
13 
14 #include <functional>
15 #include <optional>
16 #include <vector>
17 
18 namespace jlm::rvsdg
19 {
20 
21 class Output;
22 
23 template<class TOperation>
24 using NodeNormalization = std::function<
25  std::optional<std::vector<Output *>>(const TOperation &, const std::vector<Output *> &)>;
26 
27 template<class TOperation>
28 std::optional<std::vector<Output *>>
30  const std::vector<NodeNormalization<TOperation>> & nodeNormalizations,
31  const TOperation & operation,
32  const std::vector<Output *> & operands)
33 {
34  for (auto & nodeNormalization : nodeNormalizations)
35  {
36  if (auto results = nodeNormalization(operation, operands))
37  {
38  return results;
39  }
40  }
41 
42  return std::nullopt;
43 }
44 
45 template<class TOperation>
46 bool
47 ReduceNode(const NodeNormalization<TOperation> & nodeNormalization, SimpleNode & node)
48 {
49  auto operation = util::assertedCast<const TOperation>(&node.GetOperation());
50  auto operands = rvsdg::operands(&node);
51 
52  if (auto results = nodeNormalization(*operation, operands))
53  {
54  divert_users(&node, *results);
55  remove(&node);
56  return true;
57  }
58 
59  return false;
60 }
61 
62 }
63 
64 #endif
const SimpleOperation & GetOperation() const noexcept override
Definition: simple-node.cpp:48
bool ReduceNode(const NodeNormalization< TOperation > &nodeNormalization, SimpleNode &node)
std::optional< std::vector< Output * > > NormalizeSequence(const std::vector< NodeNormalization< TOperation >> &nodeNormalizations, const TOperation &operation, const std::vector< Output * > &operands)
static void remove(Node *node)
Definition: region.hpp:932
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
Definition: node.hpp:1049
static void divert_users(Node *node, const std::vector< Output * > &outputs)
Definition: node.hpp:1090
std::function< std::optional< std::vector< Output * > >(const TOperation &, const std::vector< Output * > &)> NodeNormalization