1 | //===-- VPlanHCFGBuilder.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 defines the VPlanHCFGBuilder class which contains the public |
11 | /// interface (buildHierarchicalCFG) to build a VPlan-based Hierarchical CFG |
12 | /// (H-CFG) for an incoming IR. |
13 | /// |
14 | /// A H-CFG in VPlan is a control-flow graph whose nodes are VPBasicBlocks |
15 | /// and/or VPRegionBlocks (i.e., other H-CFGs). The outermost H-CFG of a VPlan |
16 | /// consists of a VPRegionBlock, denoted Top Region, which encloses any other |
17 | /// VPBlockBase in the H-CFG. This guarantees that any VPBlockBase in the H-CFG |
18 | /// other than the Top Region will have a parent VPRegionBlock and allows us |
19 | /// to easily add more nodes before/after the main vector loop (such as the |
20 | /// reduction epilogue). |
21 | /// |
22 | //===----------------------------------------------------------------------===// |
23 | |
24 | #ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H |
25 | #define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H |
26 | |
27 | #include "VPlanDominatorTree.h" |
28 | |
29 | namespace llvm { |
30 | |
31 | class Loop; |
32 | class LoopInfo; |
33 | class VPRegionBlock; |
34 | class VPlan; |
35 | class VPlanTestBase; |
36 | |
37 | /// Main class to build the VPlan H-CFG for an incoming IR. |
38 | class VPlanHCFGBuilder { |
39 | friend VPlanTestBase; |
40 | |
41 | private: |
42 | // The outermost loop of the input loop nest considered for vectorization. |
43 | Loop *TheLoop; |
44 | |
45 | // Loop Info analysis. |
46 | LoopInfo *LI; |
47 | |
48 | // The VPlan that will contain the H-CFG we are building. |
49 | VPlan &Plan; |
50 | |
51 | // Dominator analysis for VPlan plain CFG to be used in the |
52 | // construction of the H-CFG. This analysis is no longer valid once regions |
53 | // are introduced. |
54 | VPDominatorTree VPDomTree; |
55 | |
56 | /// Build plain CFG for TheLoop and connects it to Plan's entry. |
57 | void buildPlainCFG(); |
58 | |
59 | public: |
60 | VPlanHCFGBuilder(Loop *Lp, LoopInfo *LI, VPlan &P) |
61 | : TheLoop(Lp), LI(LI), Plan(P) {} |
62 | |
63 | /// Build H-CFG for TheLoop and update Plan accordingly. |
64 | void buildHierarchicalCFG(); |
65 | }; |
66 | } // namespace llvm |
67 | |
68 | #endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H |
69 | |