14 : ptr_(
std::move(ptr))
15 , world_(ptr_.
get()) {
24 void reset(std::unique_ptr<World>&& ptr) {
25 ptr_ = std::move(ptr);
32 assert(old2news_.empty());
41 virtual void pop() { old2news_.pop_back(); }
45 const Def*
map(
const Def* old_def,
const Def* new_def) {
return old2news_.back()[old_def] = new_def; }
50 for (
const auto& old2new : old2news_ | std::views::reverse)
51 if (
auto i = old2new.find(old_def); i != old2new.end())
return i->second;
65#define CODE_IMM(N) virtual const Def* rewrite_imm_##N(const N*);
66#define CODE_MUT(N) virtual const Def* rewrite_mut_##N(N*);
77 std::unique_ptr<World> ptr_;
79 std::deque<Def2Def> old2news_;
94 vars_.emplace_back(var);
99 vars_.emplace_back(
Vars());
108 if (
auto new_def =
lookup(old_def))
return new_def;
110 if (
auto old_mut = old_def->isa_mut())
111 return has_intersection(old_mut) ?
rewrite_mut(old_mut)->
set(old_mut->dbg()) : old_mut;
113 if (old_def->local_vars().empty() && old_def->local_muts().empty())
return old_def;
115 return has_intersection(old_def) ?
rewrite_imm(old_def)->
set(old_def->dbg()) : old_def;
119 if (
auto var = mut->has_var()) {
120 auto& vars = vars_.back();
128 bool has_intersection(
const Def* old_def) {
129 for (
const auto& vars : vars_ | std::views::reverse)
130 if (vars.has_intersection(old_def->
free_vars()))
return true;
Def * set(size_t i, const Def *)
Successively set from left to right.
Vars free_vars() const
Compute a global solution by transitively following mutables as well.
const Def * lookup(const Def *old_def)
Lookup old_def by searching in reverse through the stack of maps.
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 *)
const Def * map(const Def *old_def, const Def *new_def)
Map old_def to new_def and returns new_def.
void reset(std::unique_ptr< World > &&ptr)
virtual const Def * rewrite_imm(const Def *)
Rewriter(std::unique_ptr< World > &&ptr)
virtual const Def * rewrite(const Def *)
void add(const Var *var, const Def *arg)
const Def * rewrite(const Def *old_def) final
const Def * rewrite_mut(Def *mut) final
VarRewriter(World &world)
VarRewriter(const Var *var, const Def *arg)
The World represents the whole program and manages creation of MimIR nodes (Defs).
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 >