// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_REGISTERPRESSURE_H #define RCC_CODEGEN_REGISTERPRESSURE_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/CodeGen/ScheduleDAG.h" #include "rcc/Support/Error.h" #include #include #include #include #include namespace rcc { class MachineFunction; class TargetDescription; class TargetSchedulingModel; struct MachineBlockLiveness; namespace detail { struct RegisterPressureBuilder; } // namespace detail struct RegisterPressureValue final { RegisterPressureSetID Set; std::uint32_t Current = 0; std::uint32_t Maximum = 0; std::uint32_t Limit = 0; friend constexpr bool operator==(RegisterPressureValue, RegisterPressureValue) noexcept = default; }; struct RegisterPressureCost final { std::uint64_t CurrentPressure = 0; std::uint64_t CurrentExcess = 0; std::uint64_t PeakExcess = 0; std::uint64_t PeakIncrease = 0; friend constexpr bool operator==(RegisterPressureCost, RegisterPressureCost) noexcept = default; }; enum class RegisterPressureDirection : std::uint8_t { TopDown, BottomUp, }; class RegisterPressureTracker final { public: [[nodiscard]] static Expected create(const ScheduleDAG &DAG, const MachineFunction &Function, const TargetDescription &Target, const TargetSchedulingModel &Model, ScheduleDAGMode Mode, const MachineBlockLiveness &Liveness, RegisterPressureDirection Direction = RegisterPressureDirection::TopDown); [[nodiscard]] std::span pressure() const noexcept { return Pressure; } [[nodiscard]] bool wasScheduled(std::size_t UnitID) const noexcept { return UnitID < Scheduled.size() && Scheduled[UnitID]; } [[nodiscard]] Expected evaluate(std::size_t UnitID) const; [[nodiscard]] Expected schedule(std::size_t UnitID); [[nodiscard]] RegisterPressureCost cost() const noexcept; private: using EntityID = std::size_t; struct Entity final { std::vector Sets; std::size_t RemainingUses = 0; bool HasDefinition = false; bool DefinitionPending = false; bool LiveOut = false; bool Live = false; }; struct Event final { std::vector Uses; std::vector Definitions; }; struct UnitEffects final { std::vector Events; }; [[nodiscard]] Expected applyEvent(const Event &Value); [[nodiscard]] Expected makeLive(EntityID Entity); [[nodiscard]] Expected makeDead(EntityID Entity); std::vector Pressure; std::unordered_map PressureIndexes; std::vector Entities; std::vector Effects; std::vector Scheduled; RegisterPressureDirection Direction = RegisterPressureDirection::TopDown; friend struct detail::RegisterPressureBuilder; }; } // namespace rcc #endif // RCC_CODEGEN_REGISTERPRESSURE_H