[llvm] 2a82c15 - [LV] Consider runtime checks profitable if scalar cost is zero.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 4 13:37:22 PDT 2022
Author: Florian Hahn
Date: 2022-07-04T21:37:16+01:00
New Revision: 2a82c15f63d42cf01e401d533f01adf68c96afdc
URL: https://github.com/llvm/llvm-project/commit/2a82c15f63d42cf01e401d533f01adf68c96afdc
DIFF: https://github.com/llvm/llvm-project/commit/2a82c15f63d42cf01e401d533f01adf68c96afdc.diff
LOG: [LV] Consider runtime checks profitable if scalar cost is zero.
This fixes an UBSan failure after 644a965c1efef. When using
user-provided VFs/ICs (via the force-vector-width /
force-vector-interleave options) the scalar cost is zero, which would
cause divide-by-zero.
When forcing vectorization using the options, the cost of the runtime
checks should not block vectorization.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index b48c3e18def5..cdf9d4d96e94 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7497,7 +7497,9 @@ LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
return VectorizationFactor::Disabled();
// Select the optimal vectorization factor.
- return CM.selectVectorizationFactor(VFCandidates);
+ VectorizationFactor VF = CM.selectVectorizationFactor(VFCandidates);
+ assert((VF.Width.isScalar() || VF.ScalarCost > 0) && "when vectorizing, the scalar cost must be non-zero.");
+ return VF;
}
VPlan &LoopVectorizationPlanner::getBestPlanFor(ElementCount VF) const {
@@ -10259,6 +10261,11 @@ static bool areRuntimeChecksProfitable(GeneratedRTChecks &Checks,
return true;
}
+ // The scalar cost should only be 0 when vectorizing with a user specified VF/IC. In those cases, runtime checks should always be generated.
+ double ScalarC = *VF.ScalarCost.getValue();
+ if (ScalarC == 0)
+ return true;
+
// First, compute the minimum iteration count required so that the vector
// loop outperforms the scalar loop.
// The total cost of the scalar loop is
@@ -10288,7 +10295,6 @@ static bool areRuntimeChecksProfitable(GeneratedRTChecks &Checks,
// the computations are performed on doubles, not integers and the result
// is rounded up, hence we get an upper estimate of the TC.
unsigned IntVF = VF.Width.getKnownMinValue();
- double ScalarC = *VF.ScalarCost.getValue();
double VecCOverVF = double(*VF.Cost.getValue()) / IntVF;
double RtC = *CheckCost.getValue();
double MinTC1 = RtC / (ScalarC - VecCOverVF);
More information about the llvm-commits
mailing list