Preserve dominance frontier while trivially unswitching loop.
authorDevang Patel <dpatel@apple.com>
Wed, 18 Jun 2008 02:16:38 +0000 (02:16 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 18 Jun 2008 02:16:38 +0000 (02:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52438 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnswitch.cpp
test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll [new file with mode: 0644]

index e0fb4c614d9618566c84753be373bcd657e7aa79..955622e0256c2274efb090c3a29dc113b950680a 100644 (file)
@@ -610,6 +610,23 @@ void LoopUnswitch::UnswitchTrivialCondition(Loop *L, Value *Cond,
     DT->changeImmediateDominator(NewExit, OrigPH);
     DT->changeImmediateDominator(NewPH, OrigPH);
   }
+   
+  if (DF) {
+    // NewExit is now part of NewPH and Loop Header's dominance
+    // frontier.
+    DominanceFrontier::iterator  DFI = DF->find(NewPH);
+    if (DFI != DF->end())
+      DF->addToFrontier(DFI, NewExit);
+    DFI = DF->find(L->getHeader());
+    DF->addToFrontier(DFI, NewExit);
+
+    // ExitBlock does not have successors then NewExit is part of
+    // its dominance frontier.
+    if (succ_begin(ExitBlock) == succ_end(ExitBlock)) {
+      DFI = DF->find(ExitBlock);
+      DF->addToFrontier(DFI, NewExit);
+    }
+  }
   LPM->deleteSimpleAnalysisValue(OrigPH->getTerminator(), L);
   OrigPH->getTerminator()->eraseFromParent();
 
diff --git a/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll b/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll
new file mode 100644 (file)
index 0000000..713a0bd
--- /dev/null
@@ -0,0 +1,22 @@
+; RUN: llvm-as < %s | opt -licm -loop-unswitch -disable-output
+@g_56 = external global i16            ; <i16*> [#uses=2]
+
+define i32 @func_67(i32 %p_68, i8 signext  %p_69, i8 signext  %p_71) nounwind  {
+entry:
+       br label %bb
+bb:            ; preds = %bb44, %entry
+       br label %bb3
+bb3:           ; preds = %bb36, %bb
+       %bothcond = or i1 false, false          ; <i1> [#uses=1]
+       br i1 %bothcond, label %bb29, label %bb19
+bb19:          ; preds = %bb3
+       br i1 false, label %bb36, label %bb29
+bb29:          ; preds = %bb19, %bb3
+       ret i32 0
+bb36:          ; preds = %bb19
+       store i16 0, i16* @g_56, align 2
+       br i1 false, label %bb44, label %bb3
+bb44:          ; preds = %bb44, %bb36
+       %tmp46 = load i16* @g_56, align 2               ; <i16> [#uses=0]
+       br i1 false, label %bb, label %bb44
+}