16 m_logger(
"IROptimizer", debug)
49 return std::make_pair(e[1].primaryArg(),
numberAsArg(e[0].primaryArg()));
55 return std::make_pair(e[0].primaryArg(),
numberAsArg(e[1].primaryArg()));
61 return std::make_pair(e[0].primaryArg(),
numberAsArg(e[1].primaryArg()));
67 return std::make_pair(e[1].primaryArg(),
numberAsArg(e[0].primaryArg()));
73 return std::make_pair(e[0].primaryArg(),
numberAsArg(e[1].primaryArg()));
79 return std::make_pair(e[0].primaryArg(),
numberAsArg(e[1].primaryArg()));
86 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
89 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
92 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
95 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
98 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
101 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
104 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
107 return std::make_pair(e[0].primaryArg(), e[2].primaryArg());
112 void IROptimizer::process(
const std::vector<IR::Block>& pages,
const std::vector<std::string>& symbols,
const std::vector<ValTableElem>& values)
118 auto map = []<
typename T>(
const std::optional<T>& opt,
auto&& lambda) ->
decltype(std::optional(lambda(opt.value()))) {
120 return lambda(opt.value());
124 auto or_else = []<
typename T>(
const std::optional<T>& opt,
auto&& lambda) -> std::optional<T> {
125 if (!opt.has_value())
130 for (
const auto& block : pages)
136 const std::size_t end = block.size();
140 std::optional<EntityWithOffset> maybe_compacted = std::nullopt;
143 maybe_compacted = map(
145 [](
const auto& entity) {
146 return std::make_optional<EntityWithOffset>(entity, 2);
149 maybe_compacted = or_else(
154 [](
const auto& entity) {
155 return std::make_optional<EntityWithOffset>(entity, 3);
159 if (maybe_compacted.has_value())
161 auto [entity, offset] = maybe_compacted.value();
162 current_block.emplace_back(entity);
167 current_block.emplace_back(block[i]);
196 for (
auto&& entity : entities)
202 for (
const auto& [expected, replacement, condition, createReplacement] : rules)
204 if (
match(expected, entities) && condition(entities))
206 auto [first, second] = createReplacement(entities);
207 auto output =
IR::Entity(replacement, first, second);
209 if (
auto it = std::ranges::find_if(entities, [](
const auto& entity) {
210 return entity.hasValidSourceLocation();
212 it != entities.end())
213 output.setSourceLocation(it->filename(), it->sourceLine());