diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 00:38:20 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 00:38:20 +0800 |
| commit | f6fdfb8d484b4e52cdb24a94a31b0f00d41a5eb7 (patch) | |
| tree | 9362d0230db6174acdbe095288f4bbb1c4a896a9 /backend/include/rcc/CodeGen/MachineIRBuilder.h | |
| parent | 7e2660ad5b7ec5b74cafed27f674939691f9e0fc (diff) | |
| download | rcc-project-f6fdfb8d484b4e52cdb24a94a31b0f00d41a5eb7.tar.gz rcc-project-f6fdfb8d484b4e52cdb24a94a31b0f00d41a5eb7.tar.xz | |
[GlobalISel] Match LLVM CSE builder result semantics
Diffstat (limited to 'backend/include/rcc/CodeGen/MachineIRBuilder.h')
| -rw-r--r-- | backend/include/rcc/CodeGen/MachineIRBuilder.h | 146 |
1 files changed, 104 insertions, 42 deletions
diff --git a/backend/include/rcc/CodeGen/MachineIRBuilder.h b/backend/include/rcc/CodeGen/MachineIRBuilder.h index e830837..f87adfe 100644 --- a/backend/include/rcc/CodeGen/MachineIRBuilder.h +++ b/backend/include/rcc/CodeGen/MachineIRBuilder.h @@ -14,6 +14,7 @@ #include <initializer_list> #include <memory> #include <optional> +#include <span> #include <string> #include <utility> #include <vector> @@ -24,7 +25,9 @@ class MachineBasicBlock; class MachineFunction; class MachineInstr; class MachineMemOperand; +class MachineRegisterInfo; class RegisterMask; +class GISelCSEInfo; class MachineInstrBuilder final { public: @@ -143,7 +146,32 @@ private: friend class MachineIRBuilder; }; -class MachineIRBuilder final { +class MachineIRBuilderResult final { +public: + enum class Kind : std::uint8_t { + Register, + Type, + }; + + MachineIRBuilderResult(Register Reg) noexcept : Reg(Reg), ResultKind(Kind::Register) {} + MachineIRBuilderResult(LowLevelType Type) noexcept : Type(Type), ResultKind(Kind::Type) {} + + [[nodiscard]] Kind kind() const noexcept { + return ResultKind; + } + + [[nodiscard]] Register reg() const noexcept; + [[nodiscard]] LowLevelType type() const noexcept; + [[nodiscard]] Expected<LowLevelType> type(const MachineRegisterInfo &MRI) const; + [[nodiscard]] Expected<void> addDef(MachineRegisterInfo &MRI, MachineInstrBuilder &Builder) const; + +private: + Register Reg; + LowLevelType Type; + Kind ResultKind; +}; + +class MachineIRBuilder { public: MachineIRBuilder(MachineFunction &Function, const TargetDescription &Target) noexcept : Function(&Function), Target(&Target) {} @@ -151,12 +179,13 @@ public: MachineIRBuilder &operator=(const MachineIRBuilder &) = delete; MachineIRBuilder(MachineIRBuilder &&) = delete; MachineIRBuilder &operator=(MachineIRBuilder &&) = delete; + virtual ~MachineIRBuilder() = default; [[nodiscard]] MachineFunction &function() noexcept { return *Function; } - [[nodiscard]] const MachineFunction &function() const noexcept { + [[nodiscard]] MachineFunction &function() const noexcept { return *Function; } @@ -168,6 +197,22 @@ public: return InsertBlock; } + [[nodiscard]] MachineInstr *insertionInstruction() const noexcept { + return InsertBefore; + } + + [[nodiscard]] GISelCSEInfo *getCSEInfo() noexcept { + return CSEInfo; + } + + [[nodiscard]] GISelCSEInfo *getCSEInfo() const noexcept { + return CSEInfo; + } + + void setCSEInfo(GISelCSEInfo *Info) noexcept { + CSEInfo = Info; + } + [[nodiscard]] Expected<void> verifyInsertPoint() const; [[nodiscard]] Expected<void> setInsertPoint(MachineBasicBlock &Block); @@ -179,63 +224,79 @@ public: } [[nodiscard]] Expected<MachineInstrBuilder> buildInstr(Opcode InstructionOpcode) const; - [[nodiscard]] Expected<MachineInstr *> buildInstr(Opcode InstructionOpcode, - std::initializer_list<Register> Destinations, - std::initializer_list<Register> Sources) const; - [[nodiscard]] Expected<MachineInstr *> buildTrunc(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildCopy(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildImplicitDef(Register Destination) const; - [[nodiscard]] Expected<MachineInstr *> buildAnyExt(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildZExt(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildSExt(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildUndef(Register Destination) const; - [[nodiscard]] Expected<MachineInstr *> buildAnyExtOrTrunc(Register Destination, + [[nodiscard]] Expected<MachineInstr *> + buildInstr(Opcode InstructionOpcode, std::initializer_list<MachineIRBuilderResult> Destinations, + std::initializer_list<Register> Sources) const; + [[nodiscard]] virtual Expected<MachineInstr *> + buildInstr(Opcode InstructionOpcode, std::span<const MachineIRBuilderResult> Destinations, + std::span<const Register> Sources) const; + [[nodiscard]] Expected<MachineInstr *> buildTrunc(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildCopy(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildImplicitDef(MachineIRBuilderResult Destination) const; + [[nodiscard]] Expected<MachineInstr *> buildAnyExt(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildZExt(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildSExt(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildUndef(MachineIRBuilderResult Destination) const; + [[nodiscard]] Expected<MachineInstr *> buildAnyExtOrTrunc(MachineIRBuilderResult Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildSExtOrTrunc(Register Destination, + [[nodiscard]] Expected<MachineInstr *> buildSExtOrTrunc(MachineIRBuilderResult Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildConstant(Register Destination, APInt Value) const; - [[nodiscard]] Expected<MachineInstr *> buildConstant(Register Destination, + [[nodiscard]] virtual Expected<MachineInstr *> buildConstant(MachineIRBuilderResult Destination, + APInt Value) const; + [[nodiscard]] Expected<MachineInstr *> buildConstant(MachineIRBuilderResult Destination, std::int64_t Value) const; - [[nodiscard]] Expected<MachineInstr *> buildSExtInReg(Register Destination, Register Source, - std::uint32_t Width) const; - [[nodiscard]] Expected<MachineInstr *> buildAnd(Register Destination, Register Left, + [[nodiscard]] virtual Expected<MachineInstr *> + buildSExtInReg(MachineIRBuilderResult Destination, Register Source, std::uint32_t Width) const; + [[nodiscard]] Expected<MachineInstr *> buildAnd(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildOr(Register Destination, Register Left, + [[nodiscard]] Expected<MachineInstr *> buildOr(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildXor(Register Destination, Register Left, + [[nodiscard]] Expected<MachineInstr *> buildXor(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildAdd(Register Destination, Register Left, + [[nodiscard]] Expected<MachineInstr *> buildAdd(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildSub(Register Destination, Register Left, + [[nodiscard]] Expected<MachineInstr *> buildSub(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildShl(Register Destination, Register Left, + [[nodiscard]] Expected<MachineInstr *> buildShl(MachineIRBuilderResult Destination, Register Left, Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildLShr(Register Destination, Register Left, - Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildAShr(Register Destination, Register Left, - Register Right) const; - [[nodiscard]] Expected<MachineInstr *> buildPtrToInt(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildIntToPtr(Register Destination, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildICmp(IntegerPredicate Predicate, Register Destination, + [[nodiscard]] Expected<MachineInstr *> buildLShr(MachineIRBuilderResult Destination, + Register Left, Register Right) const; + [[nodiscard]] Expected<MachineInstr *> buildAShr(MachineIRBuilderResult Destination, + Register Left, Register Right) const; + [[nodiscard]] Expected<MachineInstr *> buildPtrToInt(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildIntToPtr(MachineIRBuilderResult Destination, + Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildICmp(IntegerPredicate Predicate, + MachineIRBuilderResult Destination, Register Left, Register Right) const; [[nodiscard]] Expected<MachineInstr *> - buildMergeLikeInstr(Register Destination, const std::vector<Register> &Sources) const; + buildMergeLikeInstr(MachineIRBuilderResult Destination, + const std::vector<Register> &Sources) const; [[nodiscard]] Expected<MachineInstr *> - buildMergeValues(Register Destination, const std::vector<Register> &Sources) const; + buildMergeValues(MachineIRBuilderResult Destination, const std::vector<Register> &Sources) const; [[nodiscard]] Expected<MachineInstr *> buildUnmergeValues(const std::vector<Register> &Destinations, Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildExtract(Register Destination, Register Source, - std::uint64_t Offset) const; - [[nodiscard]] Expected<MachineInstr *> buildInsert(Register Destination, Register Source, - Register Inserted, std::uint64_t Offset) const; + [[nodiscard]] virtual Expected<MachineInstr *> + buildExtract(MachineIRBuilderResult Destination, Register Source, std::uint64_t Offset) const; + [[nodiscard]] Expected<MachineInstr *> buildInsert(MachineIRBuilderResult Destination, + Register Source, Register Inserted, + std::uint64_t Offset) const; private: - [[nodiscard]] Expected<MachineInstr *> buildUnary(Opcode InstructionOpcode, Register Destination, - Register Source) const; - [[nodiscard]] Expected<MachineInstr *> buildBinary(Opcode InstructionOpcode, Register Destination, - Register Left, Register Right) const; [[nodiscard]] Expected<MachineInstr *> - buildExtOrTrunc(Opcode ExtensionOpcode, Register Destination, Register Source) const; + buildUnary(Opcode InstructionOpcode, MachineIRBuilderResult Destination, Register Source) const; + [[nodiscard]] Expected<MachineInstr *> buildBinary(Opcode InstructionOpcode, + MachineIRBuilderResult Destination, + Register Left, Register Right) const; + [[nodiscard]] Expected<MachineInstr *> buildExtOrTrunc(Opcode ExtensionOpcode, + MachineIRBuilderResult Destination, + Register Source) const; [[nodiscard]] Expected<LowLevelType> registerType(Register Reg) const; [[nodiscard]] Expected<void> validateBlock(const MachineBasicBlock &Block) const; [[nodiscard]] Expected<void> validateInstruction(const MachineInstr &Instruction) const; @@ -244,6 +305,7 @@ private: const TargetDescription *Target; MachineBasicBlock *InsertBlock = nullptr; MachineInstr *InsertBefore = nullptr; + GISelCSEInfo *CSEInfo = nullptr; }; } // namespace rcc |
