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(); }
46 const Def*
map(
const Def* old_def ,
const Def* new_def ) {
return old2news_.back()[ old_def ] = new_def ; }
55 for (
const auto& old2new : old2news_ | std::views::reverse)
56 if (
auto i = old2new.find(old_def); i != old2new.end())
return i->second;
70#define CODE_IMM(N) virtual const Def* rewrite_imm_##N(const N*);
71#define CODE_MUT(N) virtual const Def* rewrite_mut_##N(N*);
82 std::unique_ptr<World> ptr_;
84 std::deque<Def2Def> old2news_;
99 vars_.emplace_back(var);
104 vars_.emplace_back(
Vars());
113 if (
auto new_def =
lookup(old_def))
return new_def;
115 if (
auto old_mut = old_def->isa_mut())
116 return has_intersection(old_mut) ?
rewrite_mut(old_mut)->
set(old_mut->dbg()) : old_mut;
118 if (old_def->local_vars().empty() && old_def->local_muts().empty())
return old_def;
120 return has_intersection(old_def) ?
rewrite_imm(old_def)->
set(old_def->dbg()) : old_def;
124 if (
auto var = mut->has_var()) {
125 auto& vars = vars_.back();
133 bool has_intersection(
const Def* old_def) {
134 for (
const auto& vars : vars_ | std::views::reverse)
135 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 * map(const Def *old_def, Defs new_defs)
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)
const Def * map(Defs old_defs, const Def *new_def)
virtual const Def * rewrite_imm(const Def *)
const Def * map(Defs old_defs, Defs new_defs)
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).
const Def * tuple(Defs ops)
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 >