[PATCH] D47624: [PM/LoopUnswitch] Fix PR37651 by correctly invalidating SCEV when unswitching loops.

Max Kazantsev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 8 22:59:21 PDT 2018


mkazantsev added inline comments.


================
Comment at: llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp:359
+    if (OuterL)
+      SE->forgetLoop(OuterL);
+    else
----------------
chandlerc wrote:
> mkazantsev wrote:
> > Why it is enough? Imagine that you have
> >   for (...) { // Loop 1
> >     for (...) { // Loop 2
> >       for (...) { // Loop 3
> >         ...
> >        }
> >     }
> >   }
> > 
> > Let `L` be Loop 3 and all exits from `L` lead to Loop 2. Then, if I understand the code correctly, OuterL will be found as Loop 2 and we invalidate it (and its internals). But what if what we are going to do with Loop 3 also affects trip count in Loop 1?
> Do you know how to build such a test case? I wasn't able to craft anything, but I'm not a SCEV expert.
Not sure how to construct a test that will fail an assert, however the general idea is that, for example, a block that goes to method exit from the innermost look is also an exiting block for all its containing loops, up to the topmost parent. It means that this exiting block may be considered for iter count calculation for all those loops. From this point of view, there is no practical difference between the immediate parent and any other top loop.




Repository:
  rL LLVM

https://reviews.llvm.org/D47624





More information about the llvm-commits mailing list