![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/include/llvm-10/llvm/Analysis/ |
Upload File : |
//===- 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 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