LLVM API Documentation

CloneLoop.cpp

Go to the documentation of this file.
00001 //===- CloneLoop.cpp - Clone loop nest ------------------------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file implements the CloneLoop interface which makes a copy of a loop.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "llvm/Transforms/Utils/Cloning.h"
00015 #include "llvm/BasicBlock.h"
00016 #include "llvm/Analysis/LoopPass.h"
00017 #include "llvm/Analysis/Dominators.h"
00018 #include "llvm/ADT/DenseMap.h"
00019 
00020 
00021 using namespace llvm;
00022 
00023 /// CloneDominatorInfo - Clone basicblock's dominator tree and, if available,
00024 /// dominance info. It is expected that basic block is already cloned.
00025 static void CloneDominatorInfo(BasicBlock *BB, 
00026                                DenseMap<const Value *, Value *> &ValueMap,
00027                                DominatorTree *DT,
00028                                DominanceFrontier *DF) {
00029 
00030   assert (DT && "DominatorTree is not available");
00031   DenseMap<const Value *, Value*>::iterator BI = ValueMap.find(BB);
00032   assert (BI != ValueMap.end() && "BasicBlock clone is missing");
00033   BasicBlock *NewBB = cast<BasicBlock>(BI->second);
00034 
00035   // NewBB already got dominator info.
00036   if (DT->getNode(NewBB))
00037     return;
00038 
00039   assert (DT->getNode(BB) && "BasicBlock does not have dominator info");
00040   // Entry block is not expected here. Infinite loops are not to cloned.
00041   assert (DT->getNode(BB)->getIDom() && "BasicBlock does not have immediate dominator");
00042   BasicBlock *BBDom = DT->getNode(BB)->getIDom()->getBlock();
00043 
00044   // NewBB's dominator is either BB's dominator or BB's dominator's clone.
00045   BasicBlock *NewBBDom = BBDom;
00046   DenseMap<const Value *, Value*>::iterator BBDomI = ValueMap.find(BBDom);
00047   if (BBDomI != ValueMap.end()) {
00048     NewBBDom = cast<BasicBlock>(BBDomI->second);
00049     if (!DT->getNode(NewBBDom))
00050       CloneDominatorInfo(BBDom, ValueMap, DT, DF);
00051   }
00052   DT->addNewBlock(NewBB, NewBBDom);
00053 
00054   // Copy cloned dominance frontiner set
00055   if (DF) {
00056     DominanceFrontier::DomSetType NewDFSet;
00057     DominanceFrontier::iterator DFI = DF->find(BB);
00058     if ( DFI != DF->end()) {
00059       DominanceFrontier::DomSetType S = DFI->second;
00060         for (DominanceFrontier::DomSetType::iterator I = S.begin(), E = S.end();
00061              I != E; ++I) {
00062           BasicBlock *DB = *I;
00063           DenseMap<const Value*, Value*>::iterator IDM = ValueMap.find(DB);
00064           if (IDM != ValueMap.end())
00065             NewDFSet.insert(cast<BasicBlock>(IDM->second));
00066           else
00067             NewDFSet.insert(DB);
00068         }
00069     }
00070     DF->addBasicBlock(NewBB, NewDFSet);
00071   }
00072 }
00073 
00074 /// CloneLoop - Clone Loop. Clone dominator info. Populate ValueMap
00075 /// using old blocks to new blocks mapping.
00076 Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager  *LPM, LoopInfo *LI,
00077                       DenseMap<const Value *, Value *> &ValueMap, Pass *P) {
00078   
00079   DominatorTree *DT = NULL;
00080   DominanceFrontier *DF = NULL;
00081   if (P) {
00082     DT = P->getAnalysisIfAvailable<DominatorTree>();
00083     DF = P->getAnalysisIfAvailable<DominanceFrontier>();
00084   }
00085 
00086   SmallVector<BasicBlock *, 16> NewBlocks;
00087 
00088   // Populate loop nest.
00089   SmallVector<Loop *, 8> LoopNest;
00090   LoopNest.push_back(OrigL);
00091 
00092 
00093   Loop *NewParentLoop = NULL;
00094   while (!LoopNest.empty()) {
00095     Loop *L = LoopNest.back();
00096     LoopNest.pop_back();
00097     Loop *NewLoop = new Loop();
00098 
00099     if (!NewParentLoop)
00100       NewParentLoop = NewLoop;
00101 
00102     LPM->insertLoop(NewLoop, L->getParentLoop());
00103 
00104     // Clone Basic Blocks.
00105     for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
00106          I != E; ++I) {
00107       BasicBlock *BB = *I;
00108       BasicBlock *NewBB = CloneBasicBlock(BB, ValueMap, ".clone");
00109       ValueMap[BB] = NewBB;
00110       if (P)
00111         LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
00112       NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
00113       NewBlocks.push_back(NewBB);
00114     }
00115 
00116     // Clone dominator info.
00117     if (DT)
00118       for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
00119            I != E; ++I) {
00120         BasicBlock *BB = *I;
00121         CloneDominatorInfo(BB, ValueMap, DT, DF);
00122       }
00123 
00124     // Process sub loops
00125     for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
00126       LoopNest.push_back(*I);
00127   }
00128 
00129   // Remap instructions to reference operands from ValueMap.
00130   for(SmallVector<BasicBlock *, 16>::iterator NBItr = NewBlocks.begin(), 
00131         NBE = NewBlocks.end();  NBItr != NBE; ++NBItr) {
00132     BasicBlock *NB = *NBItr;
00133     for(BasicBlock::iterator BI = NB->begin(), BE = NB->end(); 
00134         BI != BE; ++BI) {
00135       Instruction *Insn = BI;
00136       for (unsigned index = 0, num_ops = Insn->getNumOperands(); 
00137            index != num_ops; ++index) {
00138         Value *Op = Insn->getOperand(index);
00139         DenseMap<const Value *, Value *>::iterator OpItr = ValueMap.find(Op);
00140         if (OpItr != ValueMap.end())
00141           Insn->setOperand(index, OpItr->second);
00142       }
00143     }
00144   }
00145 
00146   BasicBlock *Latch = OrigL->getLoopLatch();
00147   Function *F = Latch->getParent();
00148   F->getBasicBlockList().insert(OrigL->getHeader(), 
00149                                 NewBlocks.begin(), NewBlocks.end());
00150 
00151 
00152   return NewParentLoop;
00153 }