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 31namespace llvm { 32 33class Loop; 34class VPlanTestBase; 35 36/// Main class to build the VPlan H-CFG for an incoming IR. 37class VPlanHCFGBuilder { 38 friend VPlanTestBase; 39 40private: 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 62public: 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