MimIR 0.1
MimIR is my Intermediate Representation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
rewrite.h
Go to the documentation of this file.
1#pragma once
2
3#include <ranges>
4
5#include "mim/world.h"
6
7namespace mim {
8
9/// Recurseivly rebuilds part of a program **into** the provided World w.r.t.\ Rewriter::map.
10/// This World may be different than the World we started with.
11class Rewriter {
12public:
14 : world_(world) {
15 push(); // create root map
16 }
17
18 World& world() { return world_; }
19
20 /// @name Stack of Maps
21 ///@{
22 void push() { old2news_.emplace_back(Def2Def{}); }
23 void pop() { old2news_.pop_back(); }
24
25 /// Map @p old_def to @p new_def and returns @p new_def.
26 /// @returns `new_def`
27 const Def* map(const Def* old_def, const Def* new_def) { return old2news_.back()[old_def] = new_def; }
28
29 /// Lookup `old_def` by searching in reverse through the stack of maps.
30 /// @returns `nullptr` if nothing was found.
31 const Def* lookup(const Def* old_def) {
32 for (const auto& old2new : old2news_ | std::views::reverse)
33 if (auto i = old2new.find(old_def); i != old2new.end()) return i->second;
34 return nullptr;
35 }
36
37 /// @name rewrite
38 /// Recursively rewrite old Def%s.
39 ///@{
40 virtual const Def* rewrite(const Def*);
41 virtual const Def* rewrite_imm(const Def*);
42 virtual const Def* rewrite_mut(Def*);
43
44 virtual const Def* rewrite_arr(const Arr* arr) { return rewrite_seq(arr); }
45 virtual const Def* rewrite_pack(const Pack* pack) { return rewrite_seq(pack); }
46 virtual const Def* rewrite_seq(const Seq*);
47 virtual const Def* rewrite_extract(const Extract*);
48 virtual const Def* rewrite_hole(Hole*);
49 ///@}
50
51private:
52 World& world_;
53 std::deque<Def2Def> old2news_;
54};
55
56class VarRewriter : public Rewriter {
57public:
58 VarRewriter(const Var* var, const Def* arg)
59 : Rewriter(arg->world())
60 , vars_(var ? Vars(var) : Vars()) {
61 assert(var);
62 map(var, arg);
63 }
64
65 const Def* rewrite_imm(const Def* imm) final {
66 if (imm->local_vars().empty() && imm->local_muts().empty()) return imm; // safe to skip
67 if (imm->has_dep(Dep::Hole) || vars_.has_intersection(imm->free_vars())) return Rewriter::rewrite_imm(imm);
68 return imm;
69 }
70
71 const Def* rewrite_mut(Def* mut) final {
72 if (vars_.has_intersection(mut->free_vars())) {
73 if (auto var = mut->has_var()) vars_ = world().vars().insert(vars_, var);
74 return Rewriter::rewrite_mut(mut);
75 }
76 return map(mut, mut);
77 }
78
79private:
80 Vars vars_;
81};
82
83} // namespace mim
A (possibly paramterized) Array.
Definition tuple.h:100
Base class for all Defs.
Definition def.h:203
Extracts from a Sigma or Array-typed Extract::tuple the element at position Extract::index.
Definition tuple.h:192
This node is a hole in the IR that is inferred by its context later on.
Definition check.h:10
A (possibly paramterized) Tuple.
Definition tuple.h:150
virtual const Def * rewrite_hole(Hole *)
Definition rewrite.cpp:87
void pop()
Definition rewrite.h:23
const Def * lookup(const Def *old_def)
Lookup old_def by searching in reverse through the stack of maps.
Definition rewrite.h:31
World & world()
Definition rewrite.h:18
virtual const Def * rewrite_mut(Def *)
Definition rewrite.cpp:35
virtual const Def * rewrite_pack(const Pack *pack)
Definition rewrite.h:45
const Def * map(const Def *old_def, const Def *new_def)
Map old_def to new_def and returns new_def.
Definition rewrite.h:27
Rewriter(World &world)
Definition rewrite.h:13
void push()
Definition rewrite.h:22
virtual const Def * rewrite_imm(const Def *)
Definition rewrite.cpp:27
virtual const Def * rewrite_seq(const Seq *)
Definition rewrite.cpp:48
virtual const Def * rewrite(const Def *)
Definition rewrite.cpp:12
virtual const Def * rewrite_extract(const Extract *)
Definition rewrite.cpp:75
virtual const Def * rewrite_arr(const Arr *arr)
Definition rewrite.h:44
Base class for Arr and Pack.
Definition tuple.h:78
const Def * rewrite_mut(Def *mut) final
Definition rewrite.h:71
const Def * rewrite_imm(const Def *imm) final
Definition rewrite.h:65
VarRewriter(const Var *var, const Def *arg)
Definition rewrite.h:58
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:33
auto & vars()
Definition world.h:504
Definition ast.h:14
DefMap< const Def * > Def2Def
Definition def.h:48
@ Hole
Definition def.h:101
Sets< const Var >::Set Vars
Definition def.h:68