MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
schedule.h
Go to the documentation of this file.
1#pragma once
2
3#include "mim/nest.h"
4
5namespace 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`.
9class Use {
10public:
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
24private:
25 const Def* def_;
26 size_t index_;
27};
28
29struct 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
37struct UseEq {
38 bool operator()(Use u1, Use u2) const { return u1 == u2; }
39};
40
41using Uses = ankerl::unordered_dense::set<Use, UseHash, UseEq>;
42
43class Scheduler {
44public:
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
91private:
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
Base class for all Defs.
Definition def.h:289
constexpr u32 gid() const noexcept
Global id - unique number for this Def.
Definition def.h:312
Builds a nesting tree for all mutables/binders.
Definition nest.h:25
World & world() const
Definition nest.h:194
Def * root() const
Definition schedule.h:61
const Nest::Node * smart(Def *curr, const Def *)
Definition schedule.cpp:76
Scheduler(Scheduler &&other) noexcept
Definition schedule.h:50
Scheduler(const Scheduler &)=delete
fe::Vector< Def * > Schedule
Definition schedule.h:78
Scheduler & operator=(Scheduler other) noexcept
Definition schedule.h:54
const Nest::Node * late(Def *curr, const Def *)
Definition schedule.cpp:55
const Uses & uses(const Def *def) const
Definition schedule.h:62
static Schedule schedule(const Nest &)
Definition schedule.cpp:103
World & world()
Definition schedule.h:59
const Nest & nest() const
Definition schedule.h:60
const Nest::Node * early(const Def *)
Definition schedule.cpp:39
friend void swap(Scheduler &s1, Scheduler &s2) noexcept
Definition schedule.h:82
Scheduler()=default
const Def*erences a user.
Definition schedule.h:9
Use(const Def *def, size_t index)
Definition schedule.h:14
size_t index() const
Definition schedule.h:18
static constexpr size_t Type
Definition schedule.h:11
const Def * operator->() const
Definition schedule.h:21
bool operator==(Use other) const
Definition schedule.h:22
const Def * def() const
Definition schedule.h:19
The World represents the whole program and manages creation of MimIR nodes (Defs).
Definition world.h:43
Definition ast.h:16
ankerl::unordered_dense::set< Use, UseHash, UseEq > Uses
Definition schedule.h:41
GIDMap< const Def *, To > DefMap
Definition def.h:93
bool u1
Definition types.h:30
uint64_t u64
Definition types.h:27
bool operator()(Use u1, Use u2) const
Definition schedule.h:38
size_t operator()(Use use) const
Definition schedule.h:32
void is_avalanching
Definition schedule.h:30