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
15namespace llvm {
16
17class BasicBlock;
18
19namespace IDFCalculatorDetail {
20
21/// Specialization for BasicBlock for the optional use of GraphDiff.
22template <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
38template <bool IsPostDom>
39class IDFCalculator final : public IDFCalculatorBase<BasicBlock, IsPostDom> {
40public:
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
55using ForwardIDFCalculator = IDFCalculator<false>;
56using ReverseIDFCalculator = IDFCalculator<true>;
57
58//===----------------------------------------------------------------------===//
59// Implementation.
60//===----------------------------------------------------------------------===//
61
62namespace IDFCalculatorDetail {
63
64template <bool IsPostDom>
65typename ChildrenGetterTy<BasicBlock, IsPostDom>::ChildrenTy
66ChildrenGetterTy<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

source code of llvm/include/llvm/Analysis/IteratedDominanceFrontier.h