MimIR
0.4-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
inline
size_t
operator()
(
Use
use)
const
{
31
if
constexpr
(
sizeof
(size_t) == 8)
32
return
fe::hash((
u64
(use.
index
())) << 32_u64 |
u64
(use->
gid
()));
33
else
34
return
fe::hash_combine(fe::hash_begin(
u16
(use.
index
())), use->
gid
());
35
}
36
};
37
38
struct
UseEq
{
39
bool
operator()
(
Use
u1
,
Use
u2)
const
{
return
u1
== u2; }
40
};
41
42
using
Uses
= absl::flat_hash_set<Use, UseHash, UseEq>;
43
44
class
Scheduler
{
45
public
:
46
/// @name Construction
47
///@{
48
Scheduler
() =
default
;
49
explicit
Scheduler
(
const
Nest
&);
50
Scheduler
(
const
Scheduler
&) =
delete
;
51
Scheduler
(
Scheduler
&& other) noexcept
52
:
Scheduler
() {
53
swap
(*
this
, other);
54
}
55
Scheduler
&
operator=
(
Scheduler
other)
noexcept
{
return
swap
(*
this
, other), *
this
; }
56
///@}
57
58
/// @name Getters
59
///@{
60
World
&
world
() {
return
nest
().
world
(); }
61
const
Nest
&
nest
()
const
{
return
*nest_; }
62
Def
*
root
()
const
{
return
nest_->root()->mut(); }
63
const
Uses
&
uses
(
const
Def
* def)
const
{
64
if
(
auto
i = def2uses_.find(def); i != def2uses_.end())
return
i->second;
65
return
empty_;
66
}
67
///@}
68
69
/// @name Compute Schedules
70
///@{
71
const
Nest::Node
*
early
(
const
Def
*);
72
const
Nest::Node
*
late
(
Def
* curr,
const
Def
*);
73
const
Nest::Node
*
smart
(
Def
* curr,
const
Def
*);
74
///@}
75
76
/// @name Schedule Mutabales
77
/// Order of Mutables within a Scope.
78
///@{
79
using
Schedule
= fe::Vector<Def*>;
80
static
Schedule
schedule
(
const
Nest
&);
81
///@}
82
83
friend
void
swap
(
Scheduler
& s1,
Scheduler
& s2)
noexcept
{
84
using
std::swap;
85
swap
(s1.nest_, s2.nest_);
86
swap
(s1.early_, s2.early_);
87
swap
(s1.late_, s2.late_);
88
swap
(s1.smart_, s2.smart_);
89
swap
(s1.def2uses_, s2.def2uses_);
90
}
91
92
private
:
93
const
Nest
* nest_ =
nullptr
;
94
Uses
empty_;
95
DefMap<const Nest::Node*>
early_, late_, smart_;
96
DefMap<Uses>
def2uses_;
97
};
98
99
}
// namespace mim
mim::Def
Base class for all Defs.
Definition
def.h:273
mim::Def::gid
constexpr u32 gid() const noexcept
Global id - unique number for this Def.
Definition
def.h:294
mim::Nest::Node
Definition
nest.h:33
mim::Nest
Builds a nesting tree for all mutables/binders.
Definition
nest.h:31
mim::Nest::world
World & world() const
Definition
nest.h:223
mim::Scheduler::root
Def * root() const
Definition
schedule.h:62
mim::Scheduler::smart
const Nest::Node * smart(Def *curr, const Def *)
Definition
schedule.cpp:75
mim::Scheduler::Scheduler
Scheduler(Scheduler &&other) noexcept
Definition
schedule.h:51
mim::Scheduler::Scheduler
Scheduler(const Scheduler &)=delete
mim::Scheduler::Schedule
fe::Vector< Def * > Schedule
Definition
schedule.h:79
mim::Scheduler::operator=
Scheduler & operator=(Scheduler other) noexcept
Definition
schedule.h:55
mim::Scheduler::late
const Nest::Node * late(Def *curr, const Def *)
Definition
schedule.cpp:54
mim::Scheduler::uses
const Uses & uses(const Def *def) const
Definition
schedule.h:63
mim::Scheduler::schedule
static Schedule schedule(const Nest &)
Definition
schedule.cpp:121
mim::Scheduler::world
World & world()
Definition
schedule.h:60
mim::Scheduler::nest
const Nest & nest() const
Definition
schedule.h:61
mim::Scheduler::early
const Nest::Node * early(const Def *)
Definition
schedule.cpp:38
mim::Scheduler::swap
friend void swap(Scheduler &s1, Scheduler &s2) noexcept
Definition
schedule.h:83
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:40
mim
Definition
ast.h:16
mim::DefMap
GIDMap< const Def *, To > DefMap
Definition
def.h:88
mim::Uses
absl::flat_hash_set< Use, UseHash, UseEq > Uses
Definition
schedule.h:42
mim::u1
bool u1
Definition
types.h:30
mim::u64
uint64_t u64
Definition
types.h:27
mim::u16
uint16_t u16
Definition
types.h:27
nest.h
mim::UseEq
Definition
schedule.h:38
mim::UseEq::operator()
bool operator()(Use u1, Use u2) const
Definition
schedule.h:39
mim::UseHash
Definition
schedule.h:29
mim::UseHash::operator()
size_t operator()(Use use) const
Definition
schedule.h:30
include
mim
schedule.h
Generated by
1.18.0