-
Notifications
You must be signed in to change notification settings - Fork 16.1k
[VPlan] Split out EVL exit cond transform from canonicalizeEVLLoops. NFC #178181
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[VPlan] Split out EVL exit cond transform from canonicalizeEVLLoops. NFC #178181
Conversation
This is split out from llvm#177114. In order to make canonicalizeEVLLoops a generic "convert to variable stepping" transform, move the code that changes the exit condition to a separate transform. Run it before canonicalizeEVLLoops before VPEVLBasedIVPHIRecipe is expanded. Also relax the assertion for VPInstruction::ExplicitVectorLength to just bail instead, since eventually VPEVLBasedIVPHIRecipe will be used by other loops that aren't EVL tail folded.
|
@llvm/pr-subscribers-llvm-transforms Author: Luke Lau (lukel97) ChangesThis is split out from #177114. In order to make canonicalizeEVLLoops a generic "convert to variable stepping" transform, move the code that changes the exit condition to a separate transform. Run it before canonicalizeEVLLoops before VPEVLBasedIVPHIRecipe is expanded. Also relax the assertion for VPInstruction::ExplicitVectorLength to just bail instead, since eventually VPEVLBasedIVPHIRecipe will be used by other loops that aren't EVL tail folded. Full diff: https://github.com/llvm/llvm-project/pull/178181.diff 3 Files Affected:
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 3cf5e5fb3f818..6f0c59bc8f0ea 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7430,6 +7430,8 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
// Expand BranchOnTwoConds after dissolution, when latch has direct access to
// its successors.
VPlanTransforms::expandBranchOnTwoConds(BestVPlan);
+ // Switch the exit condition to AVLNext == 0 for EVL tail folded loops.
+ VPlanTransforms::convertEVLExitCond(BestVPlan);
// Canonicalize EVL loops after regions are dissolved.
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
VPlanTransforms::materializeBackedgeTakenCount(BestVPlan, VectorPH);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index d1d5870d78a03..52dd74baef6ec 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -3247,9 +3247,9 @@ void VPlanTransforms::addExplicitVectorLength(
Plan.setUF(1);
}
-void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
- // Find EVL loop entries by locating VPEVLBasedIVPHIRecipe.
- // There should be only one EVL PHI in the entire plan.
+/// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe.
+/// There should be only one EVL PHI in the entire plan.
+static VPEVLBasedIVPHIRecipe *findEVLPhi(VPlan &Plan) {
VPEVLBasedIVPHIRecipe *EVLPhi = nullptr;
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
@@ -3260,28 +3260,17 @@ void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
EVLPhi = PhiR;
}
+ return EVLPhi;
+}
+
+void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
+ VPEVLBasedIVPHIRecipe *EVLPhi = findEVLPhi(Plan);
// Early return if no EVL PHI is found.
if (!EVLPhi)
return;
VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
VPValue *EVLIncrement = EVLPhi->getBackedgeValue();
- VPValue *AVL;
- [[maybe_unused]] bool FoundAVL =
- match(EVLIncrement,
- m_c_Add(m_ZExtOrSelf(m_EVL(m_VPValue(AVL))), m_Specific(EVLPhi)));
- assert(FoundAVL && "Didn't find AVL?");
-
- // The AVL may be capped to a safe distance.
- VPValue *SafeAVL;
- if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue())))
- AVL = SafeAVL;
-
- VPValue *AVLNext;
- [[maybe_unused]] bool FoundAVLNext =
- match(AVL, m_VPInstruction<Instruction::PHI>(
- m_Specific(Plan.getTripCount()), m_VPValue(AVLNext)));
- assert(FoundAVLNext && "Didn't find AVL backedge?");
// Convert EVLPhi to concrete recipe.
auto *ScalarR =
@@ -3302,21 +3291,45 @@ void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
VPRecipeBase *CanonicalIVIncrement = Backedge->getDefiningRecipe();
CanonicalIVIncrement->eraseFromParent();
CanonicalIV->eraseFromParent();
+}
- // Replace the use of VectorTripCount in the latch-exiting block.
- // Before: (branch-on-cond (icmp eq EVLIVInc, VectorTripCount))
- // After: (branch-on-cond icmp eq AVLNext, 0)
+void VPlanTransforms::convertEVLExitCond(VPlan &Plan) {
+ VPEVLBasedIVPHIRecipe *EVLPhi = findEVLPhi(Plan);
+ if (!EVLPhi)
+ return;
+
+ // Bail if not an EVL tail folded loop.
+ VPValue *AVL;
+ if (!match(EVLPhi->getBackedgeValue(),
+ m_c_Add(m_ZExtOrSelf(m_EVL(m_VPValue(AVL))), m_Specific(EVLPhi))))
+ return;
+
+ // The AVL may be capped to a safe distance.
+ VPValue *SafeAVL;
+ if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue())))
+ AVL = SafeAVL;
+
+ VPValue *AVLNext;
+ [[maybe_unused]] bool FoundAVLNext =
+ match(AVL, m_VPInstruction<Instruction::PHI>(
+ m_Specific(Plan.getTripCount()), m_VPValue(AVLNext)));
+ assert(FoundAVLNext && "Didn't find AVL backedge?");
+
+ VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
VPBasicBlock *LatchExiting =
HeaderVPBB->getPredecessors()[1]->getEntryBasicBlock();
auto *LatchExitingBr = cast<VPInstruction>(LatchExiting->getTerminator());
if (match(LatchExitingBr, m_BranchOnCond(m_True())))
return;
- assert(match(LatchExitingBr, m_BranchOnCond(m_SpecificCmp(
- CmpInst::ICMP_EQ, m_VPValue(EVLIncrement),
- m_Specific(&Plan.getVectorTripCount())))) &&
- "Expected BranchOnCond with ICmp comparing EVL increment with vector "
- "trip count");
+ [[maybe_unused]] auto *CanIV = cast<VPPhi>(&*EVLPhi->getParent()->begin());
+ assert(
+ match(LatchExitingBr,
+ m_BranchOnCond(m_SpecificCmp(
+ CmpInst::ICMP_EQ, m_Specific(CanIV->getIncomingValue(1)),
+ m_Specific(&Plan.getVectorTripCount())))) &&
+ "Expected BranchOnCond with ICmp comparing CanIV increment with vector "
+ "trip count");
Type *AVLTy = VPTypeAnalysis(Plan).inferScalarType(AVLNext);
VPBuilder Builder(LatchExitingBr);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index e0d09a099647a..16db95df15da6 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -315,12 +315,14 @@ struct VPlanTransforms {
/// variable vector lengths instead of fixed lengths. This transformation:
/// * Makes EVL-Phi concrete.
// * Removes CanonicalIV and increment.
- /// * Replaces the exit condition from
- /// (branch-on-count CanonicalIVInc, VectorTripCount)
- /// to
- /// (branch-on-cond eq AVLNext, 0)
static void canonicalizeEVLLoops(VPlan &Plan);
+ /// Replaces the exit condition from
+ /// (branch-on-count CanonicalIVInc, VectorTripCount)
+ /// to
+ /// (branch-on-cond eq AVLNext, 0)
+ static void convertEVLExitCond(VPlan &Plan);
+
/// Lower abstract recipes to concrete ones, that can be codegen'd.
static void convertToConcreteRecipes(VPlan &Plan);
|
|
@llvm/pr-subscribers-vectorizers Author: Luke Lau (lukel97) ChangesThis is split out from #177114. In order to make canonicalizeEVLLoops a generic "convert to variable stepping" transform, move the code that changes the exit condition to a separate transform. Run it before canonicalizeEVLLoops before VPEVLBasedIVPHIRecipe is expanded. Also relax the assertion for VPInstruction::ExplicitVectorLength to just bail instead, since eventually VPEVLBasedIVPHIRecipe will be used by other loops that aren't EVL tail folded. Full diff: https://github.com/llvm/llvm-project/pull/178181.diff 3 Files Affected:
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 3cf5e5fb3f818..6f0c59bc8f0ea 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7430,6 +7430,8 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
// Expand BranchOnTwoConds after dissolution, when latch has direct access to
// its successors.
VPlanTransforms::expandBranchOnTwoConds(BestVPlan);
+ // Switch the exit condition to AVLNext == 0 for EVL tail folded loops.
+ VPlanTransforms::convertEVLExitCond(BestVPlan);
// Canonicalize EVL loops after regions are dissolved.
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
VPlanTransforms::materializeBackedgeTakenCount(BestVPlan, VectorPH);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index d1d5870d78a03..52dd74baef6ec 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -3247,9 +3247,9 @@ void VPlanTransforms::addExplicitVectorLength(
Plan.setUF(1);
}
-void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
- // Find EVL loop entries by locating VPEVLBasedIVPHIRecipe.
- // There should be only one EVL PHI in the entire plan.
+/// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe.
+/// There should be only one EVL PHI in the entire plan.
+static VPEVLBasedIVPHIRecipe *findEVLPhi(VPlan &Plan) {
VPEVLBasedIVPHIRecipe *EVLPhi = nullptr;
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
@@ -3260,28 +3260,17 @@ void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
EVLPhi = PhiR;
}
+ return EVLPhi;
+}
+
+void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
+ VPEVLBasedIVPHIRecipe *EVLPhi = findEVLPhi(Plan);
// Early return if no EVL PHI is found.
if (!EVLPhi)
return;
VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
VPValue *EVLIncrement = EVLPhi->getBackedgeValue();
- VPValue *AVL;
- [[maybe_unused]] bool FoundAVL =
- match(EVLIncrement,
- m_c_Add(m_ZExtOrSelf(m_EVL(m_VPValue(AVL))), m_Specific(EVLPhi)));
- assert(FoundAVL && "Didn't find AVL?");
-
- // The AVL may be capped to a safe distance.
- VPValue *SafeAVL;
- if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue())))
- AVL = SafeAVL;
-
- VPValue *AVLNext;
- [[maybe_unused]] bool FoundAVLNext =
- match(AVL, m_VPInstruction<Instruction::PHI>(
- m_Specific(Plan.getTripCount()), m_VPValue(AVLNext)));
- assert(FoundAVLNext && "Didn't find AVL backedge?");
// Convert EVLPhi to concrete recipe.
auto *ScalarR =
@@ -3302,21 +3291,45 @@ void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
VPRecipeBase *CanonicalIVIncrement = Backedge->getDefiningRecipe();
CanonicalIVIncrement->eraseFromParent();
CanonicalIV->eraseFromParent();
+}
- // Replace the use of VectorTripCount in the latch-exiting block.
- // Before: (branch-on-cond (icmp eq EVLIVInc, VectorTripCount))
- // After: (branch-on-cond icmp eq AVLNext, 0)
+void VPlanTransforms::convertEVLExitCond(VPlan &Plan) {
+ VPEVLBasedIVPHIRecipe *EVLPhi = findEVLPhi(Plan);
+ if (!EVLPhi)
+ return;
+
+ // Bail if not an EVL tail folded loop.
+ VPValue *AVL;
+ if (!match(EVLPhi->getBackedgeValue(),
+ m_c_Add(m_ZExtOrSelf(m_EVL(m_VPValue(AVL))), m_Specific(EVLPhi))))
+ return;
+
+ // The AVL may be capped to a safe distance.
+ VPValue *SafeAVL;
+ if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue())))
+ AVL = SafeAVL;
+
+ VPValue *AVLNext;
+ [[maybe_unused]] bool FoundAVLNext =
+ match(AVL, m_VPInstruction<Instruction::PHI>(
+ m_Specific(Plan.getTripCount()), m_VPValue(AVLNext)));
+ assert(FoundAVLNext && "Didn't find AVL backedge?");
+
+ VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
VPBasicBlock *LatchExiting =
HeaderVPBB->getPredecessors()[1]->getEntryBasicBlock();
auto *LatchExitingBr = cast<VPInstruction>(LatchExiting->getTerminator());
if (match(LatchExitingBr, m_BranchOnCond(m_True())))
return;
- assert(match(LatchExitingBr, m_BranchOnCond(m_SpecificCmp(
- CmpInst::ICMP_EQ, m_VPValue(EVLIncrement),
- m_Specific(&Plan.getVectorTripCount())))) &&
- "Expected BranchOnCond with ICmp comparing EVL increment with vector "
- "trip count");
+ [[maybe_unused]] auto *CanIV = cast<VPPhi>(&*EVLPhi->getParent()->begin());
+ assert(
+ match(LatchExitingBr,
+ m_BranchOnCond(m_SpecificCmp(
+ CmpInst::ICMP_EQ, m_Specific(CanIV->getIncomingValue(1)),
+ m_Specific(&Plan.getVectorTripCount())))) &&
+ "Expected BranchOnCond with ICmp comparing CanIV increment with vector "
+ "trip count");
Type *AVLTy = VPTypeAnalysis(Plan).inferScalarType(AVLNext);
VPBuilder Builder(LatchExitingBr);
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index e0d09a099647a..16db95df15da6 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -315,12 +315,14 @@ struct VPlanTransforms {
/// variable vector lengths instead of fixed lengths. This transformation:
/// * Makes EVL-Phi concrete.
// * Removes CanonicalIV and increment.
- /// * Replaces the exit condition from
- /// (branch-on-count CanonicalIVInc, VectorTripCount)
- /// to
- /// (branch-on-cond eq AVLNext, 0)
static void canonicalizeEVLLoops(VPlan &Plan);
+ /// Replaces the exit condition from
+ /// (branch-on-count CanonicalIVInc, VectorTripCount)
+ /// to
+ /// (branch-on-cond eq AVLNext, 0)
+ static void convertEVLExitCond(VPlan &Plan);
+
/// Lower abstract recipes to concrete ones, that can be codegen'd.
static void convertToConcreteRecipes(VPlan &Plan);
|
|
cc @eas |
| return; | ||
|
|
||
| assert(match(LatchExitingBr, m_BranchOnCond(m_SpecificCmp( | ||
| CmpInst::ICMP_EQ, m_VPValue(EVLIncrement), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This also fixes this m_VPValue, it should be a m_Specific
| // Expand BranchOnTwoConds after dissolution, when latch has direct access to | ||
| // its successors. | ||
| VPlanTransforms::expandBranchOnTwoConds(BestVPlan); | ||
| // Switch the exit condition to AVLNext == 0 for EVL tail folded loops. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: transform/convert may be more in line with owrding elswhere
| // Switch the exit condition to AVLNext == 0 for EVL tail folded loops. | |
| // Convert the exit condition to AVLNext == 0 for EVL tail folded loops. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed, thanks
| /// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe. | ||
| /// There should be only one EVL PHI in the entire plan. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just to note that now we need to traverse the full VPlan twice if there's no EVL recipe.
would be good if there would a good way to exit early one we can't find a EVL recipe in the header if possible. There's getFirstLoopHeader which works on plain CFG but would require VPDT, which is likely not worth it unless already available.
I think later we assert that the first phi in EVL's parent is a canonical IV, via below. Maybe we could try to check this early, and bail out once we found a block with a canonical IV-like but not a VPEVLBasedIVPHIRecipe recipes. Not sure if we may be able to check if the increment of the phi is used by the expected branch-on-cond.
[[maybe_unused]] auto *CanIV = cast<VPPhi>(&*EVLPhi->getParent()->begin());
assert(
match(LatchExitingBr,
m_BranchOnCond(m_SpecificCmp(
CmpInst::ICMP_EQ, m_Specific(CanIV->getIncomingValue(1)),
m_Specific(&Plan.getVectorTripCount())))) &&
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now that you mention it, we can just do the branch condition transform before the loop regions are dissolved and use getCanonicalIV, the EVL IV will immediately follow it if it exists 0a49ca0
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
moving makes sense, thanks
| /// Replaces the exit condition from | ||
| /// (branch-on-count CanonicalIVInc, VectorTripCount) | ||
| /// to | ||
| /// (branch-on-cond eq AVLNext, 0) | ||
| static void convertEVLExitCond(VPlan &Plan); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: there's no clear order to definitions, but convertEVLExitCond runs before canonicalizeEVLLoops, so might be worth moving first?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed, thanks
* Move to before loop regions are dissolved so we can access the canonical IV easier. * Fix comment * Reorder definition
| return; | ||
| // The EVL IV is always immediately after the canonical IV. | ||
| auto *EVLPhi = | ||
| dyn_cast_or_null<VPEVLBasedIVPHIRecipe>(std::next(CanIV->getIterator())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we enforce the order in the verifier, so relying on it may miss some cases in the future?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I thought we already verified this but apparently not, added in f8952aa. Maybe I had seen an assert for it somewhere else.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be good to check how we retrieve EVL phi in other palces, possibly shairng the logic in a helper, possibly as follow-up.
| /// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe. | ||
| /// There should be only one EVL PHI in the entire plan. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
moving makes sense, thanks
|
|
||
| // The AVL may be capped to a safe distance. | ||
| VPValue *SafeAVL; | ||
| if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue()))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not related to the patch itself, but it might be good to think if we can match something more precise here, in case some transform gets applied to the original select
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I think we can make this more explicit. Will try to do in a follow up.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great thanks!
fhahn
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks
| return false; | ||
| } | ||
| } | ||
| if (const auto *EVLIV = dyn_cast<VPEVLBasedIVPHIRecipe>(&R)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better move to verifyPhiRecipes?
| return; | ||
| // The EVL IV is always immediately after the canonical IV. | ||
| auto *EVLPhi = | ||
| dyn_cast_or_null<VPEVLBasedIVPHIRecipe>(std::next(CanIV->getIterator())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be good to check how we retrieve EVL phi in other palces, possibly shairng the logic in a helper, possibly as follow-up.
| if (!isa_and_nonnull<VPCanonicalIVPHIRecipe>( | ||
| std::prev(EVLIV->getIterator()))) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just a note to myself: this should be fine, because we already verify that the canonical IV is at the beginning of the block, so the EVL based phi cannot be the first element, in which acse std::prev would be UB.
| VPBasicBlock *LatchVPBB); | ||
|
|
||
| /// Replaces the exit condition from | ||
| /// (branch-on-count CanonicalIVInc, VectorTripCount) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this needs updating I think , we are converting branch-on-cond to use a different condition
|
|
||
| // The AVL may be capped to a safe distance. | ||
| VPValue *SafeAVL; | ||
| if (match(AVL, m_Select(m_VPValue(), m_VPValue(SafeAVL), m_VPValue()))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great thanks!
| !isa<VPCanonicalIVPHIRecipe>(LoopRegion->getEntryBasicBlock()->front())) | ||
| return; | ||
| VPCanonicalIVPHIRecipe *CanIV = LoopRegion->getCanonicalIV(); | ||
| if (!CanIV || std::next(CanIV->getIterator()) == CanIV->getParent()->end()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if (!CanIV || std::next(CanIV->getIterator()) == CanIV->getParent()->end()) | |
| if (std::next(CanIV->getIterator()) == CanIV->getParent()->end()) |
After the check above, CanIV should always be != null
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/169/builds/19529 Here is the relevant piece of the build log for the reference |
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/72/builds/17128 Here is the relevant piece of the build log for the reference |
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/95/builds/19938 Here is the relevant piece of the build log for the reference |
This is split out from #177114.
In order to make canonicalizeEVLLoops a generic "convert to variable stepping" transform, move the code that changes the exit condition to a separate transform since not all variable stepping loops will want to transform the exit condition. Run it before canonicalizeEVLLoops before VPEVLBasedIVPHIRecipe is expanded.
Also relax the assertion for VPInstruction::ExplicitVectorLength to just bail instead, since eventually VPEVLBasedIVPHIRecipe will be used by other loops that aren't EVL tail folded.