[PATCH] D100004: [SCEV] Correct handling of recurrences matched in partially unreachable code (try 2)

Philip Reames via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 13 15:03:33 PDT 2021


reames added inline comments.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:5675
   auto *L = LI.getLoopFor(P->getParent());
-  assert(L && L->getHeader() == P->getParent());
-  if (!L->contains(BO->getParent()))
+  if (!L || L->getHeader() != P->getParent())
+    // If we have unreachable blocks involved, then dominance collapses and
----------------
mkazantsev wrote:
> reames wrote:
> > mkazantsev wrote:
> > > Do we have a guarantee of having no loops in unreachable code?
> > See LoopInfoBase<>::analyze specififically the line:
> > DomTree.isReachableFromEntry(Backedge))
> > 
> > Note that the verify routine also checks against a newly constructed LI, so any failure to update should be caught in a expensive asserts run.
> But expensive verification runs between the passes. It is still possible that some pass makes a loop unreachable in the middle of the transform and does not immediately destroy the loop while continuing to use SCEV.
> 
> I am still strongly leaning towards not relying on such things, even if they might be correct. It's far from obvious and far from simple.
Passes that rely on running with partially corrupt analyzes are buggy.  We should find and fix them.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100004



More information about the llvm-commits mailing list