- Undo previous check and allow loop switch for condtion that is not inside
authorDevang Patel <dpatel@apple.com>
Thu, 28 Jun 2007 02:05:46 +0000 (02:05 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 28 Jun 2007 02:05:46 +0000 (02:05 +0000)
loop.
- Avoid loop unswich for loop header branch.
- While cloning dominators fix typo and handle self dominating blocks.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37772 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnswitch.cpp

index 142299dc9973490a09aafdae17d6a0ec0be39566..157b00916cbf975d8c812c2e3cf51d69860c524b 100644 (file)
@@ -136,13 +136,6 @@ static Value *FindLIVLoopCondition(Value *Cond, Loop *L, bool &Changed) {
   // Constants should be folded, not unswitched on!
   if (isa<Constant>(Cond)) return false;
 
-  // If cond is not in loop then it is not suitable.
-  if (Instruction *I = dyn_cast<Instruction>(Cond))
-    if (!L->contains(I->getParent()))
-      return 0;
-  if (isa<Argument>(Cond))
-    return 0;
-
   // TODO: Handle: br (VARIANT|INVARIANT).
   // TODO: Hoist simple expressions out of loops.
   if (L->isLoopInvariant(Cond)) return Cond;
@@ -173,6 +166,8 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
   // loop.
   for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
        I != E; ++I) {
+    if (*I == L->getHeader())
+      continue;
     TerminatorInst *TI = (*I)->getTerminator();
     if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
       // If this isn't branching on an invariant condition, we can't unswitch
@@ -491,7 +486,11 @@ void CloneDomInfo(BasicBlock *NewBB, BasicBlock *Orig, Loop *L,
       CloneDomInfo(NewIDom, OrigIDom, L, DT, VM);
     NewIDom = cast<BasicBlock>(VM[OrigIDom]);
   }
-  DT->addNewBlock(NewBB, OrigIDom);
+  if (NewBB == NewIDom) {
+    DT->addNewBlock(NewBB, OrigIDom);
+    DT->changeImmediateDominator(NewBB, NewIDom);
+  } else
+    DT->addNewBlock(NewBB, NewIDom);
 }
 
 /// CloneLoop - Recursively clone the specified loop and all of its children,