[Diffusion] rL277877: [LoopSimplify] Fix updating LCSSA after separating nested loops.
Michael Zolotukhin via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 8 17:36:59 PDT 2016
> On Aug 8, 2016, at 11:32 AM, Michael Zolotukhin via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
>>
>> On Aug 8, 2016, at 9:55 AM, Hans Wennborg <hans at chromium.org <mailto: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?
> It can also be exposed with the old PM (I mentioned a way in the comments to that bug). It was just discovered with the new PM.
>>
>> From the PR it also sounds like the original test case still fails?
> I’ll look into it, probably there is more than one issue there. It still might be a good idea to merge this in, as the test from the commit would fail without the fix anyway.
We might wait for a complete fix though. I hope to get it this week.
Michael
>
> Thanks,
> Michael
>
>> 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
>>>>
>>>>
>>>>
>>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160808/d16ca344/attachment.html>
More information about the llvm-commits
mailing list