11#include <unordered_set>
26 using IncomingList = std::list<std::pair<std::unique_ptr<Use<BasicBlock>>, std::unique_ptr<Use<Value>>>>;
48 using difference_type = std::iterator_traits<IncomingList::iterator>::difference_type;
59 return Incoming(*base_->first, *base_->second);
72 return lhs.base_ == rhs.base_;
76 return lhs.base_ != rhs.base_;
80 IncomingList::iterator base_;
89 using iterator_category = std::iterator_traits<IncomingList::const_iterator>::iterator_category;
91 using difference_type = std::iterator_traits<IncomingList::const_iterator>::difference_type;
117 return lhs.base_ == rhs.base_;
121 return lhs.base_ != rhs.base_;
125 IncomingList::const_iterator base_;
132 explicit Phi(std::unique_ptr<Type>
type) : type_(std::move(
type)) {}
151 return incomings_.empty();
155 return incomings_.size();
160 void addIncoming(std::weak_ptr<BasicBlock> B, std::shared_ptr<Value> value);
163 std::unordered_set<const UseBase *>
operands()
const override;
175 std::unique_ptr<Type>
type()
const override {
176 return type_->clone();
180 std::unique_ptr<Value>
clone()
const override;
183 std::unique_ptr<Type> type_;
184 IncomingList incomings_;
#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
const_incoming_iterator()=default
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
incoming_iterator()=default
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)
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
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