diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 55cc801e91452..727098bd19a56 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -3244,11 +3244,9 @@ bool LoopVectorizationCostModel::isScalarWithPredication( // TODO: Fold into LoopVectorizationLegality::isMaskRequired. bool LoopVectorizationCostModel::isPredicatedInst(Instruction *I) const { - // If predication is not needed, avoid it. // TODO: We can use the loop-preheader as context point here and get // context sensitive reasoning for isSafeToSpeculativelyExecute. - if (!blockNeedsPredicationForAnyReason(I->getParent()) || - isSafeToSpeculativelyExecute(I) || + if (isSafeToSpeculativelyExecute(I) || (isa(I) && !Legal->isMaskRequired(I)) || isa(I)) return false; @@ -3258,6 +3256,10 @@ bool LoopVectorizationCostModel::isPredicatedInst(Instruction *I) const { if (Legal->blockNeedsPredication(I->getParent())) return true; + // If we're not folding the tail by masking, predication is unnecessary. + if (!foldTailByMasking()) + return false; + // All that remain are instructions with side-effects originally executed in // the loop unconditionally, but now execute under a tail-fold mask (only) // having at least one active lane (the first). If the side-effects of the