[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