mini-llvm 0.1.0
Loading...
Searching...
No Matches
CondBr.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <memory>
6#include <string>
7#include <unordered_set>
8#include <utility>
9
13#include "mini-llvm/ir/Type.h"
15#include "mini-llvm/ir/Use.h"
16#include "mini-llvm/ir/Value.h"
18
19namespace mini_llvm::ir {
20
21class MINI_LLVM_EXPORT CondBr final : public Terminator {
22public:
23 CondBr(std::shared_ptr<Value> cond, std::weak_ptr<BasicBlock> trueDest, std::weak_ptr<BasicBlock> falseDest)
24 : cond_(this, std::move(cond)), trueDest_(this, std::move(trueDest)), falseDest_(this, std::move(falseDest)) {}
25
26 template <typename Self>
27 auto &cond(this Self &&self) {
28 return self.cond_;
29 }
30
31 template <typename Self>
32 auto &trueDest(this Self &&self) {
33 return self.trueDest_;
34 }
35
36 template <typename Self>
37 auto &falseDest(this Self &&self) {
38 return self.falseDest_;
39 }
40
41 std::unordered_set<BasicBlock *> successors() const override {
42 return {&*trueDest(), &*falseDest()};
43 }
44
45 std::unordered_set<const UseBase *> operands() const override {
46 return {&cond(), &trueDest(), &falseDest()};
47 }
48
49 void accept(InstructionVisitor &visitor) override {
50 visitor.visitCondBr(*this);
51 }
52
53 void accept(InstructionVisitor &visitor) const override {
54 visitor.visitCondBr(*this);
55 }
56
57 bool isWellFormed() const override;
58
59 std::unique_ptr<Type> type() const override {
60 return std::make_unique<Void>();
61 }
62
63 std::string format() const override;
64 std::unique_ptr<Value> clone() const override;
65
66private:
67 Use<Value> cond_;
68 Use<BasicBlock> trueDest_, falseDest_;
69};
70
71} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
auto & trueDest(this Self &&self)
Definition CondBr.h:32
void accept(InstructionVisitor &visitor) override
Definition CondBr.h:49
CondBr(std::shared_ptr< Value > cond, std::weak_ptr< BasicBlock > trueDest, std::weak_ptr< BasicBlock > falseDest)
Definition CondBr.h:23
std::unique_ptr< Type > type() const override
Definition CondBr.h:59
auto & cond(this Self &&self)
Definition CondBr.h:27
void accept(InstructionVisitor &visitor) const override
Definition CondBr.h:53
auto & falseDest(this Self &&self)
Definition CondBr.h:37
bool isWellFormed() const override
std::unordered_set< BasicBlock * > successors() const override
Definition CondBr.h:41
std::unique_ptr< Value > clone() const override
std::string format() const override
std::unordered_set< const UseBase * > operands() const override
Definition CondBr.h:45
Definition InstructionVisitor.h:58
virtual void visitCondBr(CondBr &I)
Definition InstructionVisitor.h:77
Definition Terminator.h:13
Definition Use.h:44
Definition Argument.h:13