Hideki Saito 4e4ecae028 [LV][VPlan] Change to implement VPlan based predication for
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
2019-01-23 22:43:12 +00:00

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