MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
mim::Rewriter Class Reference

Recurseivly rebuilds part of a program into the provided World w.r.t. Rewriter::map. More...

#include <mim/rewrite.h>

Inheritance diagram for mim::Rewriter:
[legend]

Classes

struct  Scope

Public Member Functions

template<class D = Def>
D * curr_mut () const
Construction & Destruction
 Rewriter (World &world)
virtual ~Rewriter ()
void reset ()
Getters
World & world ()
Scope
void push (Vars old_vars={}, Vars new_vars={})
void pop ()
void bind_old (const Var *var)
 Adds the old var - if any - to the innermost scope.
void bind_new (const Var *var)
 Adds the new var - if any - to the innermost scope.
void bind (const Var *old_var, const Var *new_var)
Map / Lookup

Map old_def to new_def and returns new_def.

const Def * map (const Def *old_def, const Def *new_def)
const Def * map (const Def *old_def, Defs new_defs)
const Def * map (Defs old_defs, const Def *new_def)
const Def * map (Defs old_defs, Defs new_defs)
virtual const Def * lookup (const Def *old_def)
 Lookup old_def by searching in reverse through the stack of maps.
rewrite

Recursively rewrite old Defs.

virtual const Def * rewrite (const Def *)
virtual const Def * rewrite_imm (const Def *)
virtual const Def * rewrite_mut (Def *)
virtual const Def * rewrite_stub (Def *, Def *)
const Def * rewrite_stub (Def *old_mut, Def *new_mut, fe::View< size_t > new2old)
 Like above, but new_mut may have a different number of ops than old_mut: new_mut->op(i) is rewritten from old_mut->op(new2old[i]).
virtual DefVec rewrite (Defs)
virtual const Def * rewrite_imm_Lit (const Lit *)
virtual const Def * rewrite_imm_Axm (const Axm *)
virtual const Def * rewrite_imm_Var (const Var *)
virtual const Def * rewrite_imm_Proxy (const Proxy *)
virtual const Def * rewrite_imm_Type (const Type *)
virtual const Def * rewrite_imm_Level (const Level *)
virtual const Def * rewrite_imm_LMax (const LMax *)
virtual const Def * rewrite_imm_LSucc (const LSucc *)
virtual const Def * rewrite_imm_Pi (const Pi *)
virtual const Def * rewrite_imm_Lam (const Lam *)
virtual const Def * rewrite_imm_App (const App *)
virtual const Def * rewrite_imm_Sigma (const Sigma *)
virtual const Def * rewrite_imm_Tuple (const Tuple *)
virtual const Def * rewrite_imm_Extract (const Extract *)
virtual const Def * rewrite_imm_Insert (const Insert *)
virtual const Def * rewrite_imm_Arr (const Arr *)
virtual const Def * rewrite_imm_Pack (const Pack *)
virtual const Def * rewrite_imm_Join (const Join *)
virtual const Def * rewrite_imm_Inj (const Inj *)
virtual const Def * rewrite_imm_Match (const Match *)
virtual const Def * rewrite_imm_Variant (const Variant *)
virtual const Def * rewrite_imm_Top (const Top *)
virtual const Def * rewrite_imm_Bot (const Bot *)
virtual const Def * rewrite_imm_Reform (const Reform *)
virtual const Def * rewrite_imm_Rule (const Rule *)
virtual const Def * rewrite_imm_Single (const Single *)
virtual const Def * rewrite_imm_Wrap (const Wrap *)
virtual const Def * rewrite_imm_Nat (const Nat *)
virtual const Def * rewrite_imm_Idx (const Idx *)
virtual const Def * rewrite_imm_Nom (const Nom *)
virtual const Def * rewrite_imm_Name (const Name *)
virtual const Def * rewrite_imm_Struc (const Struc *)
virtual const Def * rewrite_mut_Hole (Hole *)
virtual const Def * rewrite_mut_Pi (Pi *)
virtual const Def * rewrite_mut_Lam (Lam *)
virtual const Def * rewrite_mut_Sigma (Sigma *)
virtual const Def * rewrite_mut_Arr (Arr *)
virtual const Def * rewrite_mut_Pack (Pack *)
virtual const Def * rewrite_mut_Variant (Variant *)
virtual const Def * rewrite_mut_Rule (Rule *)
virtual const Def * rewrite_imm_Seq (const Seq *seq)
virtual const Def * rewrite_mut_Seq (Seq *seq)

Protected Member Functions

Def2Def & old2new ()
 The map of the innermost push() scope.
bool has_intersection (const Def *old_def)
 Does old_def depend on the old Vars of any scope?
auto enter (Def *new_mut)
 Updates curr_mut() to new_mut and restores it at the end of the scope.
const Def * seal (Def *old_mut, Def *new_mut)
 The tail of rewrite_stub: immutabilizes new_mut in hindsight, as rewriting may have made it vacuous.

Protected Attributes

fe::Vector< Scope > scopes_

Friends

void swap (Rewriter &rw1, Rewriter &rw2) noexcept

Detailed Description

Recurseivly rebuilds part of a program into the provided World w.r.t. Rewriter::map.

This World may be different than the World we started with.

See also
Rewriter

Definition at line 21 of file rewrite.h.


Class Documentation

◆ mim::Rewriter::Scope

struct mim::Rewriter::Scope

Definition at line 122 of file rewrite.h.

Class Members
Vars new_vars
Def2Def old2new
Vars old_vars Only mappings depending on these go here; the root's are VarRewriter's substitutions.

Constructor & Destructor Documentation

◆ Rewriter()

◆ ~Rewriter()

mim::Rewriter::~Rewriter ( )
virtualdefault

References reset().

Member Function Documentation

◆ bind()

void mim::Rewriter::bind ( const Var * old_var,
const Var * new_var )
inline

Definition at line 46 of file rewrite.h.

References bind_new(), and bind_old().

Referenced by mim::plug::affine::phase::LowerIndex::rewrite_imm_App().

◆ bind_new()

void mim::Rewriter::bind_new ( const Var * var)

Adds the new var - if any - to the innermost scope.

Definition at line 44 of file rewrite.cpp.

References scopes_, mim::World::vars(), and mim::Def::world().

Referenced by bind().

◆ bind_old()

void mim::Rewriter::bind_old ( const Var * var)

Adds the old var - if any - to the innermost scope.

Definition at line 40 of file rewrite.cpp.

References scopes_, mim::World::vars(), and mim::Def::world().

Referenced by mim::VarRewriter::add(), bind(), mim::plug::clos::phase::ClosConv::finalize(), and mim::VarRewriter::rewrite_mut().

◆ curr_mut()

template<class D = Def>
D * mim::Rewriter::curr_mut ( ) const
inline

◆ enter()

auto mim::Rewriter::enter ( Def * new_mut)
inlinenodiscardprotected

◆ has_intersection()

bool mim::Rewriter::has_intersection ( const Def * old_def)
inlineprotected

Does old_def depend on the old Vars of any scope?

Definition at line 107 of file rewrite.h.

References mim::Def::has_free_vars_in(), and scopes_.

Referenced by mim::VarRewriter::rewrite().

◆ lookup()

virtual const Def * mim::Rewriter::lookup ( const Def * old_def)
inlinevirtual

Lookup old_def by searching in reverse through the stack of maps.

Returns
nullptr if nothing was found.

Reimplemented in mim::Analysis, mim::NomErasure, mim::RWPhase, and mim::Zonker.

Definition at line 66 of file rewrite.h.

References scopes_.

Referenced by mim::Analysis::lookup(), mim::NomErasure::lookup(), mim::RWPhase::lookup(), mim::Importer::rewrite(), rewrite(), and mim::VarRewriter::rewrite().

◆ map() [1/4]

◆ map() [2/4]

const Def * mim::Rewriter::map ( const Def * old_def,
Defs new_defs )

Definition at line 48 of file rewrite.cpp.

References map(), mim::World::tuple(), and world().

◆ map() [3/4]

const Def * mim::Rewriter::map ( Defs old_defs,
const Def * new_def )

Definition at line 52 of file rewrite.cpp.

References map(), mim::World::tuple(), and world().

◆ map() [4/4]

const Def * mim::Rewriter::map ( Defs old_defs,
Defs new_defs )

Definition at line 56 of file rewrite.cpp.

References map(), mim::World::tuple(), and world().

◆ old2new()

Def2Def & mim::Rewriter::old2new ( )
inlineprotected

The map of the innermost push() scope.

Definition at line 104 of file rewrite.h.

References scopes_.

Referenced by mim::Zonker::lookup(), and mim::Analysis::start().

◆ pop()

◆ push()

void mim::Rewriter::push ( Vars old_vars = {},
Vars new_vars = {} )
inline

Opens a scope for the mappings whose old Def depends on old_vars or whose new Def depends on new_vars. The root scope takes all others.

Definition at line 40 of file rewrite.h.

Referenced by mim::plug::clos::phase::ClosConv::finalize(), mim::Analysis::reset(), reset(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), rewrite_mut_Seq(), and Rewriter().

◆ reset()

void mim::Rewriter::reset ( )

Definition at line 23 of file rewrite.cpp.

References pop(), push(), and scopes_.

Referenced by ~Rewriter().

◆ rewrite() [1/2]

const Def * mim::Rewriter::rewrite ( const Def * old_def)
virtual

Reimplemented in mim::Analysis, mim::EtaConv, mim::Importer, mim::plug::affine::phase::LowerIndex, mim::plug::clos::phase::Clos2SJLJ, mim::plug::clos::phase::LowerTypedClos, mim::plug::mem::phase::AddMem, mim::plug::tensor::phase::LowerToMem, mim::Repl, mim::RetWrap, mim::VarRewriter, and mim::Zonker.

Definition at line 62 of file rewrite.cpp.

References mim::Def::dbg_key(), mim::Def::isa_mut(), lookup(), rewrite_imm(), and rewrite_mut().

Referenced by mim::plug::autodiff::phase::Eval::augment_(), mim::Importer::import(), mim::Analysis::rewrite(), mim::EtaConv::rewrite(), mim::Importer::rewrite(), mim::plug::affine::phase::LowerIndex::rewrite(), mim::plug::clos::phase::Clos2SJLJ::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::mem::phase::AddMem::rewrite(), mim::plug::tensor::phase::LowerToMem::rewrite(), mim::Repl::rewrite(), mim::RetWrap::rewrite(), rewrite(), mim::Zonker::rewrite(), mim::RWPhase::rewrite_external(), mim::ADCE::rewrite_imm_App(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::autodiff::phase::Eval::rewrite_imm_App(), mim::plug::buffer::LowerPtr::rewrite_imm_App(), mim::plug::clos::phase::BranchClosElim::rewrite_imm_App(), mim::plug::clos::phase::ClosConv::rewrite_imm_App(), mim::plug::clos::phase::ClosConvPrep::rewrite_imm_App(), mim::plug::cps::Conv::rewrite_imm_App(), mim::plug::gpu::phase::RemoveDoubleSyncs::rewrite_imm_App(), mim::plug::mem::phase::FreeLocals::rewrite_imm_App(), mim::plug::mem::phase::Heap2Stack::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_App(), mim::plug::regex::LowerRegex::rewrite_imm_App(), mim::plug::tensor::phase::Fuse::rewrite_imm_App(), mim::plug::tensor::phase::Lower::rewrite_imm_App(), mim::plug::tensor::phase::LowerMapReduce::rewrite_imm_App(), mim::RWPhase::rewrite_imm_App(), mim::Scalarize::rewrite_imm_App(), mim::SCCP::rewrite_imm_App(), mim::StaticArgOpt::rewrite_imm_App(), mim::SingleErasure::rewrite_imm_Extract(), mim::SingleErasure::rewrite_imm_Inj(), mim::SingleErasure::rewrite_imm_Insert(), mim::SingleErasure::rewrite_imm_Match(), mim::NomErasure::rewrite_imm_Name(), mim::NomErasure::rewrite_imm_Nom(), rewrite_imm_Seq(), mim::SingleErasure::rewrite_imm_Sigma(), mim::NomErasure::rewrite_imm_Struc(), mim::plug::clos::phase::LowerTypedClosPrep::rewrite_imm_Tuple(), mim::RWPhase::rewrite_imm_Tuple(), mim::SingleErasure::rewrite_imm_Variant(), mim::DispatchNormalize::rewrite_mut_Lam(), mim::plug::clos::phase::ClosConv::rewrite_mut_Lam(), mim::plug::cps::Conv::rewrite_mut_Lam(), mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam(), mim::StaticArgOpt::rewrite_mut_Lam(), rewrite_mut_Seq(), mim::SingleErasure::rewrite_mut_Sigma(), rewrite_stub(), rewrite_stub(), and mim::RWPhase::rewrite_stub().

◆ rewrite() [2/2]

DefVec mim::Rewriter::rewrite ( Defs ops)
virtual

Definition at line 95 of file rewrite.cpp.

References rewrite().

◆ rewrite_imm()

◆ rewrite_imm_App()

◆ rewrite_imm_Arr()

virtual const Def * mim::Rewriter::rewrite_imm_Arr ( const Arr * )
virtual

◆ rewrite_imm_Axm()

virtual const Def * mim::Rewriter::rewrite_imm_Axm ( const Axm * )
virtual

◆ rewrite_imm_Bot()

virtual const Def * mim::Rewriter::rewrite_imm_Bot ( const Bot * )
virtual

◆ rewrite_imm_Extract()

◆ rewrite_imm_Idx()

virtual const Def * mim::Rewriter::rewrite_imm_Idx ( const Idx * )
virtual

◆ rewrite_imm_Inj()

virtual const Def * mim::Rewriter::rewrite_imm_Inj ( const Inj * )
virtual

◆ rewrite_imm_Insert()

virtual const Def * mim::Rewriter::rewrite_imm_Insert ( const Insert * )
virtual

◆ rewrite_imm_Join()

virtual const Def * mim::Rewriter::rewrite_imm_Join ( const Join * )
virtual

◆ rewrite_imm_Lam()

virtual const Def * mim::Rewriter::rewrite_imm_Lam ( const Lam * )
virtual

◆ rewrite_imm_Level()

virtual const Def * mim::Rewriter::rewrite_imm_Level ( const Level * )
virtual

◆ rewrite_imm_Lit()

virtual const Def * mim::Rewriter::rewrite_imm_Lit ( const Lit * )
virtual

◆ rewrite_imm_LMax()

virtual const Def * mim::Rewriter::rewrite_imm_LMax ( const LMax * )
virtual

◆ rewrite_imm_LSucc()

virtual const Def * mim::Rewriter::rewrite_imm_LSucc ( const LSucc * )
virtual

◆ rewrite_imm_Match()

virtual const Def * mim::Rewriter::rewrite_imm_Match ( const Match * )
virtual

◆ rewrite_imm_Name()

virtual const Def * mim::Rewriter::rewrite_imm_Name ( const Name * )
virtual

Reimplemented in mim::NomErasure.

◆ rewrite_imm_Nat()

virtual const Def * mim::Rewriter::rewrite_imm_Nat ( const Nat * )
virtual

◆ rewrite_imm_Nom()

virtual const Def * mim::Rewriter::rewrite_imm_Nom ( const Nom * )
virtual

Reimplemented in mim::NomErasure.

◆ rewrite_imm_Pack()

virtual const Def * mim::Rewriter::rewrite_imm_Pack ( const Pack * )
virtual

◆ rewrite_imm_Pi()

virtual const Def * mim::Rewriter::rewrite_imm_Pi ( const Pi * )
virtual

◆ rewrite_imm_Proxy()

virtual const Def * mim::Rewriter::rewrite_imm_Proxy ( const Proxy * )
virtual

Reimplemented in mim::Analysis.

◆ rewrite_imm_Reform()

virtual const Def * mim::Rewriter::rewrite_imm_Reform ( const Reform * )
virtual

◆ rewrite_imm_Rule()

virtual const Def * mim::Rewriter::rewrite_imm_Rule ( const Rule * )
virtual

◆ rewrite_imm_Seq()

const Def * mim::Rewriter::rewrite_imm_Seq ( const Seq * seq)
virtual

◆ rewrite_imm_Sigma()

virtual const Def * mim::Rewriter::rewrite_imm_Sigma ( const Sigma * )
virtual

◆ rewrite_imm_Single()

virtual const Def * mim::Rewriter::rewrite_imm_Single ( const Single * )
virtual

Reimplemented in mim::SingleErasure.

◆ rewrite_imm_Struc()

virtual const Def * mim::Rewriter::rewrite_imm_Struc ( const Struc * )
virtual

Reimplemented in mim::NomErasure.

◆ rewrite_imm_Top()

virtual const Def * mim::Rewriter::rewrite_imm_Top ( const Top * )
virtual

◆ rewrite_imm_Tuple()

virtual const Def * mim::Rewriter::rewrite_imm_Tuple ( const Tuple * )
virtual

◆ rewrite_imm_Type()

virtual const Def * mim::Rewriter::rewrite_imm_Type ( const Type * )
virtual

◆ rewrite_imm_Var()

virtual const Def * mim::Rewriter::rewrite_imm_Var ( const Var * )
virtual

◆ rewrite_imm_Variant()

virtual const Def * mim::Rewriter::rewrite_imm_Variant ( const Variant * )
virtual

◆ rewrite_imm_Wrap()

virtual const Def * mim::Rewriter::rewrite_imm_Wrap ( const Wrap * )
virtual

Reimplemented in mim::SingleErasure.

◆ rewrite_mut()

const Def * mim::Rewriter::rewrite_mut ( Def * old_mut)
virtual

◆ rewrite_mut_Arr()

virtual const Def * mim::Rewriter::rewrite_mut_Arr ( Arr * )
virtual

◆ rewrite_mut_Hole()

virtual const Def * mim::Rewriter::rewrite_mut_Hole ( Hole * )
virtual

Reimplemented in mim::Analysis.

◆ rewrite_mut_Lam()

◆ rewrite_mut_Pack()

virtual const Def * mim::Rewriter::rewrite_mut_Pack ( Pack * )
virtual

Reimplemented in mim::Analysis.

◆ rewrite_mut_Pi()

virtual const Def * mim::Rewriter::rewrite_mut_Pi ( Pi * )
virtual

◆ rewrite_mut_Rule()

virtual const Def * mim::Rewriter::rewrite_mut_Rule ( Rule * )
virtual

Reimplemented in mim::Analysis.

◆ rewrite_mut_Seq()

◆ rewrite_mut_Sigma()

virtual const Def * mim::Rewriter::rewrite_mut_Sigma ( Sigma * )
virtual

◆ rewrite_mut_Variant()

virtual const Def * mim::Rewriter::rewrite_mut_Variant ( Variant * )
virtual

Reimplemented in mim::Analysis.

◆ rewrite_stub() [1/2]

const Def * mim::Rewriter::rewrite_stub ( Def * old_mut,
Def * new_mut )
virtual

◆ rewrite_stub() [2/2]

const Def * mim::Rewriter::rewrite_stub ( Def * old_mut,
Def * new_mut,
fe::View< size_t > new2old )

Like above, but new_mut may have a different number of ops than old_mut: new_mut->op(i) is rewritten from old_mut->op(new2old[i]).

This is what a Phase needs that reshapes an aggregate;

See also
Sieve.

Definition at line 268 of file rewrite.cpp.

References enter(), mim::Def::is_set(), map(), mim::Def::num_ops(), mim::Def::op(), rewrite(), seal(), and mim::Def::set().

◆ seal()

const Def * mim::Rewriter::seal ( Def * old_mut,
Def * new_mut )
protected

The tail of rewrite_stub: immutabilizes new_mut in hindsight, as rewriting may have made it vacuous.

A stub that already has users stays mutable, as the users captured it during its own rewrite. Only needed if you fill a stub yourself instead of going through rewrite_stub.

Definition at line 280 of file rewrite.cpp.

References mim::Def::immutabilize(), mim::Def::is_immutabilizable(), map(), and mim::Def::users().

Referenced by mim::DispatchNormalize::rewrite_mut_Lam(), mim::plug::clos::phase::Clos2SJLJ::rewrite_mut_Lam(), mim::plug::tensor::phase::LowerToMem::rewrite_mut_Lam(), rewrite_stub(), rewrite_stub(), and mim::RWPhase::rewrite_stub().

◆ world()

◆ swap

void swap ( Rewriter & rw1,
Rewriter & rw2 )
friend

Member Data Documentation

◆ scopes_

fe::Vector<Scope> mim::Rewriter::scopes_
protected

The documentation for this class was generated from the following files: