[PATCH] D109457: [SCEV] Use constant range of RHS to prove NUW on narrow IV in trip count logic

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 13 15:45:53 PDT 2021


efriedma added inline comments.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:11636
+          if (StrideMax == 0)
+            return false;
+
----------------
Why is the `StrideMax == 0` special case necessary?


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:11640
+          const unsigned OuterBitWidth = getTypeSizeInBits(RHS->getType());
+          APInt Limit = APInt::getMaxValue(InnerBitWidth) - StrideMax;
+          Limit = Limit.zext(OuterBitWidth);
----------------
What is `APInt::getMaxValue(InnerBitWidth) - StrideMax` the limit of?

I guess you're looking for the smallest possible value of `AR` at the step before it overflows.  If that value forces the loop to exit, then the loop must exit before the overflow.  A conservative way to figure that is based on the stride itself: just use the smallest value X such that X+Stride might overflow.

A comment would be helpful.

Also, I think you might be off by one here?  `Limit` is one less than the value X I described.  But maybe that cancels out somehow...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D109457/new/

https://reviews.llvm.org/D109457



More information about the llvm-commits mailing list