aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/LoopUnswitch.cpp17
-rw-r--r--test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll22
2 files changed, 39 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp
index e0fb4c614d..955622e025 100644
--- a/lib/Transforms/Scalar/LoopUnswitch.cpp
+++ b/lib/Transforms/Scalar/LoopUnswitch.cpp
@@ -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
index 0000000000..713a0bddb1
--- /dev/null
+++ b/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll
@@ -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
+}