// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_TARGETINSTRINFO_H #define RCC_CODEGEN_TARGETINSTRINFO_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/CodeGen/Register.h" #include "rcc/Support/Error.h" #include #include #include namespace rcc { class MachineBasicBlock; class MachineFunction; class MachineInstr; class MachineOperand; class TargetDescription; struct MachineCopyOperands final { MachineOperand *Destination = nullptr; MachineOperand *Source = nullptr; }; struct MachineBranchAnalysis final { MachineInstr *Conditional = nullptr; MachineInstr *Unconditional = nullptr; MachineBasicBlock *TrueTarget = nullptr; MachineBasicBlock *FalseTarget = nullptr; bool HasUnanalyzableTerminator = false; }; class TargetInstrInfo { public: virtual ~TargetInstrInfo(); [[nodiscard]] virtual Expected analyzeBranch(MachineBasicBlock &Block, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected reverseBranchCondition(MachineInstr &Branch, MachineBasicBlock &NewTarget, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected removeBranch(MachineInstr &Branch, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected rewriteBranchTarget(MachineBasicBlock &Block, MachineBasicBlock &OldTarget, MachineBasicBlock &NewTarget, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected insertBranch(MachineBasicBlock &Block, MachineBasicBlock &TargetBlock, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected isFallthroughEdge(const MachineBasicBlock &From, const MachineBasicBlock &To, const MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected validateCopy(Register Destination, SubRegIndex DestinationSubReg, Register Source, SubRegIndex SourceSubReg, const MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual std::optional getCopyOperands(MachineInstr &) const noexcept { return std::nullopt; } [[nodiscard]] virtual Expected simplifyInstruction(MachineInstr &, MachineFunction &, const TargetDescription &) const { return false; } [[nodiscard]] virtual Expected optimizeCondBranch(MachineInstr &, MachineFunction &, const TargetDescription &) const { return false; } [[nodiscard]] virtual Expected tryConvertToThreeAddress(MachineInstr &, std::size_t, std::size_t, MachineFunction &, const TargetDescription &) const { return false; } [[nodiscard]] virtual Expected instructionSize(const MachineInstr &Instruction, const MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected branchTarget(MachineInstr &Instruction, MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected> evaluateBranchCondition(const MachineInstr &, const MachineFunction &, const TargetDescription &) const { return std::optional{}; } [[nodiscard]] virtual bool isBranchOffsetInRange(const MachineInstr &Instruction, std::int64_t Offset) const noexcept = 0; [[nodiscard]] virtual Expected relaxBranch(MachineInstr &Instruction, std::int64_t Offset, MachineFunction &Function, const TargetDescription &Target) const = 0; }; } // namespace rcc #endif // RCC_CODEGEN_TARGETINSTRINFO_H