[PATCH] D74989: [LoopTerminology] Loop Simplify Form

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 23 01:15:10 PST 2020


nikic added inline comments.


================
Comment at: llvm/docs/LoopTerminology.rst:152
+* A preheader.
+* A latch which must also be the only backedge.
+* Dedicated exists. That is, no exit block for the loop
----------------
Meinersbur wrote:
> baziotis wrote:
> > Meinersbur wrote:
> > > [serious] There can be a single latch with multiple edges to the header (e.g. a switch)
> > Like this?
> > ```
> > 3:
> >   // whatever
> >   switch i32 %something, label %whatever [
> >     i32 1, label %3
> >     i32 2, label %3
> >   ]
> > ```
> > In that case though, isn't the doc in `LoopSimplify.h` wrong?
> > "This pass also guarantees that loops will have exactly one backedge."
> > Assuming that a latch is a backedge, I figured it should be the only one, what do I miss?
> The wording should clarify that whether the simplified form implies a single backedge or a single latch (with potentially multiple edges to the header as in your example). Having a look at the implementation:
> ```
> bool Loop::isLoopSimplifyForm() const {
>   // Normal-form loops have a preheader, a single backedge, and all of their
>   // exits have all their predecessors inside the loop.
>   return getLoopPreheader() && getLoopLatch() && hasDedicatedExits();
> }
> 
> /// getLoopLatch - If there is a single latch block for this loop, return it.
> /// A latch block is a block that contains a branch back to the header.
> template <class BlockT, class LoopT>
> BlockT *LoopBase<BlockT, LoopT>::getLoopLatch() const {
>   assert(!isInvalid() && "Loop not in a valid state!");
>   BlockT *Header = getHeader();
>   BlockT *Latch = nullptr;
>   for (const auto Pred : children<Inverse<BlockT *>>(Header)) {
>     if (contains(Pred)) {
>       if (Latch)
>         return nullptr;
>       Latch = Pred;
>     }
>   }
> 
>   return Latch;
> }
> ```
> 
> And from LoopSimplify:
> ```
>   BasicBlock *LoopLatch = L->getLoopLatch();
>   if (!LoopLatch) {
>     ...
>     LoopLatch = insertUniqueBackedgeBlock(L, Preheader, DT, LI, MSSAU);
>     if (LoopLatch)
>       Changed = true;
>   }
> ```
> 
> That is, it requires a single backedge (which implies a single latch). Your example is not in simplified form.
> 
> My wording "There can be a single latch with multiple edges to the header (e.g. a switch)" was not meant to imply that such a case is in simplified form, but that this is possible to happen, i.e. single backedge is not equivalent to single latch.
See also D72519...


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

https://reviews.llvm.org/D74989





More information about the llvm-commits mailing list