[VPlan] Add initial inner-loop VPlan verification.

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
This commit is contained in:
Florian Hahn 2021-11-09 10:18:16 +00:00
parent b9bc64ba14
commit d9361bfbe2
3 changed files with 34 additions and 0 deletions

View File

@ -9560,6 +9560,7 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
RSO.flush();
Plan->setName(PlanName);
assert(VPlanVerifier::verifyPlanIsValid(*Plan) && "VPlan is invalid");
return Plan;
}

View File

@ -128,3 +128,29 @@ void VPlanVerifier::verifyHierarchicalCFG(
assert(!TopRegion->getParent() && "VPlan Top Region should have no parent.");
verifyRegionRec(TopRegion);
}
bool VPlanVerifier::verifyPlanIsValid(const VPlan &Plan) {
auto Iter = depth_first(
VPBlockRecursiveTraversalWrapper<const VPBlockBase *>(Plan.getEntry()));
for (const VPBasicBlock *VPBB :
VPBlockUtils::blocksOnly<const VPBasicBlock>(Iter)) {
// Verify that phi-like recipes are at the beginning of the block, with no
// other recipes in between.
auto RecipeI = VPBB->begin();
auto End = VPBB->end();
while (RecipeI != End && RecipeI->isPhi())
RecipeI++;
while (RecipeI != End) {
if (RecipeI->isPhi() && !isa<VPBlendRecipe>(&*RecipeI)) {
errs() << "Found phi-like recipe after non-phi recipe:";
RecipeI->dump();
errs() << "after\n";
std::prev(RecipeI)->dump();
return false;
}
RecipeI++;
}
}
return true;
}

View File

@ -26,6 +26,7 @@
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.
@ -35,6 +36,12 @@ struct VPlanVerifier {
/// 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