Viewing file: IteratedDominanceFrontier.h (2.46 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- 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_ITERATEDDOMINANCEFRONTIER_H #define LLVM_ANALYSIS_ITERATEDDOMINANCEFRONTIER_H
#include "llvm/Support/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 NodeRef &N) {
using OrderedNodeTy = typename IDFCalculatorBase<BasicBlock, IsPostDom>::OrderedNodeTy;
if (!GD) { auto Children = children<OrderedNodeTy>(N); return {Children.begin(), Children.end()}; }
return GD->template getChildren<IsPostDom>(N); }
} // end of namespace IDFCalculatorDetail
} // end of namespace llvm
#endif
|