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

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 09:55:16 PDT 2016


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?

>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
>>
>>
>>
>


More information about the llvm-commits mailing list