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 "VPlan.h" 28 #include "VPlanDominatorTree.h" 29 #include "VPlanVerifier.h" 30 31 namespace llvm { 32 33 class Loop; 34 class VPlanTestBase; 35 36 /// Main class to build the VPlan H-CFG for an incoming IR. 37 class VPlanHCFGBuilder { 38 friend VPlanTestBase; 39 40 private: 41 // The outermost loop of the input loop nest considered for vectorization. 42 Loop *TheLoop; 43 44 // Loop Info analysis. 45 LoopInfo *LI; 46 47 // The VPlan that will contain the H-CFG we are building. 48 VPlan &Plan; 49 50 // VPlan verifier utility. 51 VPlanVerifier Verifier; 52 53 // Dominator analysis for VPlan plain CFG to be used in the 54 // construction of the H-CFG. This analysis is no longer valid once regions 55 // are introduced. 56 VPDominatorTree VPDomTree; 57 58 /// Build plain CFG for TheLoop. Return a new VPRegionBlock (TopRegion) 59 /// enclosing the plain CFG. 60 VPRegionBlock *buildPlainCFG(); 61 62 public: 63 VPlanHCFGBuilder(Loop *Lp, LoopInfo *LI, VPlan &P) 64 : TheLoop(Lp), LI(LI), Plan(P) {} 65 66 /// Build H-CFG for TheLoop and update Plan accordingly. 67 void buildHierarchicalCFG(); 68 }; 69 } // namespace llvm 70 71 #endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_VPLANHCFGBUILDER_H 72