[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp

Devang Patel dpatel at apple.com
Wed Jun 27 19:06:09 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

LoopUnswitch.cpp updated: 1.72 -> 1.73
---
Log message:

- Undo previous check and allow loop switch for condtion that is not inside
loop.
- Avoid loop unswich for loop header branch.
- While cloning dominators fix typo and handle self dominating blocks.


---
Diffs of the changes:  (+7 -8)

 LoopUnswitch.cpp |   15 +++++++--------
 1 files changed, 7 insertions(+), 8 deletions(-)


Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.72 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.73
--- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.72	Wed Jun 27 19:49:00 2007
+++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp	Wed Jun 27 21:05:46 2007
@@ -136,13 +136,6 @@
   // 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 @@
   // 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 @@
       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,






More information about the llvm-commits mailing list