| //===- IteratedDominanceFrontier.h - Calculate IDF --------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_ANALYSIS_IDF_H |
| #define LLVM_ANALYSIS_IDF_H |
| |
| #include "llvm/IR/CFGDiff.h" |
| #include "llvm/Support/GenericIteratedDominanceFrontier.h" |
| |
| namespace llvm { |
| |
| class BasicBlock; |
| |
| namespace IDFCalculatorDetail { |
| |
| /// Specialization for BasicBlock for the optional use of GraphDiff. |
| template <bool IsPostDom> struct ChildrenGetterTy<BasicBlock, IsPostDom> { |
| using NodeRef = BasicBlock *; |
| using ChildrenTy = SmallVector<BasicBlock *, 8>; |
| |
| ChildrenGetterTy() = default; |
| ChildrenGetterTy(const GraphDiff<BasicBlock *, IsPostDom> *GD) : GD(GD) { |
| assert(GD); |
| } |
| |
| ChildrenTy get(const NodeRef &N); |
| |
| const GraphDiff<BasicBlock *, IsPostDom> *GD = nullptr; |
| }; |
| |
| } // end of namespace IDFCalculatorDetail |
| |
| template <bool IsPostDom> |
| class IDFCalculator final : public IDFCalculatorBase<BasicBlock, IsPostDom> { |
| public: |
| using IDFCalculatorBase = |
| typename llvm::IDFCalculatorBase<BasicBlock, IsPostDom>; |
| using ChildrenGetterTy = typename IDFCalculatorBase::ChildrenGetterTy; |
| |
| IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT) |
| : IDFCalculatorBase(DT) {} |
| |
| IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT, |
| const GraphDiff<BasicBlock *, IsPostDom> *GD) |
| : IDFCalculatorBase(DT, ChildrenGetterTy(GD)) { |
| assert(GD); |
| } |
| }; |
| |
| using ForwardIDFCalculator = IDFCalculator<false>; |
| using ReverseIDFCalculator = IDFCalculator<true>; |
| |
| //===----------------------------------------------------------------------===// |
| // Implementation. |
| //===----------------------------------------------------------------------===// |
| |
| namespace IDFCalculatorDetail { |
| |
| template <bool IsPostDom> |
| typename ChildrenGetterTy<BasicBlock, IsPostDom>::ChildrenTy |
| ChildrenGetterTy<BasicBlock, IsPostDom>::get( |
| const ChildrenGetterTy<BasicBlock, IsPostDom>::NodeRef &N) { |
| |
| using OrderedNodeTy = |
| typename IDFCalculatorBase<BasicBlock, IsPostDom>::OrderedNodeTy; |
| |
| if (!GD) { |
| auto Children = children<OrderedNodeTy>(N); |
| return {Children.begin(), Children.end()}; |
| } |
| |
| using SnapShotBBPairTy = |
| std::pair<const GraphDiff<BasicBlock *, IsPostDom> *, OrderedNodeTy>; |
| |
| ChildrenTy Ret; |
| for (const auto &SnapShotBBPair : children<SnapShotBBPairTy>({GD, N})) |
| Ret.emplace_back(SnapShotBBPair.second); |
| return Ret; |
| } |
| |
| } // end of namespace IDFCalculatorDetail |
| |
| } // end of namespace llvm |
| |
| #endif |