forked from OSchip/llvm-project
75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
//===-- VPlanPredicator.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 VPlanPredicator class which contains the public
|
|
/// interfaces to predicate and linearize the VPlan region.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
|
|
#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
|
|
|
|
#include "LoopVectorizationPlanner.h"
|
|
#include "VPlan.h"
|
|
#include "VPlanDominatorTree.h"
|
|
|
|
namespace llvm {
|
|
|
|
class VPlanPredicator {
|
|
private:
|
|
enum class EdgeType {
|
|
TRUE_EDGE,
|
|
FALSE_EDGE,
|
|
};
|
|
|
|
// VPlan being predicated.
|
|
VPlan &Plan;
|
|
|
|
// VPLoopInfo for Plan's HCFG.
|
|
VPLoopInfo *VPLI;
|
|
|
|
// Dominator tree for Plan's HCFG.
|
|
VPDominatorTree VPDomTree;
|
|
|
|
// VPlan builder used to generate VPInstructions for block predicates.
|
|
VPBuilder Builder;
|
|
|
|
/// Get the type of edge from \p FromBlock to \p ToBlock. Returns TRUE_EDGE if
|
|
/// \p ToBlock is either the unconditional successor or the conditional true
|
|
/// successor of \p FromBlock and FALSE_EDGE otherwise.
|
|
EdgeType getEdgeTypeBetween(VPBlockBase *FromBlock, VPBlockBase *ToBlock);
|
|
|
|
/// Create and return VPValue corresponding to the predicate for the edge from
|
|
/// \p PredBB to \p CurrentBlock.
|
|
VPValue *getOrCreateNotPredicate(VPBasicBlock *PredBB, VPBasicBlock *CurrBB);
|
|
|
|
/// Generate and return the result of ORing all the predicate VPValues in \p
|
|
/// Worklist.
|
|
VPValue *genPredicateTree(std::list<VPValue *> &Worklist);
|
|
|
|
/// Create or propagate predicate for \p CurrBlock in region \p Region using
|
|
/// predicate(s) of its predecessor(s)
|
|
void createOrPropagatePredicates(VPBlockBase *CurrBlock,
|
|
VPRegionBlock *Region);
|
|
|
|
/// Predicate the CFG within \p Region.
|
|
void predicateRegionRec(VPRegionBlock *Region);
|
|
|
|
/// Linearize the CFG within \p Region.
|
|
void linearizeRegionRec(VPRegionBlock *Region);
|
|
|
|
public:
|
|
VPlanPredicator(VPlan &Plan);
|
|
|
|
/// Predicate Plan's HCFG.
|
|
void predicate(void);
|
|
};
|
|
} // end namespace llvm
|
|
#endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_PREDICATOR_H
|