| //===-- VPlanHCFGBuilder.h --------------------------------------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// This file defines the VPlanHCFGBuilder class which contains the public | |
| /// interface (buildHierarchicalCFG) to build a VPlan-based Hierarchical CFG | |
| /// (H-CFG) for an incoming IR. | |
| /// | |
| /// A H-CFG in VPlan is a control-flow graph whose nodes are VPBasicBlocks | |
| /// and/or VPRegionBlocks (i.e., other H-CFGs). The outermost H-CFG of a VPlan | |
| /// consists of a VPRegionBlock, denoted Top Region, which encloses any other | |
| /// VPBlockBase in the H-CFG. This guarantees that any VPBlockBase in the H-CFG | |
| /// other than the Top Region will have a parent VPRegionBlock and allows us | |
| /// to easily add more nodes before/after the main vector loop (such as the | |
| /// reduction epilogue). | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H | |
| #define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H | |
| #include "VPlanDominatorTree.h" | |
| #include "VPlanVerifier.h" | |
| namespace llvm { | |
| class Loop; | |
| class LoopInfo; | |
| class VPRegionBlock; | |
| class VPlan; | |
| class VPlanTestBase; | |
| /// Main class to build the VPlan H-CFG for an incoming IR. | |
| class VPlanHCFGBuilder { | |
| friend VPlanTestBase; | |
| private: | |
| // The outermost loop of the input loop nest considered for vectorization. | |
| Loop *TheLoop; | |
| // Loop Info analysis. | |
| LoopInfo *LI; | |
| // The VPlan that will contain the H-CFG we are building. | |
| VPlan &Plan; | |
| // VPlan verifier utility. | |
| VPlanVerifier Verifier; | |
| // Dominator analysis for VPlan plain CFG to be used in the | |
| // construction of the H-CFG. This analysis is no longer valid once regions | |
| // are introduced. | |
| VPDominatorTree VPDomTree; | |
| /// Build plain CFG for TheLoop. Return the pre-header VPBasicBlock connected | |
| /// to a new VPRegionBlock (TopRegion) enclosing the plain CFG. | |
| VPBasicBlock *buildPlainCFG(); | |
| public: | |
| VPlanHCFGBuilder(Loop *Lp, LoopInfo *LI, VPlan &P) | |
| : TheLoop(Lp), LI(LI), Plan(P) {} | |
| /// Build H-CFG for TheLoop and update Plan accordingly. | |
| void buildHierarchicalCFG(); | |
| }; | |
| } // namespace llvm | |
| #endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H |