[PATCH] D28073: Preserve domtree and loop-simplify for runtime unrolling.

Michael Zolotukhin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 28 12:30:05 PST 2016


mzolotukhin added inline comments.


================
Comment at: lib/Transforms/Utils/LoopUnroll.cpp:55
+static cl::opt<bool>
+UnrollVerifyDomtree("unroll-verify-domtree", cl::init(false), cl::Hidden,
+                    cl::desc("Verify domtree after unrolling"));
----------------
mkuper wrote:
> efriedma wrote:
> > mkuper wrote:
> > > We want to enforce this being on in new tests too, I assume?
> > We probably want this on in new tests, yes, but I have no idea how we would enforce it.  
> In code review, I meant. :-)
Can we make the default value `true` for debug builds (it will match the existing behavior)?


================
Comment at: lib/Transforms/Utils/LoopUnroll.cpp:619
+      if (BB == LatchBlock) {
+        // The latch is special because we emit unconditional branches in
+        // some cases.  Since the latch is always at the bottom of the loop,
----------------
mkuper wrote:
> efriedma wrote:
> > mkuper wrote:
> > > Isn't it the case that when the latch ends with an unconditional branch, that branch is towards the header block?
> > > If so, we should not have any children outside the loop.
> > Maybe this is more clear?  "The latch is special because we can emit an unconditional branch in the unrolled loop even if the original latch block ends in a conditional branch."
> Ah, ok, this makes sense.
> This still looks a bit weird to me, though. Any chance you can give an example of when this ends up different than the nearest common dominator with Latches[0]?
> 
> (Feel free to ignore me - I'm not sure I understand this enough to LGTM it anyway. :-) )
> 
I'm also curious about an example.

Also, this part is not clear to me: "Since the latch is always at the bottom of the loop, new dominator must also be a latch." Why can't a mid-block from the body be a dominator of a cloned latch?



================
Comment at: lib/Transforms/Utils/LoopUnroll.cpp:639-642
-  // FIXME: We only preserve DT info for complete unrolling now. Incrementally
-  // updating domtree after partial loop unrolling should also be easy.
-  if (DT && !CompletelyUnroll)
-    DT->recalculate(*L->getHeader()->getParent());
----------------
Thanks for fixing this!


================
Comment at: lib/Transforms/Utils/LoopUnroll.cpp:644-646
+  if (DT && UnrollVerifyDomtree)
+    DT->verifyDomTree();
+
----------------
Do I understand it correctly that using `-verify-dom-info` wasn't sufficient because of `foldBlockIntoPredecessor`, and that's why we're now introducing `unroll-verify-domtree`?


================
Comment at: lib/Transforms/Utils/LoopUnroll.cpp:700-701
   if (DT) {
-    if (!OuterL && !CompletelyUnroll)
-      OuterL = L;
     if (OuterL) {
----------------
Why can we remove this?


Repository:
  rL LLVM

https://reviews.llvm.org/D28073





More information about the llvm-commits mailing list