[Diffusion] rL277877: [LoopSimplify] Fix updating LCSSA after separating nested loops.
Michael Zolotukhin via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 5 15:12:08 PDT 2016
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