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