23 : ptr_(
std::move(ptr))
24 , world_(ptr_.
get()) {
33 void reset(std::unique_ptr<World>&& ptr) {
34 ptr_ = std::move(ptr);
70 for (
const auto& old2new :
old2news_ | std::views::reverse)
71 if (
auto i = old2new.find(old_def); i != old2new.end())
return i->second;
85#define CODE_IMM(N) virtual const Def* rewrite_imm_##N(const N*);
86#define CODE_MUT(N) virtual const Def* rewrite_mut_##N(N*);
98 swap(rw1.old2news_, rw2.old2news_);
103 std::unique_ptr<World> ptr_;
124 vars_.emplace_back(var);
144 swap(vrw1.vars_, vrw2.vars_);
148 bool has_intersection(
const Def* old_def) {
149 for (
const auto& vars : vars_ | std::views::reverse)
150 if (vars.has_intersection(old_def->
free_vars()))
return true;
167 const Def*
map(
const Def* old_def,
const Def* new_def)
final;
186 if (
auto i = old2new.find(old_def); i != old2new.end())
return i->second;
Vars free_vars() const
Compute a global solution by transitively following mutables as well.
virtual ~Rewriter()=default
friend void swap(Rewriter &rw1, Rewriter &rw2) noexcept
virtual const Def * rewrite_imm_Seq(const Seq *seq)
virtual const Def * rewrite_mut_Seq(Seq *seq)
virtual const Def * rewrite_mut(Def *)
virtual const Def * rewrite_stub(Def *, Def *)
virtual const Def * map(const Def *old_def, const Def *new_def)
void reset(std::unique_ptr< World > &&ptr)
std::deque< Def2Def > old2news_
virtual const Def * rewrite_imm(const Def *)
Rewriter(std::unique_ptr< World > &&ptr)
virtual const Def * rewrite(const Def *)
virtual const Def * lookup(const Def *old_def)
Lookup old_def by searching in reverse through the stack of maps.
VarRewriter & add(const Var *var, const Def *arg)
const Def * rewrite_mut(Def *) final
VarRewriter(World &world)
friend void swap(VarRewriter &vrw1, VarRewriter &vrw2) noexcept
const Def * rewrite(const Def *) final
VarRewriter(const Var *var, const Def *arg)
A variable introduced by a binder (mutable).
The World represents the whole program and manages creation of MimIR nodes (Defs).
const Def * rewire_mut(Def *)
friend void swap(Zonker &z1, Zonker &z2) noexcept
const Def * lookup(const Def *old_def) final
Lookup old_def by searching in reverse through the stack of maps.
const Def * rewrite(const Def *) final
const Def * map(const Def *old_def, const Def *new_def) final
const Def * rewrite_mut(Def *mut) final
DefMap< const Def * > Def2Def
Vector< const Def * > DefVec
constexpr decltype(auto) get(Span< T, N > span) noexcept
Sets< const Var >::Set Vars
Vector(I, I, A=A()) -> Vector< typename std::iterator_traits< I >::value_type, Default_Inlined_Size< typename std::iterator_traits< I >::value_type >, A >