mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-04 17:46:05 +00:00

VPlan-native path Context: Patch Series #2 for outer loop vectorization support in LV using VPlan. (RFC: http://lists.llvm.org/pipermail/llvm-dev/2017-December/119523.html). Patch series #2 checks that inner loops are still trivially lock-step among all vector elements. Non-loop branches are blindly assumed as divergent. Changes here implement VPlan based predication algorithm to compute predicates for blocks that need predication. Predicates are computed for the VPLoop region in reverse post order. A block's predicate is computed as OR of the masks of all incoming edges. The mask for an incoming edge is computed as AND of predecessor block's predicate and either predecessor's Condition bit or NOT(Condition bit) depending on whether the edge from predecessor block to the current block is true or false edge. Reviewers: fhahn, rengolin, hsaito, dcaballe Reviewed By: fhahn Patch by Satish Guggilla, thanks! Differential Revision: https://reviews.llvm.org/D53349 llvm-svn: 351990
76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
//===-- VPlanPredicator.h ---------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \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
|