From 442b82f0ebeaa33e9ab705a4328c0dac89abbdd8 Mon Sep 17 00:00:00 2001 From: Michael Zolotukhin Date: Sun, 7 Aug 2016 01:56:54 +0000 Subject: [PATCH] Revert "Revert "[LoopSimplify] Fix updating LCSSA after separating nested loops."" This reverts commit r277901. Reaaply the commit as it looks like it has nothing to do with the bots failures. llvm-svn: 277946 --- llvm/lib/Transforms/Utils/LoopSimplify.cpp | 15 ++++++++++++ llvm/test/Transforms/LoopSimplify/pr28272.ll | 34 +++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Utils/LoopSimplify.cpp b/llvm/lib/Transforms/Utils/LoopSimplify.cpp index 2846e8f..fc5781f 100644 --- a/llvm/lib/Transforms/Utils/LoopSimplify.cpp +++ b/llvm/lib/Transforms/Utils/LoopSimplify.cpp @@ -376,6 +376,21 @@ static Loop *separateNestedLoop(Loop *L, BasicBlock *Preheader, } } } + // We also need to check exit blocks of the outer loop - it might be using + // values from what now became an inner loop. + SmallVector ExitBlocks; + NewOuter->getExitBlocks(ExitBlocks); + for (BasicBlock *ExitBB: ExitBlocks) { + for (Instruction &I : *ExitBB) { + for (Value *Op : I.operands()) { + Instruction *OpI = dyn_cast(Op); + if (!OpI || !L->contains(OpI)) + continue; + WorklistSet.insert(OpI); + } + } + } + SmallVector Worklist(WorklistSet.begin(), WorklistSet.end()); formLCSSAForInstructions(Worklist, *DT, *LI); diff --git a/llvm/test/Transforms/LoopSimplify/pr28272.ll b/llvm/test/Transforms/LoopSimplify/pr28272.ll index 49990f9..e59d763 100644 --- a/llvm/test/Transforms/LoopSimplify/pr28272.ll +++ b/llvm/test/Transforms/LoopSimplify/pr28272.ll @@ -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 @@ loop2.if.false: 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 +} -- 2.7.4