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