
This patch adds a function to verify general properties of VPlans. The first check makes sure that all phi-like recipes are at the beginning of a block, with no other recipes in between. Note that this currently may not hold for VPBlendRecipes at the moment, as other recipes may be inserted before the VPBlendRecipe during mask creation. Note that this patch depends on D111300 and D111301, which fix code that breaks the checked invariant. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D111302
49 lines
2.0 KiB
C++
49 lines
2.0 KiB
C++
//===-- VPlanVerifier.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 declares the class VPlanVerifier, which contains utility functions
|
|
/// to check the consistency of a VPlan. This includes the following kinds of
|
|
/// invariants:
|
|
///
|
|
/// 1. Region/Block invariants:
|
|
/// - Region's entry/exit block must have no predecessors/successors,
|
|
/// respectively.
|
|
/// - Block's parent must be the region immediately containing the block.
|
|
/// - Linked blocks must have a bi-directional link (successor/predecessor).
|
|
/// - All predecessors/successors of a block must belong to the same region.
|
|
/// - Blocks must have no duplicated successor/predecessor.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANVERIFIER_H
|
|
#define LLVM_TRANSFORMS_VECTORIZE_VPLANVERIFIER_H
|
|
|
|
namespace llvm {
|
|
class VPRegionBlock;
|
|
class VPlan;
|
|
|
|
/// Struct with utility functions that can be used to check the consistency and
|
|
/// invariants of a VPlan, including the components of its H-CFG.
|
|
struct VPlanVerifier {
|
|
/// Verify the invariants of the H-CFG starting from \p TopRegion. The
|
|
/// verification process comprises the following steps:
|
|
/// 1. Region/Block verification: Check the Region/Block verification
|
|
/// invariants for every region in the H-CFG.
|
|
void verifyHierarchicalCFG(const VPRegionBlock *TopRegion) const;
|
|
|
|
/// Verify invariants for general VPlans. Currently it checks the following:
|
|
/// 1. all phi-like recipes must be at the beginning of a block, with no other
|
|
/// recipes in between. Note that currently there is still an exception for
|
|
/// VPBlendRecipes.
|
|
static bool verifyPlanIsValid(const VPlan &Plan);
|
|
};
|
|
} // namespace llvm
|
|
|
|
#endif //LLVM_TRANSFORMS_VECTORIZE_VPLANVERIFIER_H
|