LLVM API Documentation
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 }