Thorin 1.9.0
The Higher ORder INtermediate representation
Loading...
Searching...
No Matches
thorin::Infer Class Reference

This node is a hole in the IR that is inferred by its context later on. More...

#include <thorin/check.h>

Inheritance diagram for thorin::Infer:
[legend]

Public Member Functions

Inferstub (Ref type)
 
op
const Defop () const
 
Inferset (const Def *op)
 
Inferreset (const Def *op)
 
Inferunset ()
 
- Public Member Functions inherited from thorin::Def
Worldworld () const
 
flags_t flags () const
 
u32 gid () const
 
hash_t hash () const
 
node_t node () const
 
std::string_view node_name () const
 
const Deftype () const
 Yields the raw type of this Def, i.e. maybe nullptr.
 
const Defunfold_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_tisa_lit_arity () const
 
nat_t as_lit_arity () const
 
template<size_t N = std::dynamic_extent>
auto ops () const
 
const Defop (size_t i) const
 
size_t num_ops () const
 
Defset (size_t i, const Def *def)
 Successively set from left to right.
 
Defreset (size_t i, const Def *def)
 Successively reset from left to right.
 
Defset (Defs ops)
 Def::set ops all at once.
 
Defreset (Defs ops)
 Def::reset ops all at once.
 
Defunset ()
 Unsets all Def::ops; works even, if not set at all or partially.
 
Defset_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 Defextended_op (size_t i) const
 
size_t num_extended_ops () const
 
Defs partial_ops () const
 
const Defpartial_op (size_t i) const
 
size_t num_partial_ops () const
 
const Usesuses () 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
 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::scalerize_threshold is exceeded.
 
const Defproj (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 Defproj (nat_t i) const
 As above but takes Def::num_projs as arity.
 
const Deftproj (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 Varhas_var ()
 Only returns not nullptr, if Var of this mutable has ever been created.
 
const Varhas_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 constness 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 constness 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 Defset (Loc l) const
 
template<bool Ow = false>
Defset (Loc l)
 
template<bool Ow = false>
const Defset (Sym s) const
 
template<bool Ow = false>
Defset (Sym s)
 
template<bool Ow = false>
const Defset (std::string s) const
 
template<bool Ow = false>
Defset (std::string s)
 
template<bool Ow = false>
const Defset (Loc l, Sym s) const
 
template<bool Ow = false>
Defset (Loc l, Sym s)
 
template<bool Ow = false>
const Defset (Loc l, std::string s) const
 
template<bool Ow = false>
Defset (Loc l, std::string s)
 
template<bool Ow = false>
const Defset (Dbg d) const
 
template<bool Ow = false>
Defset (Dbg d)
 
const Defdebug_prefix (std::string) const
 
const Defdebug_suffix (std::string) const
 
Defstub (World &w, Ref type)
 
Defstub (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
 
virtual const Defimmutabilize ()
 Tries to make an immutable from a mutable.
 
const Defrefine (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)
 
virtual void check ()
 
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
 

Static Public Member Functions

static bool eliminate (Vector< Ref * >)
 Eliminate Infers that may have been resolved in the meantime by rebuilding.
 
static bool should_eliminate (Ref def)
 
static const Deffind (const Def *)
 Union-Find to unify Infer nodes.
 

Private Member Functions

Inferstub_ (World &, Ref) override
 

Additional Inherited Members

- Protected Member Functions inherited from thorin::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
 
- Protected Attributes inherited from thorin::Def
Dbg dbg_
 
union { 
 
NormalizeFn normalizer_
 Axiom only: Axioms use this member to store their normalizer.
 
const Axiomaxiom_
 App only: Curried Apps of Axioms use this member to propagate the Axiom.
 
const Varvar_
 Mutable only: Var of a mutable.
 
Worldworld_
 
};  
 
flags_t flags_
 
u8 curry_
 
u8 trip_
 

Detailed Description

This node is a hole in the IR that is inferred by its context later on.

It is modelled as a *mut*able Def. If inference was successful, it's Infer::op will be set to the inferred Def.

Definition at line 12 of file check.h.

Member Function Documentation

◆ eliminate()

bool thorin::Infer::eliminate ( Vector< Ref * >  refs)
static

Eliminate Infers that may have been resolved in the meantime by rebuilding.

Returns
true, if one of the arguements was in fact updated.

Definition at line 62 of file check.cpp.

References thorin::Infer, should_eliminate(), and thorin::Def::world().

Referenced by thorin::World::app().

◆ find()

const Def * thorin::Infer::find ( const Def def)
static

Union-Find to unify Infer nodes.

Def::flags is used to keep track of rank for Union by rank.

Definition at line 29 of file check.cpp.

References thorin::Def::isa_mut(), op(), thorin::Def::op(), thorin::Ref::refer(), thorin::Def::reset(), and thorin::Def::update().

Referenced by thorin::Ref::refer().

◆ op()

const Def * thorin::Infer::op ( ) const
inline

Definition at line 20 of file check.h.

References thorin::Def::op().

Referenced by find(), reset(), and set().

◆ reset()

Infer * thorin::Infer::reset ( const Def op)
inline

Definition at line 22 of file check.h.

References op(), and thorin::Def::reset().

◆ set()

Infer * thorin::Infer::set ( const Def op)
inline

Definition at line 21 of file check.h.

References op(), and thorin::Def::set().

Referenced by stub(), and thorin::IdPtrn::type().

◆ should_eliminate()

static bool thorin::Infer::should_eliminate ( Ref  def)
inlinestatic

Definition at line 29 of file check.h.

References thorin::Def::has_dep(), thorin::Infer, and thorin::Def::isa_imm().

Referenced by eliminate().

◆ stub()

Infer * thorin::Infer::stub ( Ref  type)
inline

Definition at line 36 of file check.h.

References thorin::Def::dbg(), set(), stub_(), thorin::Def::type(), and thorin::Def::world().

◆ stub_()

Infer * thorin::Infer::stub_ ( World w,
Ref  t 
)
overrideprivatevirtual

Reimplemented from thorin::Def.

Definition at line 138 of file def.cpp.

Referenced by stub().

◆ unset()

Infer * thorin::Infer::unset ( )
inline

Definition at line 23 of file check.h.

References thorin::Def::unset().


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