mini-llvm 0.1.0
Loading...
Searching...
No Matches
Phi.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cstddef>
6#include <iterator>
7#include <list>
8#include <memory>
9#include <ranges>
10#include <string>
11#include <unordered_set>
12#include <utility>
13
17#include "mini-llvm/ir/Type.h"
18#include "mini-llvm/ir/Use.h"
19#include "mini-llvm/ir/Value.h"
22
23namespace mini_llvm::ir {
24
25class MINI_LLVM_EXPORT Phi final : public Instruction {
26 using IncomingList = std::list<std::pair<std::unique_ptr<Use<BasicBlock>>, std::unique_ptr<Use<Value>>>>;
27
28public:
35
39
41 ConstIncoming(const Incoming &incoming) : block(incoming.block), value(incoming.value) {}
42 };
43
45 public:
46 using iterator_category = std::iterator_traits<IncomingList::iterator>::iterator_category;
48 using difference_type = std::iterator_traits<IncomingList::iterator>::difference_type;
51
52 incoming_iterator() = default;
53
55 return ArrowProxy<Incoming>::make(*base_->first, *base_->second);
56 }
57
59 return Incoming(*base_->first, *base_->second);
60 }
61
63 ++base_;
64 return *this;
65 }
66
68 return incoming_iterator(base_++);
69 }
70
71 friend bool operator==(const incoming_iterator &lhs, const incoming_iterator &rhs) {
72 return lhs.base_ == rhs.base_;
73 }
74
75 friend bool operator!=(const incoming_iterator &lhs, const incoming_iterator &rhs) {
76 return lhs.base_ != rhs.base_;
77 }
78
79 private:
80 IncomingList::iterator base_;
81
82 explicit incoming_iterator(IncomingList::iterator base) : base_(base) {}
83
84 friend class Phi;
85 };
86
88 public:
89 using iterator_category = std::iterator_traits<IncomingList::const_iterator>::iterator_category;
91 using difference_type = std::iterator_traits<IncomingList::const_iterator>::difference_type;
94
96
98
100 return ArrowProxy<ConstIncoming>::make(*base_->first, *base_->second);
101 }
102
104 return ConstIncoming(*base_->first, *base_->second);
105 }
106
108 ++base_;
109 return *this;
110 }
111
115
116 friend bool operator==(const const_incoming_iterator &lhs, const const_incoming_iterator &rhs) {
117 return lhs.base_ == rhs.base_;
118 }
119
120 friend bool operator!=(const const_incoming_iterator &lhs, const const_incoming_iterator &rhs) {
121 return lhs.base_ != rhs.base_;
122 }
123
124 private:
125 IncomingList::const_iterator base_;
126
127 explicit const_incoming_iterator(IncomingList::const_iterator base) : base_(base) {}
128
129 friend class Phi;
130 };
131
132 explicit Phi(std::unique_ptr<Type> type) : type_(std::move(type)) {}
133
135 return incoming_iterator(incomings_.begin());
136 }
137
139 return incoming_iterator(incomings_.end());
140 }
141
143 return const_incoming_iterator(incomings_.begin());
144 }
145
147 return const_incoming_iterator(incomings_.end());
148 }
149
150 bool incoming_empty() const {
151 return incomings_.empty();
152 }
153
154 size_t incoming_size() const {
155 return incomings_.size();
156 }
157
160 void addIncoming(std::weak_ptr<BasicBlock> B, std::shared_ptr<Value> value);
162
163 std::unordered_set<const UseBase *> operands() const override;
164
165 void accept(InstructionVisitor &visitor) override {
166 visitor.visitPhi(*this);
167 }
168
169 void accept(InstructionVisitor &visitor) const override {
170 visitor.visitPhi(*this);
171 }
172
173 bool isWellFormed() const override;
174
175 std::unique_ptr<Type> type() const override {
176 return type_->clone();
177 }
178
179 std::string format() const override;
180 std::unique_ptr<Value> clone() const override;
181
182private:
183 std::unique_ptr<Type> type_;
184 IncomingList incomings_;
185};
186
187inline auto incomings(Phi &I) {
188 return std::ranges::subrange(I.incoming_begin(), I.incoming_end());
189}
190
191inline auto incomings(const Phi &I) {
192 return std::ranges::subrange(I.incoming_begin(), I.incoming_end());
193}
194
199MINI_LLVM_EXPORT std::unordered_set<BasicBlock *> incomingBlocks(const Phi &I);
200MINI_LLVM_EXPORT std::unordered_set<Value *> incomingValues(const Phi &I);
201
202} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition ArrowProxy.h:10
static constexpr ArrowProxy< T > make(Args &&...args)
Definition ArrowProxy.h:24
Definition BasicBlock.h:28
Definition InstructionVisitor.h:58
virtual void visitPhi(Phi &I)
Definition InstructionVisitor.h:97
Definition Instruction.h:22
friend class BasicBlock
Definition Instruction.h:56
const_incoming_iterator & operator++()
Definition Phi.h:107
ArrowProxy< ConstIncoming > operator->() const
Definition Phi.h:99
const_incoming_iterator(incoming_iterator i)
Definition Phi.h:97
ConstIncoming operator*() const
Definition Phi.h:103
std::iterator_traits< IncomingList::const_iterator >::difference_type difference_type
Definition Phi.h:91
std::iterator_traits< IncomingList::const_iterator >::iterator_category iterator_category
Definition Phi.h:89
const_incoming_iterator operator++(int)
Definition Phi.h:112
friend bool operator==(const const_incoming_iterator &lhs, const const_incoming_iterator &rhs)
Definition Phi.h:116
ConstIncoming value_type
Definition Phi.h:90
ArrowProxy< ConstIncoming > pointer
Definition Phi.h:92
friend class Phi
Definition Phi.h:129
ConstIncoming reference
Definition Phi.h:93
friend bool operator!=(const const_incoming_iterator &lhs, const const_incoming_iterator &rhs)
Definition Phi.h:120
std::iterator_traits< IncomingList::iterator >::difference_type difference_type
Definition Phi.h:48
incoming_iterator & operator++()
Definition Phi.h:62
std::iterator_traits< IncomingList::iterator >::iterator_category iterator_category
Definition Phi.h:46
friend bool operator!=(const incoming_iterator &lhs, const incoming_iterator &rhs)
Definition Phi.h:75
Incoming reference
Definition Phi.h:50
ArrowProxy< Incoming > pointer
Definition Phi.h:49
Incoming operator*() const
Definition Phi.h:58
friend bool operator==(const incoming_iterator &lhs, const incoming_iterator &rhs)
Definition Phi.h:71
incoming_iterator operator++(int)
Definition Phi.h:67
ArrowProxy< Incoming > operator->() const
Definition Phi.h:54
friend class Phi
Definition Phi.h:84
Incoming value_type
Definition Phi.h:47
Definition Phi.h:25
void addIncoming(std::weak_ptr< BasicBlock > B, std::shared_ptr< Value > value)
bool isWellFormed() const override
std::unordered_set< const UseBase * > operands() const override
size_t incoming_size() const
Definition Phi.h:154
incoming_iterator incoming_end()
Definition Phi.h:138
void accept(InstructionVisitor &visitor) override
Definition Phi.h:165
bool incoming_empty() const
Definition Phi.h:150
std::unique_ptr< Type > type() const override
Definition Phi.h:175
void accept(InstructionVisitor &visitor) const override
Definition Phi.h:169
const_incoming_iterator incoming_end() const
Definition Phi.h:146
std::unique_ptr< Value > clone() const override
void removeIncoming(const_incoming_iterator i)
const_incoming_iterator incoming_begin() const
Definition Phi.h:142
const_incoming_iterator findIncoming(const BasicBlock &B) const
Phi(std::unique_ptr< Type > type)
Definition Phi.h:132
incoming_iterator incoming_begin()
Definition Phi.h:134
std::string format() const override
incoming_iterator findIncoming(const BasicBlock &B)
Definition Use.h:44
Definition Argument.h:13
auto incomings(Phi &I)
Definition Phi.h:187
MINI_LLVM_EXPORT const Use< Value > & getIncomingValue(const Phi &I, const BasicBlock &B)
MINI_LLVM_EXPORT bool hasIncomingBlock(const Phi &I, const BasicBlock &B)
MINI_LLVM_EXPORT std::unordered_set< Value * > incomingValues(const Phi &I)
MINI_LLVM_EXPORT std::unordered_set< BasicBlock * > incomingBlocks(const Phi &I)
MINI_LLVM_EXPORT void removeIncomingBlock(Phi &I, const BasicBlock &B)
const Use< Value > & value
Definition Phi.h:38
const Use< BasicBlock > & block
Definition Phi.h:37
ConstIncoming(const Use< BasicBlock > &block, const Use< Value > &value)
Definition Phi.h:40
ConstIncoming(const Incoming &incoming)
Definition Phi.h:41
Definition Phi.h:29
Use< Value > & value
Definition Phi.h:31
Incoming(Use< BasicBlock > &block, Use< Value > &value)
Definition Phi.h:33
Use< BasicBlock > & block
Definition Phi.h:30