Recurseivly rebuilds part of a program into the provided World w.r.t. Rewriter::map. More...
#include <mim/rewrite.h>
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 | |
| 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 |
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.
| struct mim::Rewriter::Scope |
| mim::Rewriter::Rewriter | ( | World & | world | ) |
Definition at line 16 of file rewrite.cpp.
References push(), and world().
Referenced by mim::Analysis::Analysis(), mim::Analysis::Analysis(), mim::Importer::Importer(), mim::Importer::swap, swap, mim::VarRewriter::swap, mim::Zonker::swap, mim::VarRewriter::VarRewriter(), mim::VarRewriter::VarRewriter(), and mim::Zonker::Zonker().
|
virtualdefault |
References reset().
Definition at line 46 of file rewrite.h.
References bind_new(), and bind_old().
Referenced by mim::plug::affine::phase::LowerIndex::rewrite_imm_App().
| 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().
| 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().
|
inline |
Definition at line 98 of file rewrite.h.
Referenced by mim::plug::mem::EscapeAnalysis::leave(), mim::plug::clos::phase::ClosConvPrep::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_App(), and mim::Analysis::touch().
|
inlinenodiscardprotected |
Updates curr_mut() to new_mut and restores it at the end of the scope.
Definition at line 115 of file rewrite.h.
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().
|
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 old_def by searching in reverse through the stack of maps.
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().
Records the mapping in the innermost push() scope it depends on.
Definition at line 29 of file rewrite.cpp.
References mim::Def::has_free_vars_in(), mim::Def::has_var(), scopes_, mim::World::vars(), and mim::Def::world().
Referenced by mim::VarRewriter::add(), mim::Analysis::lattice(), mim::Analysis::lattice_force(), mim::RWPhase::lookup(), map(), map(), map(), mim::Zonker::rewire_mut(), mim::Importer::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite(), rewrite_imm(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::mem::phase::Heap2Stack::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_App(), mim::SCCP::rewrite_imm_App(), mim::Analysis::rewrite_mut(), mim::Zonker::rewrite_mut(), mim::DispatchNormalize::rewrite_mut_Lam(), mim::plug::clos::phase::Clos2SJLJ::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::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::plug::tensor::phase::LowerToMem::rewrite_mut_Lam(), mim::RetWrap::rewrite_mut_Lam(), mim::StaticArgOpt::rewrite_mut_Lam(), rewrite_mut_Seq(), rewrite_stub(), rewrite_stub(), mim::RWPhase::rewrite_stub(), seal(), and mim::Analysis::start().
Definition at line 48 of file rewrite.cpp.
References map(), mim::World::tuple(), and world().
Definition at line 52 of file rewrite.cpp.
References map(), mim::World::tuple(), and world().
Definition at line 56 of file rewrite.cpp.
References map(), mim::World::tuple(), and world().
|
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().
|
inline |
Definition at line 41 of file rewrite.h.
References scopes_.
Referenced by mim::plug::clos::phase::ClosConv::finalize(), reset(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), and rewrite_mut_Seq().
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().
| void mim::Rewriter::reset | ( | ) |
Definition at line 23 of file rewrite.cpp.
References pop(), push(), and scopes_.
Referenced by ~Rewriter().
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().
Definition at line 95 of file rewrite.cpp.
References rewrite().
Reimplemented in mim::plug::clos::phase::LowerTypedClos, and mim::plug::mem::EscapeAnalysis.
Definition at line 74 of file rewrite.cpp.
References CODE_IMM, map(), MIM_IMM_NODE, and mim::Def::node().
Referenced by rewrite(), mim::VarRewriter::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), and mim::plug::mem::EscapeAnalysis::rewrite_imm().
Reimplemented in mim::ADCE, mim::BetaRed, mim::EtaConv, mim::LamSpec, mim::plug::affine::phase::LowerFor, mim::plug::affine::phase::LowerIndex, mim::plug::autodiff::phase::Eval, mim::plug::btensor::phase::LowerMapReduce, mim::plug::buffer::LowerPtr, mim::plug::clos::phase::BranchClosElim, mim::plug::clos::phase::ClosConv, mim::plug::clos::phase::ClosConvPrep, mim::plug::clos::phase::LowerTypedClos, mim::plug::cps::Conv, mim::plug::gpu::phase::LowerMapReduce, mim::plug::gpu::phase::MemChecks, mim::plug::gpu::phase::RemoveDoubleSyncs, mim::plug::mem::EscapeAnalysis, mim::plug::mem::phase::AddMem, mim::plug::mem::phase::FreeLocals, mim::plug::mem::phase::Heap2Stack, mim::plug::mem::phase::SEO, mim::plug::regex::LowerRegex, mim::plug::tensor::phase::Fuse, mim::plug::tensor::phase::Lower, mim::plug::tensor::phase::LowerMapReduce, mim::plug::tensor::phase::LowerToMem, mim::plug::tensor::phase::Reassoc, mim::RWPhase, mim::Scalarize, mim::SCCP, and mim::StaticArgOpt.
References CODE_IMM, and MIM_IMM_NODE.
Referenced by mim::plug::gpu::phase::MemChecks::rewrite_imm_App(), mim::plug::mem::EscapeAnalysis::rewrite_imm_App(), and mim::plug::mem::phase::AddMem::rewrite_imm_App().
Reimplemented in mim::plug::clos::phase::ClosConv, mim::plug::tensor::phase::Lower, mim::plug::tensor::phase::LowerToMem, and mim::SingleErasure.
Referenced by mim::plug::clos::phase::ClosConv::rewrite_imm_Extract(), mim::plug::tensor::phase::Lower::rewrite_imm_Extract(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_Extract(), and mim::SingleErasure::rewrite_imm_Extract().
Reimplemented in mim::SingleErasure.
Referenced by mim::SingleErasure::rewrite_imm_Inj().
Reimplemented in mim::plug::tensor::phase::LowerToMem, and mim::SingleErasure.
Referenced by mim::plug::tensor::phase::LowerToMem::rewrite_imm_Insert(), and mim::SingleErasure::rewrite_imm_Insert().
Reimplemented in mim::SingleErasure.
Referenced by mim::SingleErasure::rewrite_imm_Match().
Reimplemented in mim::NomErasure.
Reimplemented in mim::NomErasure.
Reimplemented in mim::plug::clos::phase::ClosConv, mim::plug::mem::phase::AddMem, and mim::Scalarize.
Referenced by mim::plug::clos::phase::ClosConv::rewrite_imm_Pi(), and mim::plug::mem::phase::AddMem::rewrite_imm_Pi().
Reimplemented in mim::Analysis.
Reimplemented in mim::SingleErasure.
Definition at line 230 of file rewrite.cpp.
References mim::Seq::body(), mim::Def::is_intro(), mim::Lit::isa(), mim::World::prod(), rewrite(), mim::World::seq(), mim::Seq::shape(), and world().
Referenced by mim::plug::mem::phase::AddMem::rewrite(), mim::SingleErasure::rewrite_imm_Seq(), and rewrite_mut_Arr().
Reimplemented in mim::SingleErasure.
Referenced by mim::plug::mem::phase::AddMem::rewrite(), and mim::SingleErasure::rewrite_imm_Sigma().
Reimplemented in mim::SingleErasure.
Reimplemented in mim::NomErasure.
Reimplemented in mim::plug::clos::phase::LowerTypedClosPrep, mim::plug::mem::phase::AddMem, mim::RWPhase, and mim::SingleErasure.
Referenced by mim::plug::mem::phase::AddMem::rewrite_imm_Tuple().
Reimplemented in mim::EtaConv, and mim::plug::mem::phase::SEO.
Referenced by mim::plug::mem::phase::SEO::rewrite_imm_Var().
Reimplemented in mim::SingleErasure.
Referenced by mim::SingleErasure::rewrite_imm_Variant().
Reimplemented in mim::SingleErasure.
Reimplemented in mim::Analysis, mim::VarRewriter, and mim::Zonker.
Definition at line 83 of file rewrite.cpp.
References CODE_MUT, MIM_MUT_NODE, and mim::Def::node().
Referenced by mim::plug::clos::phase::LowerTypedClos::rewrite(), rewrite(), mim::Analysis::rewrite_mut(), and mim::VarRewriter::rewrite_mut().
Reimplemented in mim::Analysis.
References CODE_MUT, MIM_MUT_NODE, rewrite_imm_Seq(), and rewrite_mut_Seq().
Reimplemented in mim::Analysis.
Reimplemented in mim::ADCE, mim::Analysis, mim::DispatchNormalize, mim::plug::clos::phase::Clos2SJLJ, mim::plug::clos::phase::ClosConv, mim::plug::cps::Conv, mim::plug::gpu::phase::SplitOffKernels, mim::plug::mem::phase::AddMem, mim::plug::mem::phase::SEO, mim::plug::tensor::phase::LowerToMem, mim::RetWrap, mim::Scalarize, and mim::StaticArgOpt.
Referenced by mim::ADCE::rewrite_mut_Lam(), mim::plug::clos::phase::ClosConv::rewrite_mut_Lam(), mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam(), mim::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::plug::mem::phase::SEO::rewrite_mut_Lam(), mim::RetWrap::rewrite_mut_Lam(), mim::Scalarize::rewrite_mut_Lam(), and mim::StaticArgOpt::rewrite_mut_Lam().
Reimplemented in mim::Analysis.
Reimplemented in mim::Analysis, and mim::plug::clos::phase::ClosConv.
Referenced by mim::plug::clos::phase::ClosConv::rewrite_mut_Pi().
Reimplemented in mim::Analysis.
Reimplemented in mim::SingleErasure.
Definition at line 236 of file rewrite.cpp.
References mim::Seq::body(), mim::Def::has_var(), mim::Shape::is_fused(), mim::Def::is_intro(), mim::Def::is_set(), mim::Lit::isa(), map(), pop(), mim::World::prod(), push(), rewrite(), rewrite_stub(), mim::Seq::shape(), mim::Def::type(), world(), and mim::Def::zonk().
Referenced by rewrite_mut_Arr(), and mim::SingleErasure::rewrite_mut_Seq().
Reimplemented in mim::Analysis, and mim::SingleErasure.
Referenced by mim::SingleErasure::rewrite_mut_Sigma().
Reimplemented in mim::Analysis.
Reimplemented in mim::RWPhase.
Definition at line 257 of file rewrite.cpp.
References enter(), mim::Def::is_set(), map(), mim::Def::num_ops(), mim::Def::op(), rewrite(), seal(), and mim::Def::set().
Referenced by rewrite_mut_Seq(), and mim::RWPhase::rewrite_stub().
| 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;
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().
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().
|
inline |
Definition at line 33 of file rewrite.h.
Referenced by mim::Importer::Importer(), map(), map(), map(), mim::RWPhase::new_world(), mim::Importer::rewrite(), rewrite_imm_Seq(), rewrite_mut_Seq(), Rewriter(), mim::VarRewriter::VarRewriter(), mim::VarRewriter::VarRewriter(), and mim::Zonker::Zonker().
Definition at line 133 of file rewrite.h.
References Rewriter(), and swap.
Referenced by mim::plug::gpu::phase::SplitApply::start(), mim::plug::gpu::phase::SplitOffKernels::start(), mim::RWPhase::start(), and swap.
|
protected |
Definition at line 127 of file rewrite.h.
Referenced by bind_new(), bind_old(), has_intersection(), lookup(), map(), old2new(), pop(), mim::Analysis::reset(), and reset().