summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2021-12-07 16:26:31 +0000
committerFlorian Hahn <flo@fhahn.com>2021-12-07 16:26:31 +0000
commite9a294449575a1e1a0daca470f64914695dc9adc (patch)
treecc3ed8822289b57b4da36b241f5edc362f2ca808
parent077a14e00b75a1858cf1095129105eecdac82e69 (diff)
downloadllvm-e9a294449575a1e1a0daca470f64914695dc9adc.tar.gz
[VPlan] Verify plan entry and exit blocks, set correct exit block.
Both the entry and exit blocks of the top-region of a plan must be VPBasicBlocks. They also must have no predecessors or successors respectively. This invariant was broken when splitting a block for sink-after. To fix the issue, set the exit block of the region *after* sink-after is done. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D114586
-rw-r--r--llvm/lib/Transforms/Vectorize/LoopVectorize.cpp3
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp26
2 files changed, 28 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 97b951dfbcd3..76f840807ef0 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -9164,7 +9164,6 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
!Plan->getEntry()->getEntryBasicBlock()->empty() &&
"entry block must be set to a VPRegionBlock having a non-empty entry "
"VPBasicBlock");
- cast<VPRegionBlock>(Plan->getEntry())->setExit(VPBB);
RecipeBuilder.fixHeaderPhis();
// ---------------------------------------------------------------------------
@@ -9235,6 +9234,8 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
}
}
+ cast<VPRegionBlock>(Plan->getEntry())->setExit(VPBB);
+
// Now that sink-after is done, move induction recipes for optimized truncates
// to the phi section of the header block.
for (VPWidenIntOrFpInductionRecipe *Ind : InductionsToMove)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
index 6d6ea4eb30f1..7732d9367985 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp
@@ -156,5 +156,31 @@ bool VPlanVerifier::verifyPlanIsValid(const VPlan &Plan) {
RecipeI++;
}
}
+
+ const VPRegionBlock *TopRegion = cast<VPRegionBlock>(Plan.getEntry());
+ const VPBasicBlock *Entry = dyn_cast<VPBasicBlock>(TopRegion->getEntry());
+ if (!Entry) {
+ errs() << "VPlan entry block is not a VPBasicBlock\n";
+ return false;
+ }
+ const VPBasicBlock *Exit = dyn_cast<VPBasicBlock>(TopRegion->getExit());
+ if (!Exit) {
+ errs() << "VPlan exit block is not a VPBasicBlock\n";
+ return false;
+ }
+
+ for (const VPRegionBlock *Region :
+ VPBlockUtils::blocksOnly<const VPRegionBlock>(
+ depth_first(VPBlockRecursiveTraversalWrapper<const VPBlockBase *>(
+ Plan.getEntry())))) {
+ if (Region->getEntry()->getNumPredecessors() != 0) {
+ errs() << "region entry block has predecessors\n";
+ return false;
+ }
+ if (Region->getExit()->getNumSuccessors() != 0) {
+ errs() << "region exit block has successors\n";
+ return false;
+ }
+ }
return true;
}