MimIR
0.5-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
Loading...
Searching...
No Matches
schedule.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
mim/nest.h
"
4
5
namespace
mim
{
6
7
/// const Def*erences a user.
8
/// A Def `u` which uses Def `d` as `i^th` operand is a Use with Use::index `i` of Def `d`.
9
class
Use
{
10
public
:
11
static
constexpr
size_t
Type
= -1uz;
12
13
Use
() {}
14
Use
(
const
Def
*
def
,
size_t
index
)
15
: def_(
def
)
16
, index_(
index
) {}
17
18
size_t
index
()
const
{
return
index_; }
19
const
Def
*
def
()
const
{
return
def_; }
20
operator
const
Def
*()
const
{
return
def_; }
21
const
Def
*
operator->
()
const
{
return
def_; }
22
bool
operator==
(
Use
other)
const
{
return
this->def_ == other.def_ && this->index_ == other.index_; }
23
24
private
:
25
const
Def
* def_;
26
size_t
index_;
27
};
28
29
struct
UseHash
{
30
using
is_avalanching
= void;
31
32
inline
size_t
operator()
(
Use
use)
const
{
33
return
fe::hash_combine(0,
u64
(use.
index
()) << 32_u64 |
u64
(use->
gid
()));
34
}
35
};
36
37
struct
UseEq
{
38
bool
operator()
(
Use
u1
,
Use
u2)
const
{
return
u1
== u2; }
39
};
40
41
using
Uses
= ankerl::unordered_dense::set<Use, UseHash, UseEq>;
42
43
class
Scheduler
{
44
public
:
45
/// @name Construction
46
///@{
47
Scheduler
() =
default
;
48
explicit
Scheduler
(
const
Nest
&);
49
Scheduler
(
const
Scheduler
&) =
delete
;
50
Scheduler
(
Scheduler
&& other) noexcept
51
:
Scheduler
() {
52
swap
(*
this
, other);
53
}
54
Scheduler
&
operator=
(
Scheduler
other)
noexcept
{
return
swap
(*
this
, other), *
this
; }
55
///@}
56
57
/// @name Getters
58
///@{
59
World
&
world
() {
return
nest
().
world
(); }
60
const
Nest
&
nest
()
const
{
return
*nest_; }
61
Def
*
root
()
const
{
return
nest_->root()->mut(); }
62
const
Uses
&
uses
(
const
Def
* def)
const
{
63
if
(
auto
uses
= fe::lookup(def2uses_, def))
return
*
uses
;
64
return
empty_;
65
}
66
///@}
67
68
/// @name Compute Schedules
69
///@{
70
const
Nest::Node
*
early
(
const
Def
*);
71
const
Nest::Node
*
late
(
Def
* curr,
const
Def
*);
72
const
Nest::Node
*
smart
(
Def
* curr,
const
Def
*);
73
///@}
74
75
/// @name Schedule Mutabales
76
/// Order of Mutables within a Scope.
77
///@{
78
using
Schedule
= fe::Vector<Def*>;
79
static
Schedule
schedule
(
const
Nest
&);
80
///@}
81
82
friend
void
swap
(
Scheduler
& s1,
Scheduler
& s2)
noexcept
{
83
using
std::swap;
84
swap
(s1.nest_, s2.nest_);
85
swap
(s1.early_, s2.early_);
86
swap
(s1.late_, s2.late_);
87
swap
(s1.smart_, s2.smart_);
88
swap
(s1.def2uses_, s2.def2uses_);
89
}
90
91
private
:
92
const
Nest
* nest_ =
nullptr
;
93
Uses
empty_;
94
DefMap<const Nest::Node*>
early_, late_, smart_;
95
DefMap<Uses>
def2uses_;
96
};
97
98
}
// namespace mim
mim::Def
Base class for all Defs.
Definition
def.h:289
mim::Def::gid
constexpr u32 gid() const noexcept
Global id - unique number for this Def.
Definition
def.h:312
mim::Nest::Node
Definition
nest.h:27
mim::Nest
Builds a nesting tree for all mutables/binders.
Definition
nest.h:25
mim::Nest::world
World & world() const
Definition
nest.h:194
mim::Scheduler::root
Def * root() const
Definition
schedule.h:61
mim::Scheduler::smart
const Nest::Node * smart(Def *curr, const Def *)
Definition
schedule.cpp:76
mim::Scheduler::Scheduler
Scheduler(Scheduler &&other) noexcept
Definition
schedule.h:50
mim::Scheduler::Scheduler
Scheduler(const Scheduler &)=delete
mim::Scheduler::Schedule
fe::Vector< Def * > Schedule
Definition
schedule.h:78
mim::Scheduler::operator=
Scheduler & operator=(Scheduler other) noexcept
Definition
schedule.h:54
mim::Scheduler::late
const Nest::Node * late(Def *curr, const Def *)
Definition
schedule.cpp:55
mim::Scheduler::uses
const Uses & uses(const Def *def) const
Definition
schedule.h:62
mim::Scheduler::schedule
static Schedule schedule(const Nest &)
Definition
schedule.cpp:103
mim::Scheduler::world
World & world()
Definition
schedule.h:59
mim::Scheduler::nest
const Nest & nest() const
Definition
schedule.h:60
mim::Scheduler::early
const Nest::Node * early(const Def *)
Definition
schedule.cpp:39
mim::Scheduler::swap
friend void swap(Scheduler &s1, Scheduler &s2) noexcept
Definition
schedule.h:82
mim::Scheduler::Scheduler
Scheduler()=default
mim::Use
const Def*erences a user.
Definition
schedule.h:9
mim::Use::Use
Use(const Def *def, size_t index)
Definition
schedule.h:14
mim::Use::index
size_t index() const
Definition
schedule.h:18
mim::Use::Type
static constexpr size_t Type
Definition
schedule.h:11
mim::Use::operator->
const Def * operator->() const
Definition
schedule.h:21
mim::Use::Use
Use()
Definition
schedule.h:13
mim::Use::operator==
bool operator==(Use other) const
Definition
schedule.h:22
mim::Use::def
const Def * def() const
Definition
schedule.h:19
mim::World
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition
world.h:43
mim
Definition
ast.h:16
mim::Uses
ankerl::unordered_dense::set< Use, UseHash, UseEq > Uses
Definition
schedule.h:41
mim::DefMap
GIDMap< const Def *, To > DefMap
Definition
def.h:93
mim::u1
bool u1
Definition
types.h:30
mim::u64
uint64_t u64
Definition
types.h:27
nest.h
mim::UseEq
Definition
schedule.h:37
mim::UseEq::operator()
bool operator()(Use u1, Use u2) const
Definition
schedule.h:38
mim::UseHash
Definition
schedule.h:29
mim::UseHash::operator()
size_t operator()(Use use) const
Definition
schedule.h:32
mim::UseHash::is_avalanching
void is_avalanching
Definition
schedule.h:30
include
mim
schedule.h
Generated by
1.18.0