6 #ifndef JLM_RVSDG_REDUCTION_HELPERS_HPP
7 #define JLM_RVSDG_REDUCTION_HELPERS_HPP
22 template<
typename Container,
typename ReductionTester>
31 auto left = args.begin();
32 auto right = std::next(left);
34 while (right != args.end())
36 if (reduction_tester(*left, *right))
49 template<
typename Container,
typename Reductor>
58 auto left = args.begin();
59 auto right = std::next(left);
61 while (right != args.end())
63 auto res = reductor(*left, *right);
76 args.erase(std::next(left), args.end());
83 template<
typename Container,
typename ReductionTester>
86 const Container & args,
87 const ReductionTester & reduction_tester) noexcept
89 auto left = args.begin();
90 while (left != args.end())
92 auto right = std::next(left);
93 while (right != args.end())
95 if (reduction_tester(*left, *right))
112 template<
typename Container,
typename Reductor>
116 auto left = args.begin();
117 while (left != args.end())
119 auto right = std::next(left);
120 while (right != args.end())
122 auto result = reductor(*left, *right);
126 *right = args.back();
130 right = std::next(left);
144 template<
typename Container,
typename FlattenTester>
148 return std::any_of(args.begin(), args.end(), flatten_tester);
153 template<
typename FlattenTester>
154 std::vector<jlm::rvsdg::Output *>
158 while (n < args.size())
160 if (flatten_tester(args[n]))
165 args[n] = sub_args[0];
166 args.insert(args.begin() + n + 1, sub_args.begin() + 1, sub_args.end());
Container pairwise_reduce(Container args, const Reductor &reductor)
std::vector< jlm::rvsdg::Output * > associative_flatten(std::vector< jlm::rvsdg::Output * > args, const FlattenTester &flatten_tester)
bool associative_test_flatten(const Container &args, const FlattenTester &flatten_tester)
bool commutative_pairwise_test_reduce(const Container &args, const ReductionTester &reduction_tester) noexcept
Container commutative_pairwise_reduce(Container args, const Reductor &reductor)
bool pairwise_test_reduce(const Container &args, const ReductionTester &reduction_tester) noexcept
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)