blob: 38928dc7cc88643f8d84c37a2906746b3c0da06f [file] [log] [blame]
Devang Patel4bc2a0b2007-08-10 17:59:47 +00001//===- CloneLoop.cpp - Clone loop nest ------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Devang Patel4bc2a0b2007-08-10 17:59:47 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the CloneLoop interface which makes a copy of a loop.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Transforms/Utils/Cloning.h"
15#include "llvm/BasicBlock.h"
16#include "llvm/Analysis/LoopPass.h"
17#include "llvm/Analysis/Dominators.h"
18#include "llvm/ADT/DenseMap.h"
19
20
21using namespace llvm;
22
23/// CloneDominatorInfo - Clone basicblock's dominator tree and, if available,
24/// dominance info. It is expected that basic block is already cloned.
25static void CloneDominatorInfo(BasicBlock *BB,
26 DenseMap<const Value *, Value *> &ValueMap,
27 DominatorTree *DT,
28 DominanceFrontier *DF) {
29
30 assert (DT && "DominatorTree is not available");
31 DenseMap<const Value *, Value*>::iterator BI = ValueMap.find(BB);
32 assert (BI != ValueMap.end() && "BasicBlock clone is missing");
33 BasicBlock *NewBB = cast<BasicBlock>(BI->second);
34
35 // NewBB already got dominator info.
36 if (DT->getNode(NewBB))
37 return;
38
39 assert (DT->getNode(BB) && "BasicBlock does not have dominator info");
40 // Entry block is not expected here. Infinite loops are not to cloned.
41 assert (DT->getNode(BB)->getIDom() && "BasicBlock does not have immediate dominator");
42 BasicBlock *BBDom = DT->getNode(BB)->getIDom()->getBlock();
43
44 // NewBB's dominator is either BB's dominator or BB's dominator's clone.
45 BasicBlock *NewBBDom = BBDom;
46 DenseMap<const Value *, Value*>::iterator BBDomI = ValueMap.find(BBDom);
47 if (BBDomI != ValueMap.end()) {
48 NewBBDom = cast<BasicBlock>(BBDomI->second);
49 if (!DT->getNode(NewBBDom))
50 CloneDominatorInfo(BBDom, ValueMap, DT, DF);
51 }
52 DT->addNewBlock(NewBB, NewBBDom);
53
54 // Copy cloned dominance frontiner set
55 if (DF) {
56 DominanceFrontier::DomSetType NewDFSet;
57 DominanceFrontier::iterator DFI = DF->find(BB);
58 if ( DFI != DF->end()) {
59 DominanceFrontier::DomSetType S = DFI->second;
60 for (DominanceFrontier::DomSetType::iterator I = S.begin(), E = S.end();
61 I != E; ++I) {
62 BasicBlock *DB = *I;
63 DenseMap<const Value*, Value*>::iterator IDM = ValueMap.find(DB);
64 if (IDM != ValueMap.end())
65 NewDFSet.insert(cast<BasicBlock>(IDM->second));
66 else
67 NewDFSet.insert(DB);
68 }
69 }
70 DF->addBasicBlock(NewBB, NewDFSet);
71 }
72}
73
74/// CloneLoop - Clone Loop. Clone dominator info. Populate ValueMap
75/// using old blocks to new blocks mapping.
76Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
77 DenseMap<const Value *, Value *> &ValueMap, Pass *P) {
78
79 DominatorTree *DT = NULL;
80 DominanceFrontier *DF = NULL;
81 if (P) {
Duncan Sands1465d612009-01-28 13:14:17 +000082 DT = P->getAnalysisIfAvailable<DominatorTree>();
83 DF = P->getAnalysisIfAvailable<DominanceFrontier>();
Devang Patel4bc2a0b2007-08-10 17:59:47 +000084 }
85
86 SmallVector<BasicBlock *, 16> NewBlocks;
Devang Patel4bc2a0b2007-08-10 17:59:47 +000087
Devang Patel4f5d78e2007-08-14 23:59:17 +000088 // Populate loop nest.
89 SmallVector<Loop *, 8> LoopNest;
90 LoopNest.push_back(OrigL);
91
92
93 Loop *NewParentLoop = NULL;
Dan Gohman321a8132010-01-05 16:27:25 +000094 do {
Dan Gohmane9d87f42009-05-06 17:22:41 +000095 Loop *L = LoopNest.pop_back_val();
Devang Patel4f5d78e2007-08-14 23:59:17 +000096 Loop *NewLoop = new Loop();
97
98 if (!NewParentLoop)
99 NewParentLoop = NewLoop;
100
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000101 LPM->insertLoop(NewLoop, L->getParentLoop());
102
103 // Clone Basic Blocks.
104 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
105 I != E; ++I) {
106 BasicBlock *BB = *I;
107 BasicBlock *NewBB = CloneBasicBlock(BB, ValueMap, ".clone");
108 ValueMap[BB] = NewBB;
109 if (P)
110 LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
Owen Andersond735ee82007-11-27 03:43:35 +0000111 NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000112 NewBlocks.push_back(NewBB);
113 }
114
115 // Clone dominator info.
116 if (DT)
117 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
118 I != E; ++I) {
119 BasicBlock *BB = *I;
120 CloneDominatorInfo(BB, ValueMap, DT, DF);
121 }
122
Devang Patel4f5d78e2007-08-14 23:59:17 +0000123 // Process sub loops
124 for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
125 LoopNest.push_back(*I);
Dan Gohman321a8132010-01-05 16:27:25 +0000126 } while (!LoopNest.empty());
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000127
128 // Remap instructions to reference operands from ValueMap.
129 for(SmallVector<BasicBlock *, 16>::iterator NBItr = NewBlocks.begin(),
130 NBE = NewBlocks.end(); NBItr != NBE; ++NBItr) {
131 BasicBlock *NB = *NBItr;
132 for(BasicBlock::iterator BI = NB->begin(), BE = NB->end();
133 BI != BE; ++BI) {
134 Instruction *Insn = BI;
135 for (unsigned index = 0, num_ops = Insn->getNumOperands();
136 index != num_ops; ++index) {
137 Value *Op = Insn->getOperand(index);
138 DenseMap<const Value *, Value *>::iterator OpItr = ValueMap.find(Op);
139 if (OpItr != ValueMap.end())
140 Insn->setOperand(index, OpItr->second);
141 }
142 }
143 }
144
145 BasicBlock *Latch = OrigL->getLoopLatch();
146 Function *F = Latch->getParent();
Devang Pateld24e5992007-09-04 20:46:35 +0000147 F->getBasicBlockList().insert(OrigL->getHeader(),
148 NewBlocks.begin(), NewBlocks.end());
149
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000150
Devang Patel4f5d78e2007-08-14 23:59:17 +0000151 return NewParentLoop;
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000152}