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

Rebuilds old_world() into new_world() and then swaps them. More...

#include <mim/phase.h>

Inheritance diagram for mim::RWPhase:
[legend]

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_

Detailed Description

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().

Note
You can override
See also
RWPhase

Definition at line 330 of file phase.h.

Constructor & Destructor Documentation

◆ RWPhase() [1/2]

◆ RWPhase() [2/2]

mim::RWPhase::RWPhase ( World & world,
flags_t annex,
Analysis * analysis = nullptr )
inline

Definition at line 336 of file phase.h.

References mim::Phase::Analysis, analysis(), mim::Phase::annex(), RWPhase(), and world().

Member Function Documentation

◆ abstracted()

const Def * mim::RWPhase::abstracted ( const Def * old_def) const
inline

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().

◆ analysis() [1/2]

Analysis * mim::RWPhase::analysis ( )
inline

Definition at line 342 of file phase.h.

References mim::Phase::Analysis.

Referenced by RWPhase(), and RWPhase().

◆ analysis() [2/2]

const Analysis * mim::RWPhase::analysis ( ) const
inline

Definition at line 343 of file phase.h.

References mim::Phase::Analysis.

◆ analyze()

bool mim::RWPhase::analyze ( )
virtual

◆ coerce()

const Def * mim::RWPhase::coerce ( const Def * new_type,
const Def * new_val )
protected

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().

◆ finalize()

virtual void mim::RWPhase::finalize ( )
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().

◆ is_top()

bool mim::RWPhase::is_top ( const Def * old_def) const
inline

Definition at line 355 of file phase.h.

Referenced by mim::SCCP::rewrite_imm_App().

◆ lattice()

const Def * mim::RWPhase::lattice ( const Def * old_def) const
inline

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()

const Def * mim::RWPhase::lookup ( const Def * old_def)
overridevirtual

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

Returns
nullptr if nothing was found.

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().

◆ new_world()

World & mim::RWPhase::new_world ( )
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().

◆ old_world()

◆ rewrite_external()

void mim::RWPhase::rewrite_external ( Def * old_mut)
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().

◆ rewrite_imm_App()

const Def * mim::RWPhase::rewrite_imm_App ( const App * app)
overrideprotectedvirtual

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().

◆ rewrite_imm_Tuple()

const Def * mim::RWPhase::rewrite_imm_Tuple ( const Tuple * tuple)
overrideprotectedvirtual

◆ rewrite_stub() [1/2]

◆ rewrite_stub() [2/2]

const Def * mim::Rewriter::rewrite_stub ( Def * old_mut,
Def * new_mut,
fe::View< size_t > new2old )
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;

See also
Sieve.

Definition at line 83 of file rewrite.cpp.

◆ splittable()

bool mim::RWPhase::splittable ( const Def * type)
inlinestaticprotected

Does coerce() explode and reassemble values of type?

Definition at line 399 of file phase.h.

◆ start()

◆ world()


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