#pragma once #include "ir/IR.h" #include #include namespace ir { class DominatorTree { public: DominatorTree() = default; ~DominatorTree() = default; void Recalculate(Function& function); BasicBlock* GetRoot() const; BasicBlock* GetIDom(BasicBlock* block) const; bool Dominates(BasicBlock* a, BasicBlock* b) const; const std::vector& GetChildren(BasicBlock* block) const; const std::vector& GetDominanceFrontier(BasicBlock* block) const; const std::vector& GetPredecessors(BasicBlock* block) const; const std::vector& GetSuccessors(BasicBlock* block) const; private: void BuildCFG(Function& function); void ComputeIDoms(); void ComputeDominanceFrontiers(); BasicBlock* Intersect(BasicBlock* first, BasicBlock* second) const; std::vector blocks_; std::unordered_map> preds_; std::unordered_map> succs_; std::unordered_map idom_; std::unordered_map> children_; std::unordered_map> dominance_frontier_; std::unordered_map dfs_number_; }; } // namespace ir