From 64cd6582238b38a93ff0113409f91ad7ab746f35 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 18 Jun 2008 02:16:38 +0000 Subject: [PATCH] Preserve dominance frontier while trivially unswitching loop. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52438 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnswitch.cpp | 17 ++++++++++++++ .../LoopUnswitch/2008-06-17-DomFrontier.ll | 22 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index e0fb4c614d9..955622e0256 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 00000000000..713a0bddb13 --- /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 ; [#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 ; [#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 ; [#uses=0] + br i1 false, label %bb, label %bb44 +}