[llvm] [LLVM][LV] Improve UF calculation for vscale based scalar loops. (PR #146102)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 28 03:14:18 PDT 2025


================
@@ -418,7 +420,26 @@ static bool hasIrregularType(Type *Ty, const DataLayout &DL) {
 /// ElementCount to include loops whose trip count is a function of vscale.
 static ElementCount getSmallConstantTripCount(ScalarEvolution *SE,
                                               const Loop *L) {
-  return ElementCount::getFixed(SE->getSmallConstantTripCount(L));
+  if (unsigned ExpectedTC = SE->getSmallConstantTripCount(L))
+    return ElementCount::getFixed(ExpectedTC);
+
+  const SCEV *BTC = SE->getBackedgeTakenCount(L);
+
+  if (isa<SCEVCouldNotCompute>(BTC))
+    return ElementCount::getFixed(0);
+
+  const SCEV *ExitCount = SE->getTripCountFromExitCount(BTC, BTC->getType(), L);
+
+  if (isa<SCEVVScale>(ExitCount))
+    return ElementCount::getScalable(1);
+
+  const APInt *Scale;
+  if (match(ExitCount, m_scev_Mul(m_scev_APInt(Scale), m_SCEVVScale())))
+    if (cast<SCEVMulExpr>(ExitCount)->hasNoUnsignedWrap())
+      if (Scale->getActiveBits() <= 32)
----------------
fhahn wrote:

```suggestion
    if (cast<SCEVMulExpr>(ExitCount)->hasNoUnsignedWrap() && Scale->getActiveBits() <= 32)
```

or could even fold with the if above.

https://github.com/llvm/llvm-project/pull/146102


More information about the llvm-commits mailing list