1 //===-- VPlanDominatorTree.h ------------------------------------*- 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 /// \file 10 /// This file implements dominator tree analysis for a single level of a VPlan's 11 /// H-CFG. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H 16 #define LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H 17 18 #include "VPlan.h" 19 #include "llvm/ADT/GraphTraits.h" 20 #include "llvm/IR/Dominators.h" 21 #include "llvm/Support/CfgTraits.h" 22 23 namespace llvm { 24 25 /// Partial CFG traits for VPlan's CFG, without a value type. 26 class VPCfgTraitsBase : public CfgTraitsBase { 27 public: 28 using ParentType = VPRegionBlock; 29 using BlockRef = VPBlockBase *; 30 using ValueRef = void; 31 32 static CfgBlockRef wrapRef(BlockRef block) { 33 return makeOpaque<CfgBlockRefTag>(block); 34 } 35 static BlockRef unwrapRef(CfgBlockRef block) { 36 return static_cast<BlockRef>(getOpaque(block)); 37 } 38 }; 39 40 class VPCfgTraits : public CfgTraits<VPCfgTraitsBase, VPCfgTraits> { 41 public: 42 static VPRegionBlock *getBlockParent(VPBlockBase *block) { 43 return block->getParent(); 44 } 45 46 static auto predecessors(VPBlockBase *block) { 47 return llvm::inverse_children<VPBlockBase *>(block); 48 } 49 50 static auto successors(VPBlockBase *block) { 51 return llvm::children<VPBlockBase *>(block); 52 } 53 }; 54 55 template <> struct CfgTraitsFor<VPBlockBase> { using CfgTraits = VPCfgTraits; }; 56 57 /// Template specialization of the standard LLVM dominator tree utility for 58 /// VPBlockBases. 59 using VPDominatorTree = DomTreeBase<VPBlockBase>; 60 61 using VPDomTreeNode = DomTreeNodeBase<VPBlockBase>; 62 63 /// Template specializations of GraphTraits for VPDomTreeNode. 64 template <> 65 struct GraphTraits<VPDomTreeNode *> 66 : public DomTreeGraphTraitsBase<VPDomTreeNode, 67 VPDomTreeNode::const_iterator> {}; 68 69 template <> 70 struct GraphTraits<const VPDomTreeNode *> 71 : public DomTreeGraphTraitsBase<const VPDomTreeNode, 72 VPDomTreeNode::const_iterator> {}; 73 } // namespace llvm 74 #endif // LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H 75