
This updates the GraphTraits specialization for VPBlockBase to recurse through VPRegionBlocks. This in turn enables using VPDominatorTree to query dominance between any block in a plan. This should enable additional use cases, including improvements to def-use verification and porting IR-based transforms that rely on the dominator tree. Specifically, this change means that for regions, the entry and exit blocks dominate the successors of the region. Depends on D140512 and D142162. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D140513
54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
//===-- VPlanDominatorTree.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 implements dominator tree analysis for a single level of a VPlan's
|
|
/// H-CFG.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H
|
|
#define LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H
|
|
|
|
#include "VPlan.h"
|
|
#include "VPlanCFG.h"
|
|
#include "llvm/ADT/GraphTraits.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/Support/GenericDomTree.h"
|
|
|
|
namespace llvm {
|
|
|
|
template <> struct DomTreeNodeTraits<VPBlockBase> {
|
|
using NodeType = VPBlockBase;
|
|
using NodePtr = VPBlockBase *;
|
|
using ParentPtr = VPlan *;
|
|
|
|
static NodePtr getEntryNode(ParentPtr Parent) { return Parent->getEntry(); }
|
|
static ParentPtr getParent(NodePtr B) { return B->getPlan(); }
|
|
};
|
|
|
|
///
|
|
/// Template specialization of the standard LLVM dominator tree utility for
|
|
/// VPBlockBases.
|
|
using VPDominatorTree = DomTreeBase<VPBlockBase>;
|
|
|
|
using VPDomTreeNode = DomTreeNodeBase<VPBlockBase>;
|
|
|
|
/// Template specializations of GraphTraits for VPDomTreeNode.
|
|
template <>
|
|
struct GraphTraits<VPDomTreeNode *>
|
|
: public DomTreeGraphTraitsBase<VPDomTreeNode,
|
|
VPDomTreeNode::const_iterator> {};
|
|
|
|
template <>
|
|
struct GraphTraits<const VPDomTreeNode *>
|
|
: public DomTreeGraphTraitsBase<const VPDomTreeNode,
|
|
VPDomTreeNode::const_iterator> {};
|
|
} // namespace llvm
|
|
#endif // LLVM_TRANSFORMS_VECTORIZE_VPLANDOMINATORTREE_H
|