// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_MACHINECFGUPDATER_H #define RCC_CODEGEN_MACHINECFGUPDATER_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/Support/Error.h" namespace rcc { class MachineBasicBlock; class MachineFunction; class MachineInstr; class MachineCFGUpdater final { public: explicit MachineCFGUpdater(MachineFunction &Function) noexcept : Function(&Function) {} [[nodiscard]] Expected addSuccessor(MachineBasicBlock &From, MachineBasicBlock &To, BranchProbability Probability = BranchProbability::zero()); [[nodiscard]] Expected removeSuccessor(MachineBasicBlock &From, MachineBasicBlock &To); [[nodiscard]] Expected replaceSuccessor(MachineBasicBlock &From, MachineBasicBlock &OldTarget, MachineBasicBlock &NewTarget); [[nodiscard]] Expected splitEdge(MachineBasicBlock &From, MachineBasicBlock &To, MachineBasicBlock &EdgeBlock); [[nodiscard]] Expected updateBranchProbability(MachineBasicBlock &From, MachineBasicBlock &To, BranchProbability Probability); [[nodiscard]] Expected transferSuccessors(MachineBasicBlock &From, MachineBasicBlock &To); [[nodiscard]] Expected disconnectBlock(MachineBasicBlock &Block); [[nodiscard]] Expected splitBlock(MachineBasicBlock &Block, MachineInstr &SplitBefore); [[nodiscard]] Expected deleteBlock(MachineBasicBlock &Block); private: [[nodiscard]] Expected verifyOwnership(const MachineBasicBlock &Block) const; MachineFunction *Function; }; } // namespace rcc #endif // RCC_CODEGEN_MACHINECFGUPDATER_H