[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