Home | History | Annotate | Line # | Download | only in Analysis
      1 //===- IteratedDominanceFrontier.h - Calculate IDF --------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #ifndef LLVM_ANALYSIS_ITERATEDDOMINANCEFRONTIER_H
     10 #define LLVM_ANALYSIS_ITERATEDDOMINANCEFRONTIER_H
     11 
     12 #include "llvm/Support/CFGDiff.h"
     13 #include "llvm/Support/GenericIteratedDominanceFrontier.h"
     14 
     15 namespace llvm {
     16 
     17 class BasicBlock;
     18 
     19 namespace IDFCalculatorDetail {
     20 
     21 /// Specialization for BasicBlock for the optional use of GraphDiff.
     22 template <bool IsPostDom> struct ChildrenGetterTy<BasicBlock, IsPostDom> {
     23   using NodeRef = BasicBlock *;
     24   using ChildrenTy = SmallVector<BasicBlock *, 8>;
     25 
     26   ChildrenGetterTy() = default;
     27   ChildrenGetterTy(const GraphDiff<BasicBlock *, IsPostDom> *GD) : GD(GD) {
     28     assert(GD);
     29   }
     30 
     31   ChildrenTy get(const NodeRef &N);
     32 
     33   const GraphDiff<BasicBlock *, IsPostDom> *GD = nullptr;
     34 };
     35 
     36 } // end of namespace IDFCalculatorDetail
     37 
     38 template <bool IsPostDom>
     39 class IDFCalculator final : public IDFCalculatorBase<BasicBlock, IsPostDom> {
     40 public:
     41   using IDFCalculatorBase =
     42       typename llvm::IDFCalculatorBase<BasicBlock, IsPostDom>;
     43   using ChildrenGetterTy = typename IDFCalculatorBase::ChildrenGetterTy;
     44 
     45   IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT)
     46       : IDFCalculatorBase(DT) {}
     47 
     48   IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT,
     49                 const GraphDiff<BasicBlock *, IsPostDom> *GD)
     50       : IDFCalculatorBase(DT, ChildrenGetterTy(GD)) {
     51     assert(GD);
     52   }
     53 };
     54 
     55 using ForwardIDFCalculator = IDFCalculator<false>;
     56 using ReverseIDFCalculator = IDFCalculator<true>;
     57 
     58 //===----------------------------------------------------------------------===//
     59 // Implementation.
     60 //===----------------------------------------------------------------------===//
     61 
     62 namespace IDFCalculatorDetail {
     63 
     64 template <bool IsPostDom>
     65 typename ChildrenGetterTy<BasicBlock, IsPostDom>::ChildrenTy
     66 ChildrenGetterTy<BasicBlock, IsPostDom>::get(const NodeRef &N) {
     67 
     68   using OrderedNodeTy =
     69       typename IDFCalculatorBase<BasicBlock, IsPostDom>::OrderedNodeTy;
     70 
     71   if (!GD) {
     72     auto Children = children<OrderedNodeTy>(N);
     73     return {Children.begin(), Children.end()};
     74   }
     75 
     76   return GD->template getChildren<IsPostDom>(N);
     77 }
     78 
     79 } // end of namespace IDFCalculatorDetail
     80 
     81 } // end of namespace llvm
     82 
     83 #endif
     84