VPlanPredicator.h revision 353358
1//===-- VPlanPredicator.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 VPlanPredicator class which contains the public
11/// interfaces to predicate and linearize the VPlan region.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
16#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
17
18#include "LoopVectorizationPlanner.h"
19#include "VPlan.h"
20#include "VPlanDominatorTree.h"
21
22namespace llvm {
23
24class VPlanPredicator {
25private:
26  enum class EdgeType {
27    TRUE_EDGE,
28    FALSE_EDGE,
29  };
30
31  // VPlan being predicated.
32  VPlan &Plan;
33
34  // VPLoopInfo for Plan's HCFG.
35  VPLoopInfo *VPLI;
36
37  // Dominator tree for Plan's HCFG.
38  VPDominatorTree VPDomTree;
39
40  // VPlan builder used to generate VPInstructions for block predicates.
41  VPBuilder Builder;
42
43  /// Get the type of edge from \p FromBlock to \p ToBlock. Returns TRUE_EDGE if
44  /// \p ToBlock is either the unconditional successor or the conditional true
45  /// successor of \p FromBlock and FALSE_EDGE otherwise.
46  EdgeType getEdgeTypeBetween(VPBlockBase *FromBlock, VPBlockBase *ToBlock);
47
48  /// Create and return VPValue corresponding to the predicate for the edge from
49  /// \p PredBB to \p CurrentBlock.
50  VPValue *getOrCreateNotPredicate(VPBasicBlock *PredBB, VPBasicBlock *CurrBB);
51
52  /// Generate and return the result of ORing all the predicate VPValues in \p
53  /// Worklist.
54  VPValue *genPredicateTree(std::list<VPValue *> &Worklist);
55
56  /// Create or propagate predicate for \p CurrBlock in region \p Region using
57  /// predicate(s) of its predecessor(s)
58  void createOrPropagatePredicates(VPBlockBase *CurrBlock,
59                                   VPRegionBlock *Region);
60
61  /// Predicate the CFG within \p Region.
62  void predicateRegionRec(VPRegionBlock *Region);
63
64  /// Linearize the CFG within \p Region.
65  void linearizeRegionRec(VPRegionBlock *Region);
66
67public:
68  VPlanPredicator(VPlan &Plan);
69
70  /// Predicate Plan's HCFG.
71  void predicate(void);
72};
73} // end namespace llvm
74#endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
75