// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_REACHINGDEFANALYSIS_H #define RCC_CODEGEN_REACHINGDEFANALYSIS_H #include "rcc/CodeGen/MachineFunctionAnalysisManager.h" #include "rcc/Support/Error.h" #include #include #include #include #include namespace rcc { class MachineFunction; class MachineInstr; class MachineOperand; class TargetDescription; class ReachingDefAnalysis final { public: using DefinitionSet = std::vector; class Result final { public: [[nodiscard]] std::span reachingDefinitions(const MachineOperand &Operand) const noexcept; [[nodiscard]] std::size_t instructionNumber(const MachineInstr &Instruction) const noexcept; [[nodiscard]] bool invalidate(const MachineFunction &, const PreservedAnalyses &Preserved) const noexcept; private: std::unordered_map OperandDefinitions; std::unordered_map InstructionNumbers; friend class ReachingDefAnalysis; }; [[nodiscard]] static constexpr std::string_view name() noexcept { return "ReachingDefAnalysis"; } [[nodiscard]] static Expected run(MachineFunction &Function, const TargetDescription &Target, MachineFunctionAnalysisManager &Analyses); }; } // namespace rcc #endif // RCC_CODEGEN_REACHINGDEFANALYSIS_H