[PATCH] D103991: [SCEV] Extend mustprogress reasoning to ne exit tests

Max Kazantsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 9 21:32:27 PDT 2021


mkazantsev requested changes to this revision.
mkazantsev added a comment.
This revision now requires changes to proceed.

Please add tests for this this exit doesn't dominate the latch.



================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:7918
+  //   caused this exit to be taken previously.  Thus, this exit is
+  //   dynamically dead.
+  // * If this is the sole exit, then a dead exit implies the loop
----------------
It is only true if this condition dominates the latch. If not, it might exit at some point during the iteration space, but it was guarded by a volatile condition that prevented it. If my understanding is correct, please specify this requirement explicitly in function's comment.

Maybe (I'm not sure) this still holds for non-dominating exits if it is the only exit from the loop.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:7931
+
+  auto *Stride = IV->getStepRecurrence(*this);
+  auto *StrideC = dyn_cast<SCEVConstant>(Stride);
----------------
Please add early bail if IV is not affine. This will save compile time for complex addrecs.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:7933
+  auto *StrideC = dyn_cast<SCEVConstant>(Stride);
+  if (!StrideC || !StrideC->getAPInt().isPowerOf2())
+    return SCEV::FlagAnyWrap;
----------------
How about negative powers of 2? I think all your reasoning validly applies for them too.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:7942
+
+  if (ICmpInst::isEquality(Pred))
+    return SCEV::FlagNW;
----------------
This should go before anything else to save compile time.


================
Comment at: llvm/test/Analysis/ScalarEvolution/ne-overflow.ll:10
+
+; CHECK: Determining loop execution counts for: @test
+; CHECK: Loop %for.body: backedge-taken count is ((-2 + %N) /u 2)
----------------
Please use ./utils/update_analyze_test_checks.py. It works well with SCEV.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D103991



More information about the llvm-commits mailing list