Rebuilds old_world() into new_world() and then swaps them. More...
#include <mim/phase.h>
Public Member Functions | |
Construction | |
| RWPhase (World &world, std::string name, Analysis *analysis=nullptr) | |
| RWPhase (World &world, flags_t annex, Analysis *analysis=nullptr) | |
Analysis | |
| Analysis * | analysis () |
| const Analysis * | analysis () const |
| const Def * | lattice (const Def *old_def) const |
| Returns the abstract value computed by the associated Analysis for the given old-world Def, or nullptr if no value is available. | |
| const Def * | abstracted (const Def *old_def) const |
Returns lattice(old_def) if it differs from old_def (i.e. we learned something), otherwise nullptr. | |
| bool | is_top (const Def *old_def) const |
| virtual bool | analyze () |
| Runs the optional pre-analysis on old_world(), typically to a fixed point, before rewriting begins. | |
Rewrite | |
| virtual void | rewrite_external (Def *) |
| const Def * | lookup (const Def *) override |
| Lookup old_def by searching in reverse through the stack of maps. | |
World | |
| |
| World & | world ()=delete |
| Hides both and forbids direct access. | |
| World & | old_world () |
| Get old Defs from here. | |
| World & | new_world () |
| Create new Defs into this. | |
| Public Member Functions inherited from mim::Phase | |
| Phase (World &world, std::string name) | |
| Phase (World &world, flags_t annex) | |
| virtual | ~Phase ()=default |
| virtual std::unique_ptr< Phase > | recreate () |
| Creates a new instance; needed by a fixed-point PhaseMan. | |
| virtual void | apply (const App *) |
| Invoked if your Phase has additional args. | |
| virtual void | apply (Phase &) |
| Dito, but invoked by Phase::recreate. | |
| virtual bool | redirects () const |
| If true, Phase::create uses take_resolved(). | |
| virtual std::unique_ptr< Phase > | take_resolved () |
| The Phase to use instead; nullptr means elide. | |
| World & | world () |
| Driver & | driver () |
| const fe::Log & | log () const |
| std::string_view | name () const |
| flags_t | annex () const |
| const fe::Vector< std::string > & | args () |
| Command-line arguments passed to this Phase's plugin via -X <plugin>:<arg>. | |
| bool | todo () const |
| void | invalidate (bool todo=true) |
| Signals that another round of fixed-point iteration is required, either as part of. | |
| virtual void | run () |
| Entry point and generates some debug output; invokes Phase::start. | |
| void | profile_count (std::string_view key, uint64_t n=1) |
Adds n to the custom fe::Profiler counter key of the current run; no-op unless profiling is enabled. | |
| Public Member Functions inherited from mim::Rewriter | |
| template<class D = Def> | |
| D * | curr_mut () const |
| Rewriter (World &world) | |
| virtual | ~Rewriter () |
| void | reset () |
| World & | world () |
| 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) |
| 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 * | rewrite (const Def *) |
| virtual const Def * | rewrite_imm (const Def *) |
| virtual const Def * | rewrite_mut (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_Sigma (const Sigma *) |
| 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 | |
| void | start () override |
| Actual entry. | |
| virtual void | finalize () |
| Run after all roots have been walked but still before the two worlds are swapped. | |
| Protected Member Functions inherited from mim::Rewriter | |
| 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. | |
Coercion | |
Every checking position - an App's argument, a Tuple's ops, a Lam's body - coerce()s its value. This reconciles a representation the phase changed with one it did not, e.g. an Axm's signature. | |
| const Def * | rewrite_imm_App (const App *) override |
| const Def * | rewrite_imm_Tuple (const Tuple *) override |
| const Def * | rewrite_stub (Def *, Def *) override |
| const Def * | coerce (const Def *new_type, const Def *new_val) |
Converts the new new_val into a value of the new new_type, where a checking position demands it. | |
| 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]). | |
| static bool | splittable (const Def *type) |
Does coerce() explode and reassemble values of type? | |
Additional Inherited Members | |
| Static Public Member Functions inherited from mim::Phase | |
| static std::unique_ptr< Phase > | create (const Flags2Phases &phases, const Def *def) |
| template<class A, class P> | |
| static void | hook (Flags2Phases &phases) |
| template<class P, class... Args> | |
| static void | run (Args &&... args) |
| Runs a single Phase. | |
| Protected Attributes inherited from mim::Phase | |
| std::string | name_ |
| Protected Attributes inherited from mim::Rewriter | |
| fe::Vector< Scope > | scopes_ |
Rebuilds old_world() into new_world() and then swaps them.
It is a Phase and a Rewriter that runs an optional analyze() to a fixed point. Then, it rewrites all old World::externals(). An World::Annexes::opaque() annex is not rewritten but resolved to the annex of the same flags in new_world().
If an associated Analysis is provided, the rewrite can query its abstract results through lattice().
Definition at line 334 of file phase.h.
References mim::Phase::Analysis, analysis(), mim::Phase::name(), RWPhase(), and world().
Referenced by mim::ADCE::ADCE(), mim::ADCE::ADCE(), mim::plug::mem::phase::FreeLocals::FreeLocals(), mim::plug::mem::phase::Heap2Stack::Heap2Stack(), RWPhase(), RWPhase(), mim::Scalarize::Scalarize(), mim::SCCP::SCCP(), mim::plug::mem::phase::SEO::SEO(), mim::SingleErasure::SingleErasure(), mim::SingleErasure::SingleErasure(), and mim::plug::gpu::phase::SplitOffKernels::start().
Definition at line 336 of file phase.h.
References mim::Phase::Analysis, analysis(), mim::Phase::annex(), RWPhase(), and world().
Returns lattice(old_def) if it differs from old_def (i.e. we learned something), otherwise nullptr.
Definition at line 350 of file phase.h.
References lattice().
Referenced by mim::plug::mem::phase::SEO::rewrite_imm_App(), and mim::SCCP::rewrite_imm_App().
|
inline |
Definition at line 342 of file phase.h.
References mim::Phase::Analysis.
|
inline |
Definition at line 343 of file phase.h.
References mim::Phase::Analysis.
|
virtual |
Runs the optional pre-analysis on old_world(), typically to a fixed point, before rewriting begins.
If analysis() is set, this is the natural place to iterate until Phase::todo() becomes false. If no Analysis is needed, simply return false.
Reimplemented in mim::BetaRed, mim::EtaConv, mim::plug::clos::phase::ClosConvPrep, mim::plug::clos::phase::LowerTypedClosPrep, mim::plug::gpu::phase::SplitOffKernels, mim::plug::mem::phase::AddMem, mim::plug::mem::phase::FreeLocals, mim::plug::mem::phase::Heap2Stack, mim::plug::mem::phase::SEO, mim::RetWrap, and mim::StaticArgOpt.
Definition at line 202 of file phase.cpp.
Referenced by mim::plug::mem::phase::FreeLocals::analyze(), mim::plug::mem::phase::Heap2Stack::analyze(), mim::plug::mem::phase::SEO::analyze(), and start().
Converts the new new_val into a value of the new new_type, where a checking position demands it.
Both are matched leaf by leaf: tuples are exploded and reassembled, Pis are η-wrapped, and information-free components are dropped or filled in with their sole inhabitant.
Definition at line 264 of file phase.cpp.
References new_world(), mim::Phase::todo(), and mim::Def::type().
Referenced by rewrite_imm_App(), mim::Scalarize::rewrite_imm_App(), rewrite_imm_Tuple(), and rewrite_stub().
|
inlineprotectedvirtual |
Run after all roots have been walked but still before the two worlds are swapped.
This is where you drain a worklist of rewrites your hooks deferred (see e.g. clos::phase::ClosConv).
Reimplemented in mim::plug::clos::phase::ClosConv, and mim::plug::clos::phase::LowerTypedClos.
Definition at line 406 of file phase.h.
Referenced by start().
|
inline |
Definition at line 355 of file phase.h.
Referenced by mim::SCCP::rewrite_imm_App().
Returns the abstract value computed by the associated Analysis for the given old-world Def, or nullptr if no value is available.
Definition at line 347 of file phase.h.
Referenced by abstracted().
Lookup old_def by searching in reverse through the stack of maps.
Reimplemented from mim::Rewriter.
Definition at line 212 of file phase.cpp.
References mim::Phase::annex(), mim::Rewriter::lookup(), mim::Rewriter::map(), new_world(), and old_world().
Referenced by mim::NomErasure::lookup(), mim::plug::clos::phase::LowerTypedClos::rewrite(), and mim::plug::affine::phase::LowerIndex::rewrite_imm_App().
|
inline |
Create new Defs into this.
Definition at line 379 of file phase.h.
References mim::Rewriter::world().
Referenced by coerce(), lookup(), mim::plug::affine::phase::LowerIndex::rewrite(), mim::plug::clos::phase::Clos2SJLJ::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), mim::ADCE::rewrite_imm_App(), mim::EtaConv::rewrite_imm_App(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::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::clos::phase::LowerTypedClos::rewrite_imm_App(), mim::plug::cps::Conv::rewrite_imm_App(), mim::plug::mem::phase::AddMem::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::Lower::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_App(), 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_Insert(), mim::SingleErasure::rewrite_imm_Match(), mim::plug::mem::phase::AddMem::rewrite_imm_Pi(), mim::SingleErasure::rewrite_imm_Seq(), mim::SingleErasure::rewrite_imm_Sigma(), mim::plug::clos::phase::LowerTypedClosPrep::rewrite_imm_Tuple(), mim::plug::mem::phase::AddMem::rewrite_imm_Tuple(), rewrite_imm_Tuple(), mim::EtaConv::rewrite_imm_Var(), 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(), mim::SingleErasure::rewrite_mut_Seq(), mim::SingleErasure::rewrite_mut_Sigma(), mim::plug::gpu::phase::SplitApply::start(), mim::plug::gpu::phase::SplitOffKernels::start(), and start().
|
inline |
Get old Defs from here.
Definition at line 378 of file phase.h.
References mim::Phase::world().
Referenced by mim::BetaRed::analyze(), mim::EtaConv::analyze(), mim::plug::clos::phase::ClosConvPrep::analyze(), mim::plug::clos::phase::LowerTypedClosPrep::analyze(), mim::plug::gpu::phase::SplitOffKernels::analyze(), mim::plug::mem::phase::AddMem::analyze(), mim::plug::mem::phase::FreeLocals::analyze(), mim::plug::mem::phase::Heap2Stack::analyze(), mim::RetWrap::analyze(), mim::StaticArgOpt::analyze(), mim::plug::autodiff::phase::Eval::augment_(), mim::plug::clos::phase::ClosConv::finalize(), lookup(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::SingleErasure::rewrite_imm_Extract(), mim::SingleErasure::rewrite_imm_Insert(), mim::SingleErasure::rewrite_imm_Seq(), mim::SingleErasure::rewrite_imm_Tuple(), mim::RetWrap::rewrite_mut_Lam(), mim::SingleErasure::rewrite_mut_Seq(), mim::plug::gpu::phase::LowerMapReduce::start(), mim::plug::gpu::phase::SplitApply::start(), mim::plug::gpu::phase::SplitOffKernels::start(), mim::plug::tensor::phase::Fuse::start(), mim::plug::tensor::phase::Reassoc::start(), start(), and mim::Repl::world().
|
virtual |
Reimplemented in mim::EtaConv.
Definition at line 218 of file phase.cpp.
References mim::Def::is_external(), and mim::Rewriter::rewrite().
Referenced by start().
Reimplemented from mim::Rewriter.
Reimplemented in mim::plug::mem::phase::SEO, mim::Scalarize, mim::SCCP, and mim::StaticArgOpt.
Definition at line 223 of file phase.cpp.
References mim::World::app(), mim::App::arg(), mim::App::callee(), coerce(), new_world(), and mim::Rewriter::rewrite().
Referenced by mim::ADCE::rewrite_imm_App(), mim::BetaRed::rewrite_imm_App(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::autodiff::phase::Eval::rewrite_imm_App(), mim::plug::btensor::phase::LowerMapReduce::rewrite_imm_App(), mim::plug::buffer::LowerPtr::rewrite_imm_App(), mim::plug::clos::phase::BranchClosElim::rewrite_imm_App(), mim::plug::clos::phase::ClosConvPrep::rewrite_imm_App(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm_App(), mim::plug::gpu::phase::LowerMapReduce::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::plug::tensor::phase::LowerToMem::rewrite_imm_App(), mim::plug::tensor::phase::Reassoc::rewrite_imm_App(), mim::Scalarize::rewrite_imm_App(), mim::SCCP::rewrite_imm_App(), and mim::StaticArgOpt::rewrite_imm_App().
Reimplemented from mim::Rewriter.
Reimplemented in mim::SingleErasure.
Definition at line 237 of file phase.cpp.
References coerce(), mim::has_inferred_type(), mim::Lit::isa(), new_world(), mim::Def::ops(), mim::Rewriter::rewrite(), mim::World::tuple(), and mim::Def::type().
Referenced by mim::plug::clos::phase::LowerTypedClosPrep::rewrite_imm_Tuple(), and mim::SingleErasure::rewrite_imm_Tuple().
Reimplemented from mim::Rewriter.
Definition at line 250 of file phase.cpp.
References coerce(), mim::Rewriter::enter(), mim::Def::has_var(), mim::Def::is_set(), mim::Rewriter::map(), mim::Def::reduce(), mim::Rewriter::rewrite(), mim::Rewriter::rewrite_stub(), mim::Rewriter::seal(), mim::Lam::set(), mim::Lam::type(), and mim::Def::var().
Referenced by mim::RetWrap::rewrite_mut_Lam(), mim::Scalarize::rewrite_mut_Lam(), and mim::SingleErasure::rewrite_mut_Sigma().
|
protected |
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 83 of file rewrite.cpp.
|
inlinestaticprotected |
|
overrideprotectedvirtual |
Actual entry.
Implements mim::Phase.
Reimplemented in mim::plug::gpu::phase::SplitApply, and mim::plug::gpu::phase::SplitOffKernels.
Definition at line 184 of file phase.cpp.
References analyze(), mim::World::curr_gid(), mim::Phase::driver(), finalize(), mim::Driver::flags(), mim::Phase::log(), mim::Flags::max_fp_iters, mim::Phase::name(), new_world(), old_world(), mim::Phase::profile_count(), rewrite_external(), mim::Rewriter::swap, and mim::Phase::todo().
Referenced by mim::plug::gpu::phase::LowerMapReduce::start(), mim::plug::gpu::phase::SplitOffKernels::start(), mim::plug::tensor::phase::Fuse::start(), mim::plug::tensor::phase::LowerToMem::start(), and mim::plug::tensor::phase::Reassoc::start().
|
delete |
Hides both and forbids direct access.
Referenced by mim::ADCE::ADCE(), mim::ADCE::ADCE(), mim::plug::mem::phase::FreeLocals::FreeLocals(), mim::plug::mem::phase::Heap2Stack::Heap2Stack(), RWPhase(), RWPhase(), mim::Scalarize::Scalarize(), mim::SCCP::SCCP(), mim::plug::mem::phase::SEO::SEO(), mim::SingleErasure::SingleErasure(), and mim::SingleErasure::SingleErasure().