[VPlan] Remove CanonicalIV when dissolving loop regions (NFC).#142372
[VPlan] Remove CanonicalIV when dissolving loop regions (NFC).#142372
Conversation
Directly replace the canonical IV when we dissolve the containing region. That ensures that it won't get removed before the region gets removed, which would result in an invalid region. This removes the current ordering constraint between convertToConcreteRecipes and dissolving regions.
|
@llvm/pr-subscribers-vectorizers @llvm/pr-subscribers-llvm-transforms Author: Florian Hahn (fhahn) ChangesDirectly replace the canonical IV when we dissolve the containing region. That ensures that it won't get removed before the region gets removed, which would result in an invalid region. This removes the current ordering constraint between convertToConcreteRecipes and dissolving regions. 2 Files Affected:
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 165b57c87beb1..2580031c9186b 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -883,6 +883,16 @@ void VPRegionBlock::print(raw_ostream &O, const Twine &Indent,
void VPRegionBlock::dissolveToCFGLoop() {
auto *Header = cast<VPBasicBlock>(getEntry());
+ if (auto *CanIV = dyn_cast<VPCanonicalIVPHIRecipe>(&Header->front())) {
+ assert(this == getPlan()->getVectorLoopRegion() &&
+ "Canonical IV must be in the entry of the top-level loop region");
+ auto *ScalarR = Builder(CanIV).createScalarPhi(
+ {CanIV->getStartValue(), CanIV->getBackedgeValue()},
+ CanIV->getDebugLoc(), "index");
+ CanIV->replaceAllUsesWith(ScalarR);
+ CanIV->eraseFromParent();
+ }
+
VPBlockBase *Preheader = getSinglePredecessor();
auto *ExitingLatch = cast<VPBasicBlock>(getExiting());
VPBlockBase *Middle = getSingleSuccessor();
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 5b42a9056b69e..5c6d7b0c5b529 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -2601,14 +2601,10 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan,
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
vp_depth_first_deep(Plan.getEntry()))) {
for (VPRecipeBase &R : make_early_inc_range(*VPBB)) {
- if (isa<VPCanonicalIVPHIRecipe, VPEVLBasedIVPHIRecipe>(&R)) {
- auto *PhiR = cast<VPHeaderPHIRecipe>(&R);
- StringRef Name =
- isa<VPCanonicalIVPHIRecipe>(PhiR) ? "index" : "evl.based.iv";
- VPBuilder Builder(PhiR);
- auto *ScalarR = Builder.createScalarPhi(
+ if (auto *PhiR = dyn_cast<VPEVLBasedIVPHIRecipe>(&R)) {
+ auto *ScalarR = Builder(PhiR).createScalarPhi(
{PhiR->getStartValue(), PhiR->getBackedgeValue()},
- PhiR->getDebugLoc(), Name);
+ PhiR->getDebugLoc(), "evl.based.iv");
PhiR->replaceAllUsesWith(ScalarR);
ToRemove.push_back(PhiR);
continue;
|
| void VPRegionBlock::dissolveToCFGLoop() { | ||
| auto *Header = cast<VPBasicBlock>(getEntry()); | ||
| if (auto *CanIV = dyn_cast<VPCanonicalIVPHIRecipe>(&Header->front())) { | ||
| assert(this == getPlan()->getVectorLoopRegion() && |
There was a problem hiding this comment.
Just an idea, alternatively it could also be replaced in VPlanTransforms::dissolveLoopRegions where you could get it directly from getCanonicalIV()?
There was a problem hiding this comment.
Yep that would also do the trick, but doing it here has the advantage it cannot be missed by potential other users
|
Looks like there are build failures: |
fhahn
left a comment
There was a problem hiding this comment.
Looks like there are build failures:
C:\ws\src\llvm\lib\Transforms\Vectorize\VPlan.cpp(889): error C3861: 'Builder': identifier not found C:\ws\src\llvm\lib\Transforms\Vectorize\VPlan.cpp(892): error C3536: 'ScalarR': cannot be used before it is initialized C:\ws\src\llvm\lib\Transforms\Vectorize\VPlan.cpp(892): error C2664: 'void llvm::VPValue::replaceAllUsesWith(llvm::VPValue *)': cannot convert argument 1 from 'int' to 'llvm::VPValue *' C:\ws\src\llvm\lib\Transforms\Vectorize\VPlan.cpp(892): note: Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast C:\ws\src\llvm\lib\Transforms\Vectorize\VPlanValue.h(156): note: see declaration of 'llvm::VPValue::replaceAllUsesWith'
Thanks, windows build failure should be fixed
| void VPRegionBlock::dissolveToCFGLoop() { | ||
| auto *Header = cast<VPBasicBlock>(getEntry()); | ||
| if (auto *CanIV = dyn_cast<VPCanonicalIVPHIRecipe>(&Header->front())) { | ||
| assert(this == getPlan()->getVectorLoopRegion() && |
There was a problem hiding this comment.
Yep that would also do the trick, but doing it here has the advantage it cannot be missed by potential other users
…FC). (#142372) Directly replace the canonical IV when we dissolve the containing region. That ensures that it won't get removed before the region gets removed, which would result in an invalid region. This removes the current ordering constraint between convertToConcreteRecipes and dissolving regions. PR: llvm/llvm-project#142372
|
Post-commit follow-up comment: this raises the thought of coupling |
Directly replace the canonical IV when we dissolve the containing region. That ensures that it won't get removed before the region gets removed, which would result in an invalid region.
This removes the current ordering constraint between convertToConcreteRecipes and dissolving regions.