MimIR 0.1
MimIR is my Intermediate Representation
|
A function. More...
#include <mim/lam.h>
Public Types | |
using | Filter = std::variant<bool, const Def*> |
Public Member Functions | |
Lam * | stub (const Def *type) |
ops | |
const Def * | filter () const |
const Def * | body () const |
type | |
| |
const Pi * | type () const |
const Def * | dom () const |
const Def * | codom () const |
Return Continuation | |
| |
const Pi * | ret_pi () const |
const Def * | ret_dom () const |
const Def * | ret_var () |
Yields the Lam::var of the Lam::ret_pi. | |
Setters | |
Lam::Filter is a lam1->app(true, f, arg);
lam2->app(my_filter_def, f, arg);
| |
Lam * | set (Filter filter, const Def *body) |
Lam * | set_filter (Filter) |
Set filter first. | |
Lam * | set_body (const Def *body) |
Set body second. | |
Lam * | app (Filter filter, const Def *callee, const Def *arg) |
Set body to an App of callee and arg . | |
Lam * | app (Filter filter, const Def *callee, Defs args) |
Set body to an App of callee and args . | |
Lam * | branch (Filter filter, const Def *cond, const Def *t, const Def *f, const Def *mem=nullptr) |
Set body to an App of (f, t)#cond mem or (f, t)#cond () if mem is nullptr . | |
Lam * | test (Filter filter, const Def *val, const Def *idx, const Def *match, const Def *clash, const Def *mem) |
Lam * | set (Defs ops) |
Lam * | unset () |
Type Checking | |
const Def * | check (size_t, const Def *) override |
![]() | |
World & | world () const noexcept |
constexpr flags_t | flags () const noexcept |
constexpr u32 | gid () const noexcept |
Global id - unique number for this Def. | |
constexpr u32 | tid () const noexcept |
Trie id - only used in Trie. | |
constexpr u32 | mark () const noexcept |
Used internally by free_vars(). | |
constexpr size_t | hash () const noexcept |
constexpr Node | node () const noexcept |
std::string_view | node_name () const |
u32 | judge () const noexcept |
bool | is_form () const noexcept |
bool | is_intro () const noexcept |
bool | is_elim () const noexcept |
bool | is_meta () const noexcept |
const Def * | type () const noexcept |
Yields the "raw" type of this Def (maybe nullptr ). | |
const Def * | unfold_type () const |
Yields the type of this Def and builds a new Type (UInc n) if necessary. | |
bool | is_term () const |
const Def * | arity () const |
std::optional< nat_t > | isa_lit_arity () const |
nat_t | as_lit_arity () const |
template<size_t N = std::dynamic_extent> | |
constexpr auto | ops () const noexcept |
const Def * | op (size_t i) const noexcept |
constexpr size_t | num_ops () const noexcept |
Def * | set (size_t i, const Def *) |
Successively set from left to right. | |
Def * | reset (size_t i, const Def *def) |
Successively reset from left to right. | |
Def * | set (Defs ops) |
Def::set ops all at once. | |
Def * | reset (Defs ops) |
Def::reset ops all at once. | |
Def * | unset () |
Unsets all Def::ops; works even, if not set at all or partially. | |
bool | is_set () const |
Yields true if empty or the last op is set. | |
Defs | deps () const noexcept |
const Def * | dep (size_t i) const noexcept |
size_t | num_deps () const noexcept |
bool | has_dep () const |
bool | has_dep (Dep d) const |
bool | has_dep (unsigned u) const |
nat_t | num_projs () const |
Yields Def::as_lit_arity(), if it is in fact a Lit, or 1 otherwise. | |
nat_t | num_tprojs () const |
As above but yields 1, if Flags::scalarize_threshold is exceeded. | |
const Def * | proj (nat_t a, nat_t i) const |
Similar to World::extract while assuming an arity of a , but also works on Sigmas and Arrays. | |
const Def * | proj (nat_t i) const |
As above but takes Def::num_projs as arity. | |
const Def * | tproj (nat_t i) const |
As above but takes Def::num_tprojs. | |
template<nat_t A = std::dynamic_extent, class F> | |
auto | projs (F f) const |
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent ) or std::array (otherwise). | |
template<class F> | |
auto | tprojs (F f) const |
template<class F> | |
auto | projs (nat_t a, F f) const |
template<nat_t A = std::dynamic_extent> | |
auto | projs () const |
auto | tprojs () const |
auto | projs (nat_t a) const |
nat_t | num_vars () noexcept |
nat_t | num_tvars () noexcept |
const Def * | var (nat_t a, nat_t i) noexcept |
const Def * | var (nat_t i) noexcept |
const Def * | tvar (nat_t i) noexcept |
template<nat_t A = std::dynamic_extent, class F> | |
auto | vars (F f) noexcept |
template<class F> | |
auto | tvars (F f) noexcept |
template<nat_t A = std::dynamic_extent> | |
auto | vars () noexcept |
auto | tvars () noexcept |
template<class F> | |
auto | vars (nat_t a, F f) noexcept |
auto | vars (nat_t a) noexcept |
const Def * | var () |
Not necessarily a Var: E.g., if the return type is [] , this will yield () . | |
const Var * | has_var () |
Only returns not nullptr , if Var of this mutable has ever been created. | |
const Var * | has_var () const |
As above if this is a mutable. | |
Muts | local_muts () const |
Mutables reachable by following immutable deps(); mut->local_muts() is by definition the set { mut } . | |
Vars | local_vars () const |
Vars reachable by following immutable deps(). | |
Vars | free_vars () const |
Compute a global solution by transitively following mutables as well. | |
Vars | free_vars () |
Muts | users () |
Set of mutables where this mutable is locally referenced. | |
bool | is_open () const |
Has free_vars()? | |
bool | is_closed () const |
Has no free_vars()? | |
bool | is_external () const |
void | make_external () |
void | make_internal () |
void | transfer_external (Def *to) |
template<class T = Def> | |
const T * | isa_imm () const |
template<class T = Def> | |
const T * | as_imm () const |
template<class T = Def, class R> | |
const T * | isa_imm (R(T::*f)() const) const |
template<class T = Def, bool invert = false> | |
T * | isa_mut () const |
If this is *mut*able, it will cast const ness away and perform a dynamic_cast to T . | |
template<class T = Def, bool invert = false> | |
T * | as_mut () const |
Asserts that this is a mutable, casts const ness away and performs a static_cast to T . | |
Dbg | dbg () const |
Loc | loc () const |
Sym | sym () const |
std::string | unique_name () const |
name + "_" + Def::gid | |
template<bool Ow = false> | |
const Def * | set (Loc l) const |
template<bool Ow = false> | |
Def * | set (Loc l) |
template<bool Ow = false> | |
const Def * | set (Sym s) const |
template<bool Ow = false> | |
Def * | set (Sym s) |
template<bool Ow = false> | |
const Def * | set (std::string s) const |
template<bool Ow = false> | |
Def * | set (std::string s) |
template<bool Ow = false> | |
const Def * | set (Loc l, Sym s) const |
template<bool Ow = false> | |
Def * | set (Loc l, Sym s) |
template<bool Ow = false> | |
const Def * | set (Loc l, std::string s) const |
template<bool Ow = false> | |
Def * | set (Loc l, std::string s) |
template<bool Ow = false> | |
const Def * | set (Dbg d) const |
template<bool Ow = false> | |
Def * | set (Dbg d) |
const Def * | debug_prefix (std::string) const |
const Def * | debug_suffix (std::string) const |
Def * | stub (World &w, const Def *type) |
Def * | stub (const Def *type) |
const Def * | rebuild (World &w, const Def *type, Defs ops) const |
Def::rebuilds this Def while using new_op as substitute for its i'th Def::op. | |
const Def * | rebuild (const Def *type, Defs ops) const |
virtual const Def * | immutabilize () |
Tries to make an immutable from a mutable. | |
bool | is_immutabilizable () |
const Def * | refine (size_t i, const Def *new_op) const |
DefVec | reduce (const Def *arg) const |
Rewrites Def::ops by substituting this mutable's Var with arg . | |
DefVec | reduce (const Def *arg) |
const Def * | reduce (size_t i, const Def *arg) const |
As above but only rewrites this->op(i) . | |
virtual const Def * | check () |
const Def * | zonk () const |
void | dump () const |
void | dump (int max) const |
void | write (int max) const |
void | write (int max, const char *file) const |
std::ostream & | stream (std::ostream &, int max) const |
void | dot (std::ostream &os, uint32_t max=0xFFFFFF, bool types=false) const |
void | dot (const char *file=nullptr, uint32_t max=0xFFFFFF, bool types=false) const |
Same as above but write to file or std::cout if file is nullptr . | |
void | dot (const std::string &file, uint32_t max=0xFFFFFF, bool types=false) const |
![]() | |
const Lam * | set (Loc l) const |
Lam * | set (Loc l) |
const Lam * | set (Sym s) const |
Lam * | set (Sym s) |
const Lam * | set (std::string s) const |
Lam * | set (std::string s) |
const Lam * | set (Loc l, Sym s) const |
Lam * | set (Loc l, Sym s) |
const Lam * | set (Loc l, std::string s) const |
Lam * | set (Loc l, std::string s) |
const Lam * | set (Dbg d) const |
Lam * | set (Dbg d) |
Static Public Member Functions | |
Continuations | |
| |
static const Lam * | isa_cn (const Def *d) |
static const Lam * | isa_basicblock (const Def *d) |
static const Lam * | isa_returning (const Def *d) |
static Lam * | isa_mut_cn (const Def *d) |
Only for mutables. | |
static Lam * | isa_mut_basicblock (const Def *d) |
Only for mutables. | |
static Lam * | isa_mut_returning (const Def *d) |
Only for mutables. | |
Static Public Attributes | |
static constexpr auto | Node = mim::Node::Lam |
Private Member Functions | |
const Def * | rebuild_ (World &, const Def *, Defs) const override |
Lam * | stub_ (World &, const Def *) override |
Friends | |
class | World |
Additional Inherited Members | ||
![]() | ||
Def (World *, Node, const Def *type, Defs ops, flags_t flags) | ||
Constructor for an immutable Def. | ||
Def (Node, const Def *type, Defs ops, flags_t flags) | ||
As above but World retrieved from type . | ||
Def (Node, const Def *type, size_t num_ops, flags_t flags) | ||
Constructor for a mutable Def. | ||
virtual | ~Def ()=default | |
Sym | sym (const char *) const | |
Sym | sym (std::string_view) const | |
Sym | sym (std::string) const | |
![]() | ||
Dbg | dbg_ | |
union { | ||
NormalizeFn | normalizer_ | |
Axiom only: Axioms use this member to store their normalizer. | ||
const Axiom * | axiom_ | |
App only: Curried Apps of Axioms use this member to propagate the Axiom. | ||
const Var * | var_ | |
Mutable only: Var of a mutable. | ||
World * | world_ | |
}; | ||
flags_t | flags_ | |
u8 | curry_ = 0 | |
u8 | trip_ = 0 | |
using mim::Lam::Filter = std::variant<bool, const Def*> |
Set body to an App of callee
and arg
.
Definition at line 29 of file lam.cpp.
References app(), set_body(), set_filter(), and mim::Def::world().
Referenced by app(), app(), branch(), mim::RetWrap::enter(), and test().
|
inline |
Definition at line 118 of file lam.h.
References mim::Def::op().
Referenced by mim::plug::autodiff::AutoDiffEval::augment_lam(), check(), mim::ll::Emitter::emit_epilogue(), mim::plug::clos::Clos2SJLJ::enter(), mim::plug::clos::ClosConvPrep::enter(), set(), and set_body().
Reimplemented from mim::Def.
Definition at line 306 of file check.cpp.
References mim::Checker::assignable(), body(), codom(), mim::Error::error(), filter(), mim::Def::loc(), mim::Error::note(), mim::Def::type(), type(), and mim::Def::world().
|
inline |
Definition at line 127 of file lam.h.
References mim::Pi::codom(), and type().
Referenced by check().
|
inline |
Definition at line 126 of file lam.h.
References mim::Pi::dom(), and type().
|
inline |
Definition at line 117 of file lam.h.
References mim::Def::op().
Referenced by app(), mim::plug::autodiff::AutoDiffEval::augment_lam(), branch(), check(), mim::plug::clos::Clos2SJLJ::enter(), set(), set_filter(), and test().
Definition at line 137 of file lam.h.
References mim::Pi::isa_basicblock().
Referenced by mim::plug::mem::SSAConstr::analyze(), mim::plug::autodiff::AutoDiffEval::augment_lam(), isa_mut_basicblock(), and mim::Emitter< std::string, std::string, BB, Emitter >::visit().
Definition at line 136 of file lam.h.
References isa_cn(), and mim::Pi::isa_cn().
Referenced by isa_cn(), and isa_mut_cn().
Only for mutables.
Definition at line 140 of file lam.h.
References isa_basicblock().
Referenced by mim::ll::Emitter::emit_epilogue(), mim::plug::clos::ClosConvPrep::enter(), and mim::plug::clos::ClosConvPrep::rewrite_arg().
Definition at line 138 of file lam.h.
References mim::Pi::isa_returning().
Referenced by isa_mut_returning(), and mim::plug::mem::CopyProp::rewrite().
|
inline |
Definition at line 149 of file lam.h.
References mim::Pi::dom(), and ret_pi().
|
inline |
Definition at line 148 of file lam.h.
References mim::Pi::ret_pi(), and type().
Referenced by ret_dom().
|
inline |
Yields the Lam::var of the Lam::ret_pi.
Definition at line 151 of file lam.h.
References mim::Def::num_vars(), mim::Pi::ret_pi(), type(), and mim::Def::var().
Referenced by mim::RetWrap::enter(), and mim::plug::clos::ClosLit::ret_var().
Definition at line 174 of file lam.h.
References mim::Def::ops(), and mim::Def::set().
Definition at line 164 of file lam.h.
References body(), filter(), set_body(), and set_filter().
Referenced by mim::plug::autodiff::AutoDiffEval::augment_app(), mim::plug::autodiff::AutoDiffEval::augment_extract(), mim::plug::autodiff::AutoDiffEval::augment_pack(), mim::plug::autodiff::AutoDiffEval::augment_tuple(), mim::plug::autodiff::AutoDiffEval::derive_(), mim::plug::clos::Clos2SJLJ::enter(), mim::RetWrap::enter(), mim::plug::affine::LowerFor::rewrite(), mim::plug::matrix::LowerMatrixMediumLevel::rewrite_(), and stub().
Set filter first.
Definition at line 28 of file lam.cpp.
References filter(), mim::Def::set(), and mim::Def::world().
Definition at line 178 of file lam.h.
References mim::Def::dbg(), set(), stub_(), type(), and mim::Def::world().
Lam * mim::Lam::test | ( | Filter | filter, |
const Def * | val, | ||
const Def * | idx, | ||
const Def * | match, | ||
const Def * | clash, | ||
const Def * | mem ) |
Definition at line 36 of file lam.cpp.
References app(), filter(), mim::match(), test(), and mim::Def::world().
Referenced by test().
|
inline |
Definition at line 125 of file lam.h.
References mim::Def::type().
Referenced by mim::plug::autodiff::AutoDiffEval::augment_lam(), check(), codom(), mim::plug::autodiff::AutoDiffEval::derive_(), dom(), mim::ll::Emitter::emit_imported(), mim::EtaExp::proxy(), ret_pi(), ret_var(), and stub().
|
inline |
Definition at line 175 of file lam.h.
References mim::Def::unset().
|
friend |
|
staticconstexpr |