diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-02-10 23:26:14 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-02-10 23:26:14 +0000 | 
| commit | f1b151684da743e73558e640cb3ed0b2deb50183 (patch) | |
| tree | d499a7f993316b9985419c44ec387e12ef26d442 /llvm/lib/Transforms | |
| parent | fe4151efe70b125b235ca3fe4f1bff8e0ca90ee5 (diff) | |
| download | bcm5719-llvm-f1b151684da743e73558e640cb3ed0b2deb50183.tar.gz bcm5719-llvm-f1b151684da743e73558e640cb3ed0b2deb50183.zip | |
Update PHI nodes in successors of exit blocks.
llvm-svn: 26113
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 39 | 
1 files changed, 34 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index ac64a9e5514..15e1d992f85 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -256,6 +256,16 @@ bool LoopUnswitch::visitLoop(Loop *L) {    // loop.    for (Loop::block_iterator I = L->block_begin(), E = L->block_end();         I != E; ++I) { +    for (BasicBlock::iterator BBI = (*I)->begin(), E = (*I)->end();  +         BBI != E; ++BBI) +      if (SelectInst *SI = dyn_cast<SelectInst>(BBI)) { +        Value *LoopCond = FindLIVLoopCondition(SI->getCondition(), L, Changed); +        if (LoopCond == 0) continue; +         +        //if (UnswitchIfProfitable(LoopCond,  +        std::cerr << "LOOP INVARIANT SELECT: " << *SI; +      } +              TerminatorInst *TI = (*I)->getTerminator();      // FIXME: Handle invariant select instructions. @@ -523,13 +533,32 @@ void LoopUnswitch::VersionLoop(Value *LIC, Loop *L, Loop *&Out1, Loop *&Out2) {    // Now we create the new Loop object for the versioned loop.    Loop *NewLoop = CloneLoop(L, L->getParentLoop(), ValueMap, LI); -  if (Loop *Parent = L->getParentLoop()) { +  Loop *ParentLoop = L->getParentLoop(); +  if (ParentLoop) {      // Make sure to add the cloned preheader and exit blocks to the parent loop      // as well. -    Parent->addBasicBlockToLoop(NewBlocks[0], *LI); -    for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) -      Parent->addBasicBlockToLoop(cast<BasicBlock>(ValueMap[ExitBlocks[i]]), -                                  *LI); +    ParentLoop->addBasicBlockToLoop(NewBlocks[0], *LI); +  } +   +  for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) { +    BasicBlock *NewExit = cast<BasicBlock>(ValueMap[ExitBlocks[i]]); +    if (ParentLoop) +      ParentLoop->addBasicBlockToLoop(cast<BasicBlock>(NewExit), *LI); +     +    assert(NewExit->getTerminator()->getNumSuccessors() == 1 && +           "Exit block should have been split to have one successor!"); +    BasicBlock *ExitSucc = NewExit->getTerminator()->getSuccessor(0); +     +    // If the successor of the exit block had PHI nodes, add an entry for +    // NewExit. +    PHINode *PN; +    for (BasicBlock::iterator I = ExitSucc->begin(); +         (PN = dyn_cast<PHINode>(I)); ++I) { +      Value *V = PN->getIncomingValueForBlock(ExitBlocks[i]); +      std::map<const Value *, Value*>::iterator It = ValueMap.find(V); +      if (It != ValueMap.end()) V = It->second; +      PN->addIncoming(V, NewExit); +    }    }    // Rewrite the code to refer to itself. | 

