[llvm] r277946 - Revert "Revert "[LoopSimplify] Fix updating LCSSA after separating nested loops.""

Michael Zolotukhin via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 6 18:56:54 PDT 2016


Author: mzolotukhin
Date: Sat Aug  6 20:56:54 2016
New Revision: 277946

URL: http://llvm.org/viewvc/llvm-project?rev=277946&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
    llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll

Modified: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp?rev=277946&r1=277945&r2=277946&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Sat Aug  6 20:56:54 2016
@@ -376,6 +376,21 @@ static Loop *separateNestedLoop(Loop *L,
         }
       }
     }
+    // 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);

Modified: llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll?rev=277946&r1=277945&r2=277946&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll (original)
+++ llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll Sat Aug  6 20:56:54 2016
@@ -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
+}




More information about the llvm-commits mailing list