[Diffusion] rL277877: [LoopSimplify] Fix updating LCSSA after separating nested loops.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 16:50:56 PDT 2016


On Mon, Aug 8, 2016 at 9:55 AM, Hans Wennborg <hans at chromium.org> wrote:

> Can a regular user run into this? The PR talks about the new pass
> manager. I haven't followed along very well, is that (partially)
> enabled by default these days?
>

No; it is not on by default in production in any way at the moment (e.g.
the linker would garbage collect the code when linking clang).

-- Sean Silva


>
> From the PR it also sounds like the original test case still fails?
>
> Thanks,
> Hans
>
> On Fri, Aug 5, 2016 at 3:12 PM, Michael Zolotukhin
> <mzolotukhin at apple.com> wrote:
> > Hi Hans,
> >
> > I think this fix is worth merging to the branch.
> >
> > Thanks,
> > Michael
> >
> >> On Aug 5, 2016, at 3:00 PM, Michael Zolotukhin <mzolotukhin at apple.com>
> wrote:
> >>
> >> mzolotukhin committed rL277877: [LoopSimplify] Fix updating LCSSA after
> separating nested loops..
> >>
> >> [LoopSimplify] Fix updating LCSSA after separating nested loops.
> >>
> >> This fixes PR28825. The problem was that we only checked if a value from
> >> a created inner loop is used in the outer loop, and fixed LCSSA for
> >> them. But we missed to fixup LCSSA for values used in exits of the outer
> >> loop.
> >>
> >>
> >> Files:
> >>  /llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
> >>  /llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
> >>
> >> PATCH
> >>
> >> Index: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
> >> ===================================================================
> >> --- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp  (revision 277876)
> >> +++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp  (revision 277877)
> >> @@ -376,6 +376,21 @@
> >>         }
> >>       }
> >>     }
> >> +    // We also need to check exit blocks of the outer loop - it might
> be using
> >> +    // values from what now became an inner loop.
> >> +    SmallVector<BasicBlock*, 8> ExitBlocks;
> >> +    NewOuter->getExitBlocks(ExitBlocks);
> >> +    for (BasicBlock *ExitBB: ExitBlocks) {
> >> +      for (Instruction &I : *ExitBB) {
> >> +        for (Value *Op : I.operands()) {
> >> +          Instruction *OpI = dyn_cast<Instruction>(Op);
> >> +          if (!OpI || !L->contains(OpI))
> >> +            continue;
> >> +          WorklistSet.insert(OpI);
> >> +        }
> >> +      }
> >> +    }
> >> +
> >>     SmallVector<Instruction *, 8> Worklist(WorklistSet.begin(),
> >>                                            WorklistSet.end());
> >>     formLCSSAForInstructions(Worklist, *DT, *LI);
> >> Index: llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
> >> ===================================================================
> >> --- llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
> (revision 277876)
> >> +++ llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
> (revision 277877)
> >> @@ -1,7 +1,7 @@
> >> ; RUN: opt < %s -lcssa -loop-unroll -S | FileCheck %s
> >> target triple = "x86_64-unknown-linux-gnu"
> >>
> >> -; PR28272
> >> +; PR28272, PR28825
> >> ; When LoopSimplify separates nested loops, it might break LCSSA form:
> values
> >> ; from the original loop might be used in the outer loop. This test
> invokes
> >> ; loop-unroll, which calls loop-simplify before itself. If LCSSA is
> broken
> >> @@ -74,3 +74,35 @@
> >> bb:
> >>   br label %loop2
> >> }
> >> +
> >> +; When LoopSimplify separates nested loops, it might break LCSSA form:
> values
> >> +; from the original loop might be used in exit blocks of the outer
> loop.
> >> +; CHECK-LABEL: @foo3
> >> +define void @foo3() {
> >> +entry:
> >> +  br label %bb1
> >> +
> >> +bb1:
> >> +  br i1 undef, label %bb2, label %bb1
> >> +
> >> +bb2:
> >> +  %a = phi i32 [ undef, %bb1 ], [ %a, %bb3 ], [ undef, %bb5 ]
> >> +  br i1 undef, label %bb3, label %bb1
> >> +
> >> +bb3:
> >> +  %b = load i32*, i32** undef
> >> +  br i1 undef, label %bb2, label %bb4
> >> +
> >> +bb4:
> >> +  br i1 undef, label %bb5, label %bb6
> >> +
> >> +bb5:
> >> +  br i1 undef, label %bb2, label %bb4
> >> +
> >> +bb6:
> >> +  br i1 undef, label %bb_end, label %bb1
> >> +
> >> +bb_end:
> >> +  %x = getelementptr i32, i32* %b
> >> +  br label %bb_end
> >> +}
> >>
> >> Users:
> >>  mzolotukhin (Author)
> >>
> >> https://reviews.llvm.org/rL277877
> >>
> >>
> >>
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160808/c462517b/attachment.html>


More information about the llvm-commits mailing list