// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_GLOBALISEL_UTILS_H #define RCC_CODEGEN_GLOBALISEL_UTILS_H #include "rcc/CodeGen/LowLevelType.h" #include "rcc/CodeGen/Register.h" #include "rcc/Support/Error.h" #include #include #include namespace rcc { class MachineIRBuilder; class MachineInstr; class MachineRegisterInfo; class TargetDescription; /// Check whether an instruction only defines dead virtual registers and has no /// observable side effects. [[nodiscard]] bool isTriviallyDead(const MachineInstr &Instruction, const MachineRegisterInfo &MRI, const TargetDescription &Target) noexcept; [[nodiscard]] Expected eraseInstrs(std::span Instructions, MachineRegisterInfo &MRI, const TargetDescription &Target); [[nodiscard]] Expected eraseInstr(MachineInstr &Instruction, MachineRegisterInfo &MRI, const TargetDescription &Target); [[nodiscard]] Expected extractParts(Register Reg, LowLevelType Type, int PartCount, std::vector &Parts, MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI); [[nodiscard]] Expected extractParts(Register Reg, LowLevelType RegisterType, LowLevelType MainType, LowLevelType &LeftoverType, std::vector &Parts, std::vector &LeftoverParts, MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI); [[nodiscard]] Expected getLCMType(LowLevelType OriginalType, LowLevelType TargetType); [[nodiscard]] Expected getGCDType(LowLevelType OriginalType, LowLevelType TargetType); } // namespace rcc #endif // RCC_CODEGEN_GLOBALISEL_UTILS_H