MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
rewrite.h
Go to the documentation of this file.
1#pragma once
2
3#include "mim/world.h"
4
5namespace mim {
6
7/// Recurseivly rewrites part of a program **into** the provided World.
8/// This World may be different than the World we started with.
9class Rewriter {
10public:
12 : world_(world) {}
13
14 World& world() { return world_; }
15 /// Map @p old_def to @p new_def and returns @p new_def;
16 const Def* map(const Def* old_def, const Def* new_def) { return old2new_[old_def] = new_def; }
17
18 /// @name rewrite
19 /// Recursively rewrite old Def%s.
20 ///@{
21 virtual const Def* rewrite(const Def*);
22 virtual const Def* rewrite_imm(const Def*);
23 virtual const Def* rewrite_mut(Def*);
24 ///@}
25
26private:
27 World& world_;
28 Def2Def old2new_;
29};
30
31class VarRewriter : public Rewriter {
32public:
33 VarRewriter(const Var* var, const Def* arg)
34 : Rewriter(arg->world())
35 , vars_(var ? Vars(var) : Vars()) {
36 if (var) map(var, arg);
37 }
38
39 const Def* rewrite_imm(const Def* imm) override {
40 if (imm->local_vars().empty() && imm->local_muts().empty()) return imm; // safe to skip
41 if (imm->has_dep(Dep::Hole) || vars_.has_intersection(imm->free_vars())) return Rewriter::rewrite_imm(imm);
42 return imm;
43 }
44
45 const Def* rewrite_mut(Def* mut) override {
46 if (vars_.has_intersection(mut->free_vars())) {
47 if (auto var = mut->has_var()) vars_ = world().vars().insert(vars_, var);
48 return Rewriter::rewrite_mut(mut);
49 }
50 return map(mut, mut);
51 }
52
53private:
54 Vars vars_;
55};
56
57} // namespace mim
Base class for all Defs.
Definition def.h:198
Vars local_vars() const
Vars reachable by following immutable deps().
Definition def.cpp:331
Muts local_muts() const
Mutables reachable by following immutable deps(); mut->local_muts() is by definition the set { mut }...
Definition def.cpp:316
bool has_dep() const
Definition def.h:313
Vars free_vars() const
Compute a global solution by transitively following mutables as well.
Definition def.cpp:321
const Var * has_var()
Only returns not nullptr, if Var of this mutable has ever been created.
Definition def.h:383
World & world()
Definition rewrite.h:14
virtual const Def * rewrite_mut(Def *)
Definition rewrite.cpp:35
const Def * map(const Def *old_def, const Def *new_def)
Map old_def to new_def and returns new_def;.
Definition rewrite.h:16
Rewriter(World &world)
Definition rewrite.h:11
virtual const Def * rewrite_imm(const Def *)
Definition rewrite.cpp:18
virtual const Def * rewrite(const Def *)
Definition rewrite.cpp:11
constexpr bool empty() const noexcept
Is empty?
Definition sets.h:235
const Def * rewrite_mut(Def *mut) override
Definition rewrite.h:45
const Def * rewrite_imm(const Def *imm) override
Definition rewrite.h:39
VarRewriter(const Var *var, const Def *arg)
Definition rewrite.h:33
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:33
auto & vars()
Definition world.h:514
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