MimIR 0.1
MimIR is my Intermediate Representation
|
A dependent function type. More...
#include <mim/lam.h>
Public Member Functions | |
Get/Set implicit | |
bool | is_implicit () const |
Pi * | make_implicit () |
Pi * | make_explicit () |
dom | |
| |
Ref | dom () const |
codom | |
| |
Ref | codom () const |
Setters | |
| |
Pi * | set (Ref dom, Ref codom) |
Pi * | set_dom (Ref dom) |
Pi * | set_dom (Defs doms) |
Pi * | set_codom (Ref codom) |
Pi * | unset () |
Rebuild | |
Pi * | stub (Ref type) |
const Pi * | immutabilize () override |
Tries to make an immutable from a mutable. | |
Public Member Functions inherited from mim::Def | |
World & | world () const |
flags_t | flags () const |
u32 | gid () const |
hash_t | hash () const |
node_t | node () const |
std::string_view | node_name () const |
const Def * | type () const |
const Def * | unfold_type () const |
Yields the type of this Def and builds a new Type (UInc n) if necessary. | |
bool | is_term () const |
Yields true if this:T and T:(Type 0) . | |
Ref | arity () const |
std::optional< nat_t > | isa_lit_arity () const |
nat_t | as_lit_arity () const |
template<size_t N = std::dynamic_extent> | |
auto | ops () const |
const Def * | op (size_t i) const |
size_t | num_ops () const |
Def * | set (size_t i, const Def *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. | |
Def * | set_type (const Def *) |
void | unset_type () |
void | update () |
Resolves Infers of this Def's type. | |
bool | is_set () const |
Yields true if empty or the last op is set. | |
Defs | extended_ops () const |
const Def * | extended_op (size_t i) const |
size_t | num_extended_ops () const |
Defs | partial_ops () const |
const Def * | partial_op (size_t i) const |
size_t | num_partial_ops () const |
const Uses & | uses () const |
size_t | num_uses () const |
unsigned | dep () const |
bool | has_dep (Dep d) const |
bool | has_dep (unsigned u) const |
bool | dep_const () const |
nat_t | num_projs () const |
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 = -1_n, class F > | |
auto | projs (F f) const |
Splits this Def via Def::projections into an Array (if A == -1_n ) 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 = -1_n> | |
auto | projs () const |
auto | tprojs () const |
auto | projs (nat_t a) const |
nat_t | num_vars () |
nat_t | num_tvars () |
Ref | var (nat_t a, nat_t i) |
Ref | var (nat_t i) |
Ref | tvar (nat_t i) |
template<nat_t A = std::dynamic_extent, class F > | |
auto | vars (F f) |
template<class F > | |
auto | tvars (F f) |
template<nat_t A = std::dynamic_extent> | |
auto | vars () |
auto | tvars () |
template<class F > | |
auto | vars (nat_t a, F f) |
auto | vars (nat_t a) |
Ref | 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 |
Vars | local_vars () const |
Vars | free_vars () const |
Vars | free_vars () |
bool | is_open () const |
Has free_vars()? | |
bool | is_closed () const |
Has no free_vars()? | |
Muts | fv_consumers () |
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, Ref type) |
Def * | stub (Ref type) |
Ref | rebuild (World &w, Ref type, Defs ops) const |
Def::rebuilds this Def while using new_op as substitute for its i'th Def::op. | |
Ref | rebuild (Ref type, Defs ops) const |
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) |
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 |
Public Member Functions inherited from mim::Setters< Pi > | |
const Pi * | set (Loc l) const |
Pi * | set (Loc l) |
const Pi * | set (Sym s) const |
Pi * | set (Sym s) |
const Pi * | set (std::string s) const |
Pi * | set (std::string s) |
const Pi * | set (Loc l, Sym s) const |
Pi * | set (Loc l, Sym s) |
const Pi * | set (Loc l, std::string s) const |
Pi * | set (Loc l, std::string s) |
const Pi * | set (Dbg d) const |
Pi * | set (Dbg d) |
Static Public Member Functions | |
Continuations | |
Checks certain properties of this Pi regarding continuations. | |
static const Pi * | isa_cn (Ref d) |
Is this a continuation - i.e. is the Pi::codom mim::Bottom? | |
static const Pi * | isa_returning (Ref d) |
Is this a continuation (Pi::isa_cn) which has a Pi::ret_pi? | |
static const Pi * | isa_basicblock (Ref d) |
Is this a continuation (Pi::isa_cn) that is not Pi::isa_returning? | |
Static Public Attributes | |
static constexpr auto | Node = Node::Pi |
Protected Member Functions | |
Pi (const Def *type, const Def *dom, const Def *codom, bool implicit) | |
Constructor for an immutable Pi. | |
Pi (const Def *type, bool implicit) | |
Constructor for a *mut*able Pi. | |
Protected Member Functions inherited from mim::Def | |
Def (World *, node_t, const Def *type, Defs ops, flags_t flags) | |
Constructor for an immutable Def. | |
Def (node_t n, const Def *type, Defs ops, flags_t flags) | |
As above but World retrieved from type . | |
Def (node_t, 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 |
Private Member Functions | |
Ref | rebuild_ (World &, Ref, Defs) const override |
Pi * | stub_ (World &, Ref) override |
Friends | |
class | World |
Return Continuation | |
const Pi * | ret_pi () const |
Yields the last Pi::dom, if it Pi::isa_basicblock. | |
Ref | ret_dom () const |
Pi::domain of Pi::ret_pi. | |
static const Pi * | ret_pi (Ref d) |
Type Checking | |
void | check () override |
static Ref | infer (Ref dom, Ref codom) |
Additional Inherited Members | ||
Protected Attributes inherited from mim::Def | ||
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_ | |
u8 | trip_ | |
|
inlineprotected |
|
overridevirtual |
Reimplemented from mim::Def.
Definition at line 271 of file check.cpp.
References mim::Check::alpha(), codom(), dom(), mim::error(), infer(), mim::Def::loc(), mim::Def::set_type(), and mim::Def::type().
|
inline |
Definition at line 40 of file lam.h.
References mim::Def::op().
Referenced by mim::plug::autodiff::autodiff_type_fun_pi(), check(), mim::Lam::codom(), immutabilize(), infer(), isa_cn(), Pi(), set(), set_codom(), and mim::World::test().
|
inline |
Definition at line 32 of file lam.h.
References mim::Def::op().
Referenced by mim::World::app(), mim::plug::autodiff::AutoDiffEval::augment_lam(), mim::plug::autodiff::autodiff_type_fun_pi(), check(), mim::compose_cn(), mim::Lam::dom(), mim::World::iapp(), immutabilize(), infer(), mim::plug::direct::op_cps2ds_dep(), Pi(), mim::Lam::ret_dom(), ret_dom(), ret_pi(), set(), set_dom(), and mim::World::test().
|
overridevirtual |
Tries to make an immutable from a mutable.
This usually works if the mutable isn't recursive and its var isn't used.
Reimplemented from mim::Def.
Definition at line 161 of file def.cpp.
References codom(), mim::PooledSet< T >::contains(), dom(), mim::Def::free_vars(), mim::Def::has_var(), mim::World::pi(), mim::Def::var(), and mim::Def::world().
Definition at line 266 of file check.cpp.
References codom(), dom(), mim::Kind, mim::Def::unfold_type(), and mim::Def::world().
Referenced by check(), and mim::World::pi().
|
inline |
Definition at line 23 of file lam.h.
References mim::Def::flags().
Referenced by mim::World::iapp().
Is this a continuation (Pi::isa_cn) that is not Pi::isa_returning?
Definition at line 54 of file lam.h.
References isa_cn(), and ret_pi().
Referenced by mim::plug::autodiff::AutoDiffEval::augment_app(), mim::ll::Emitter::emit_epilogue(), mim::plug::clos::ClosLit::is_basicblock(), mim::Lam::isa_basicblock(), and ret_pi().
Is this a continuation - i.e. is the Pi::codom mim::Bottom?
Definition at line 50 of file lam.h.
References mim::Node::Bot, codom(), and mim::Def::node().
Referenced by mim::plug::clos::LowerTypedClosPrep::analyze(), mim::plug::autodiff::AutoDiffEval::augment_app(), mim::plug::autodiff::autodiff_type_fun_pi(), mim::plug::clos::ClosConvPrep::enter(), isa_basicblock(), mim::plug::clos::isa_clos_type(), mim::Lam::isa_cn(), isa_returning(), mim::plug::clos::BranchClosElim::rewrite(), and mim::plug::clos::ClosConvPrep::rewrite_callee().
Is this a continuation (Pi::isa_cn) which has a Pi::ret_pi?
Definition at line 52 of file lam.h.
References isa_cn(), and ret_pi().
Referenced by mim::compose_cn(), mim::ll::Emitter::emit_epilogue(), mim::plug::clos::ClosConvPrep::enter(), mim::plug::clos::ClosLit::is_returning(), and mim::Lam::isa_returning().
|
inline |
Definition at line 25 of file lam.h.
References mim::Def::flags_.
|
inline |
Definition at line 24 of file lam.h.
References mim::Def::flags_.
|
inline |
Pi::domain of Pi::ret_pi.
Definition at line 66 of file lam.h.
References dom(), and ret_pi().
Referenced by mim::compose_cn().
const Pi * mim::Pi::ret_pi | ( | ) | const |
Yields the last Pi::dom, if it Pi::isa_basicblock.
Definition at line 13 of file lam.cpp.
References dom(), and isa_basicblock().
Referenced by mim::ast::RetExpr::emit_(), isa_basicblock(), isa_returning(), and ret_dom().
Yields the Pi::ret_pi() of d
, if it is in fact a Pi.
Definition at line 62 of file lam.h.
References ret_pi().
Referenced by mim::ll::Emitter::emit_imported(), mim::Lam::ret_pi(), ret_pi(), and mim::Lam::ret_var().
Definition at line 76 of file lam.h.
References codom(), and mim::Def::set().
Referenced by mim::ast::PiExpr::emit_(), mim::ast::ArrowExpr::emit_body(), mim::ast::LamDecl::emit_decl(), and set().
Definition at line 22 of file lam.cpp.
References mim::Def::set(), and mim::Def::world().
Definition at line 74 of file lam.h.
References dom(), and mim::Def::set().
Referenced by mim::ast::ArrowExpr::emit_body(), mim::ast::PiExpr::Dom::emit_type(), and set().
Definition at line 88 of file lam.h.
References mim::Def::dbg(), set(), stub_(), mim::Def::type(), and mim::Def::world().
Referenced by mim::plug::mem::CopyProp::rewrite().
|
inline |
Definition at line 77 of file lam.h.
References mim::Def::unset().