mini-llvm 0.1.0
Loading...
Searching...
No Matches
Instruction.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <concepts>
6#include <format>
7#include <memory>
8#include <string>
9#include <unordered_set>
10
18
19namespace mini_llvm::mir {
20
22public:
23 virtual ~Instruction() = default;
24
25 Instruction() = default;
26
27 Instruction(const Instruction &) = delete;
28 Instruction &operator=(const Instruction &) = delete;
29
32
33 virtual std::unordered_set<const RegisterOperand *> regOps() const = 0;
34 virtual std::unordered_set<const RegisterOperand *> dsts() const = 0;
35 virtual std::unordered_set<const RegisterOperand *> srcs() const = 0;
36 std::unordered_set<RegisterOperand *> regOps();
37 std::unordered_set<RegisterOperand *> dsts();
38 std::unordered_set<RegisterOperand *> srcs();
39 virtual std::unordered_set<PhysicalRegister *> implicitDsts() const { return {}; }
40 virtual std::unordered_set<PhysicalRegister *> implicitSrcs() const { return {}; }
41 virtual std::unordered_set<const ImmediateOperand *> immOps() const = 0;
42 std::unordered_set<ImmediateOperand *> immOps();
43 virtual std::unordered_set<const MemoryOperand *> memOps() const = 0;
44 std::unordered_set<MemoryOperand *> memOps();
45 virtual bool isCoalescent() const { return false; }
46 virtual Register *coalescenceDst() const { return nullptr; }
47 virtual Register *coalescenceSrc() const { return nullptr; }
48 virtual bool hasSideEffects() const = 0;
49 virtual std::string format() const = 0;
50 virtual std::unique_ptr<Instruction> clone() const = 0;
51 virtual void accept(InstructionVisitor &visitor) = 0;
52 virtual void accept(InstructionVisitor &visitor) const = 0;
53};
54
55MINI_LLVM_EXPORT std::unordered_set<Register *> use(const Instruction &I);
56MINI_LLVM_EXPORT std::unordered_set<Register *> def(const Instruction &I);
57
58} // namespace mini_llvm::mir
59
60template <typename InstructionT>
61 requires std::derived_from<InstructionT, mini_llvm::mir::Instruction>
62struct std::formatter<InstructionT> {
63 constexpr auto parse(std::format_parse_context &ctx) {
64 return ctx.begin();
65 }
66
67 template <typename FormatContext>
68 auto format(const InstructionT &I, FormatContext &ctx) const {
69 return std::format_to(ctx.out(), "{}", I.format());
70 }
71};
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition InstructionVisitor.h:70
Definition Instruction.h:21
std::unordered_set< MemoryOperand * > memOps()
virtual std::unordered_set< const RegisterOperand * > regOps() const =0
Instruction & operator=(Instruction &&)=delete
virtual Register * coalescenceDst() const
Definition Instruction.h:46
virtual bool hasSideEffects() const =0
Instruction(const Instruction &)=delete
std::unordered_set< RegisterOperand * > srcs()
virtual bool isCoalescent() const
Definition Instruction.h:45
virtual std::unordered_set< const ImmediateOperand * > immOps() const =0
Instruction & operator=(const Instruction &)=delete
virtual std::unique_ptr< Instruction > clone() const =0
virtual ~Instruction()=default
virtual Register * coalescenceSrc() const
Definition Instruction.h:47
virtual std::unordered_set< const RegisterOperand * > srcs() const =0
virtual std::unordered_set< PhysicalRegister * > implicitDsts() const
Definition Instruction.h:39
virtual std::unordered_set< const RegisterOperand * > dsts() const =0
Instruction(Instruction &&)=delete
virtual std::unordered_set< PhysicalRegister * > implicitSrcs() const
Definition Instruction.h:40
virtual std::unordered_set< const MemoryOperand * > memOps() const =0
std::unordered_set< ImmediateOperand * > immOps()
virtual void accept(InstructionVisitor &visitor) const =0
std::unordered_set< RegisterOperand * > dsts()
virtual std::string format() const =0
std::unordered_set< RegisterOperand * > regOps()
virtual void accept(InstructionVisitor &visitor)=0
Definition Register.h:14
Definition BasicBlock.h:22
std::unordered_set< Register * > def(const BasicBlock &B)
std::unordered_set< Register * > use(const BasicBlock &B)
constexpr auto parse(std::format_parse_context &ctx)
Definition Instruction.h:63
auto format(const InstructionT &I, FormatContext &ctx) const
Definition Instruction.h:68