diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/VPlanTransforms.h | 3 |
3 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 6dd04ae..f156cb8 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -8536,8 +8536,10 @@ void LoopVectorizationPlanner::buildVPlansWithVPRecipes(ElementCount MinVF, *Plan, CM.getMinimalBitwidths(), PSE.getSE()->getContext()); VPlanTransforms::optimize(*Plan, *PSE.getSE()); // TODO: try to put it close to addActiveLaneMask(). - if (CM.foldTailWithEVL()) - VPlanTransforms::addExplicitVectorLength(*Plan); + // Discard the plan if it is not EVL-compatible + if (CM.foldTailWithEVL() && + !VPlanTransforms::tryAddExplicitVectorLength(*Plan)) + break; assert(verifyVPlanIsValid(*Plan) && "VPlan is invalid"); VPlans.push_back(std::move(Plan)); } diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index 7ff8d8e..422579e 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -1318,8 +1318,16 @@ void VPlanTransforms::addActiveLaneMask( /// %NextEVLIV = add IVSize (cast i32 %VPEVVL to IVSize), %EVLPhi /// ... /// -void VPlanTransforms::addExplicitVectorLength(VPlan &Plan) { +bool VPlanTransforms::tryAddExplicitVectorLength(VPlan &Plan) { VPBasicBlock *Header = Plan.getVectorLoopRegion()->getEntryBasicBlock(); + // The transform updates all users of inductions to work based on EVL, instead + // of the VF directly. At the moment, widened inductions cannot be updated, so + // bail out if the plan contains any. + if (any_of(Header->phis(), [](VPRecipeBase &Phi) { + return (isa<VPWidenIntOrFpInductionRecipe>(&Phi) || + isa<VPWidenPointerInductionRecipe>(&Phi)); + })) + return false; auto *CanonicalIVPHI = Plan.getCanonicalIV(); VPValue *StartV = CanonicalIVPHI->getStartValue(); @@ -1377,6 +1385,7 @@ void VPlanTransforms::addExplicitVectorLength(VPlan &Plan) { CanonicalIVIncrement->setOperand(0, CanonicalIVPHI); // TODO: support unroll factor > 1. Plan.setUF(1); + return true; } void VPlanTransforms::dropPoisonGeneratingRecipes( diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h index 0cbc707..96b8a66 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h @@ -104,7 +104,8 @@ struct VPlanTransforms { /// VPCanonicalIVPHIRecipe with a VPEVLBasedIVPHIRecipe. /// VPCanonicalIVPHIRecipe is only used to control the loop after /// this transformation. - static void addExplicitVectorLength(VPlan &Plan); + /// \returns true if the transformation succeeds, or false if it doesn't. + static bool tryAddExplicitVectorLength(VPlan &Plan); }; } // namespace llvm |
