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

Rewrites the RWPhase::old_world into the RWPhase::new_world and swaps them afterwards. More...

#include <mim/phase.h>

Inheritance diagram for mim::RWPhase:
[legend]

Public Member Functions

bool is_bootstrapping () const
 Returns whether we are currently bootstrapping (rewriting annexes).
 
virtual bool analyze ()
 You can do an optional fixed-point loop on the RWPhase::old_world before rewriting.
 
Construction
 RWPhase (World &world, std::string name, Analysis *analysis=nullptr)
 
 RWPhase (World &world, flags_t annex, Analysis *analysis=nullptr)
 
Rewrite
virtual void rewrite_annex (flags_t, const Def *)
 
virtual void rewrite_external (Def *)
 
World
Worldworld ()=delete
 Hides both and forbids direct access.
 
Worldold_world ()
 Get old Defs from here.
 
Worldnew_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)
 
bool todo () const
 
virtual void run ()
 Entry point and generates some debug output; invokes Phase::start.
 
- Public Member Functions inherited from mim::Stage
Worldworld ()
 
Driverdriver ()
 
Loglog () const
 
std::string_view name () const
 
flags_t annex () const
 
 Stage (World &world, std::string name)
 
 Stage (World &world, flags_t annex)
 
virtual ~Stage ()=default
 
virtual std::unique_ptr< Stagerecreate ()
 Creates a new instance; needed by a fixed-point PhaseMan.
 
virtual void apply (const App *)
 Invoked if your Stage has additional args.
 
virtual void apply (Stage &)
 Dito, but invoked by Stage::recreate.
 
- Public Member Functions inherited from mim::Rewriter
 Rewriter (std::unique_ptr< World > &&ptr)
 
 Rewriter (World &world)
 
virtual ~Rewriter ()=default
 
void reset (std::unique_ptr< World > &&ptr)
 
void reset ()
 
Worldworld ()
 
virtual void push ()
 
virtual void pop ()
 
virtual const Defmap (const Def *old_def, const Def *new_def)
 
const Defmap (const Def *old_def, Defs new_defs)
 
const Defmap (Defs old_defs, const Def *new_def)
 
const Defmap (Defs old_defs, Defs new_defs)
 
virtual const Deflookup (const Def *old_def)
 Lookup old_def by searching in reverse through the stack of maps.
 
virtual const Defrewrite (const Def *)
 
virtual const Defrewrite_imm (const Def *)
 
virtual const Defrewrite_mut (Def *)
 
virtual const Defrewrite_stub (Def *, Def *)
 
virtual DefVec rewrite (Defs)
 
virtual const Defrewrite_imm_Seq (const Seq *seq)
 
virtual const Defrewrite_mut_Seq (Seq *seq)
 

Protected Member Functions

void start () override
 Actual entry.
 

Additional Inherited Members

template<class P, class... Args>
static void run (Args &&... args)
 Runs a single Phase.
 
static auto create (const Flags2Stages &stages, const Def *def)
 
template<class A, class P>
static void hook (Flags2Stages &stages)
 
- Protected Attributes inherited from mim::Phase
bool todo_ = false
 Set to true to indicate that you want to rerun all Phasees in your current fixed-point PhaseMan.
 
- Protected Attributes inherited from mim::Stage
std::string name_
 
- Protected Attributes inherited from mim::Rewriter
std::deque< Def2Defold2news_
 

Detailed Description

Rewrites the RWPhase::old_world into the RWPhase::new_world and swaps them afterwards.

This will destroy RWPhase::old_world leaving RWPhase::new_world which will be created here as the current World to work with. This Phase will recursively Rewriter::rewrite

  1. all (old) World::annexes() (during which RWPhase::is_bootstrapping is true), and then
  2. all (old) World::externals() (during which RWPhase::is_bootstrapping is false). All rewrites that refer to another annex have to be skipped during bootstrapping.
    Note
    You can override Rewriter::rewrite, Rewriter::rewrite_imm, Rewriter::rewrite_mut, etc.

Definition at line 108 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 116 of file phase.h.

References mim::Stage::annex(), mim::Phase::Phase(), mim::Rewriter::Rewriter(), and world().

Member Function Documentation

◆ analyze()

bool mim::RWPhase::analyze ( )
virtual

You can do an optional fixed-point loop on the RWPhase::old_world before rewriting.

If analysis_ is set, use this for the fixed-point loop.

Note
If you don't need a fixed-point, just return false after the first run of analyze.

Reimplemented in mim::BetaRedPhase, mim::EtaExpPhase, and mim::RetWrap.

Definition at line 65 of file phase.cpp.

Referenced by start().

◆ is_bootstrapping()

bool mim::RWPhase::is_bootstrapping ( ) const
inline

Returns whether we are currently bootstrapping (rewriting annexes).

While bootstrapping, you have to skip rewrites that refer to other annexes, as they might not yet be available.

Definition at line 124 of file phase.h.

Referenced by mim::plug::affine::phase::LowerFor::rewrite_imm_App(), and mim::plug::matrix::LowerMatrixLowLevel::rewrite_imm_App().

◆ new_world()

◆ old_world()

◆ rewrite_annex()

void mim::RWPhase::rewrite_annex ( flags_t f,
const Def * def )
virtual

Reimplemented in mim::EtaExpPhase.

Definition at line 75 of file phase.cpp.

References new_world(), mim::World::register_annex(), and mim::Rewriter::rewrite().

Referenced by start().

◆ rewrite_external()

void mim::RWPhase::rewrite_external ( Def * old_mut)
virtual

Reimplemented in mim::EtaExpPhase, mim::EtaRedPhase, and mim::PrefixCleanup.

Definition at line 77 of file phase.cpp.

References mim::Def::as_mut(), mim::Def::is_external(), and mim::Rewriter::rewrite().

Referenced by start().

◆ start()

void mim::RWPhase::start ( )
overrideprotectedvirtual

Actual entry.

Implements mim::Phase.

Definition at line 46 of file phase.cpp.

References analyze(), new_world(), old_world(), rewrite_annex(), rewrite_external(), mim::Rewriter::swap, mim::Phase::todo(), and VLOG.

Referenced by mim::ReplManPhase::start().

◆ world()


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