Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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