diff options
| author | Devang Patel <dpatel@apple.com> | 2007-06-28 02:05:46 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2007-06-28 02:05:46 +0000 |
| commit | 6ba5ad482fd0610364eafc5000ad71df55b5bcfb (patch) | |
| tree | 4bdb7cee571e6f1cf726918136200a74ca2dcce2 /llvm/lib/Transforms | |
| parent | 3304e469f76044ca09c290b7739c97c1035b0420 (diff) | |
| download | bcm5719-llvm-6ba5ad482fd0610364eafc5000ad71df55b5bcfb.tar.gz bcm5719-llvm-6ba5ad482fd0610364eafc5000ad71df55b5bcfb.zip | |
- 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.
llvm-svn: 37772
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index 142299dc997..157b00916cb 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -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, |

