diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-14 22:37:46 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-14 22:37:46 +0800 |
| commit | b85a348ab7bdd878fd975121fc2501625eceec95 (patch) | |
| tree | 737a6e0f3d0af64d2e3295b8507048b52a7be5c9 /backend/include/rcc/CodeGen/GlobalISel/Utils.h | |
| parent | 558485504773804d56f0552517dbe42722742741 (diff) | |
| download | rcc-project-b85a348ab7bdd878fd975121fc2501625eceec95.tar.gz rcc-project-b85a348ab7bdd878fd975121fc2501625eceec95.tar.xz | |
[GlobalISel] Legalize G_ABS
Diffstat (limited to 'backend/include/rcc/CodeGen/GlobalISel/Utils.h')
| -rw-r--r-- | backend/include/rcc/CodeGen/GlobalISel/Utils.h | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/backend/include/rcc/CodeGen/GlobalISel/Utils.h b/backend/include/rcc/CodeGen/GlobalISel/Utils.h index 5af2fb4..f252454 100644 --- a/backend/include/rcc/CodeGen/GlobalISel/Utils.h +++ b/backend/include/rcc/CodeGen/GlobalISel/Utils.h @@ -3,11 +3,13 @@ #ifndef RCC_CODEGEN_GLOBALISEL_UTILS_H #define RCC_CODEGEN_GLOBALISEL_UTILS_H +#include "rcc/ADT/APInt.h" #include "rcc/CodeGen/LowLevelType.h" #include "rcc/CodeGen/Register.h" #include "rcc/Support/Error.h" #include <cstddef> +#include <optional> #include <span> #include <vector> @@ -18,36 +20,38 @@ class MachineInstr; class MachineRegisterInfo; class TargetDescription; +struct ValueAndVReg final { + APInt Value; + Register VReg; +}; + +[[nodiscard]] std::optional<ValueAndVReg> +getIConstantVRegValWithLookThrough(Register VReg, const MachineRegisterInfo &MRI, + bool LookThroughInstrs = true); + /// Check whether an instruction only defines dead virtual registers and has no /// observable side effects. -[[nodiscard]] bool isTriviallyDead(const MachineInstr &Instruction, - const MachineRegisterInfo &MRI, +[[nodiscard]] bool isTriviallyDead(const MachineInstr &Instruction, const MachineRegisterInfo &MRI, const TargetDescription &Target) noexcept; [[nodiscard]] Expected<void> eraseInstrs(std::span<MachineInstr *const> Instructions, - MachineRegisterInfo &MRI, - const TargetDescription &Target); + MachineRegisterInfo &MRI, const TargetDescription &Target); -[[nodiscard]] Expected<void> eraseInstr(MachineInstr &Instruction, - MachineRegisterInfo &MRI, +[[nodiscard]] Expected<void> eraseInstr(MachineInstr &Instruction, MachineRegisterInfo &MRI, const TargetDescription &Target); -[[nodiscard]] Expected<void> extractParts(Register Reg, LowLevelType Type, - int PartCount, +[[nodiscard]] Expected<void> extractParts(Register Reg, LowLevelType Type, int PartCount, std::vector<Register> &Parts, - MachineIRBuilder &MIRBuilder, - MachineRegisterInfo &MRI); - -[[nodiscard]] Expected<bool> -extractParts(Register Reg, LowLevelType RegisterType, LowLevelType MainType, - LowLevelType &LeftoverType, std::vector<Register> &Parts, - std::vector<Register> &LeftoverParts, - MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI); - -[[nodiscard]] Expected<LowLevelType> getLCMType(LowLevelType OriginalType, - LowLevelType TargetType); -[[nodiscard]] Expected<LowLevelType> getGCDType(LowLevelType OriginalType, - LowLevelType TargetType); + MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI); + +[[nodiscard]] Expected<bool> extractParts(Register Reg, LowLevelType RegisterType, + LowLevelType MainType, LowLevelType &LeftoverType, + std::vector<Register> &Parts, + std::vector<Register> &LeftoverParts, + MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI); + +[[nodiscard]] Expected<LowLevelType> getLCMType(LowLevelType OriginalType, LowLevelType TargetType); +[[nodiscard]] Expected<LowLevelType> getGCDType(LowLevelType OriginalType, LowLevelType TargetType); } // namespace rcc |
