blob: ba8f3d55738433f5289e04c851c4309c67de0495 [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"
Devang Patel4bc2a0b2007-08-10 17:59:47 +000018
19
20using namespace llvm;
21
22/// CloneDominatorInfo - Clone basicblock's dominator tree and, if available,
23/// dominance info. It is expected that basic block is already cloned.
24static void CloneDominatorInfo(BasicBlock *BB,
Rafael Espindola1ed219a2010-10-13 01:36:30 +000025 ValueToValueMapTy &VMap,
Devang Patel4bc2a0b2007-08-10 17:59:47 +000026 DominatorTree *DT,
27 DominanceFrontier *DF) {
28
29 assert (DT && "DominatorTree is not available");
Rafael Espindola1ed219a2010-10-13 01:36:30 +000030 ValueToValueMapTy::iterator BI = VMap.find(BB);
Devang Patel29d3dd82010-06-23 23:55:51 +000031 assert (BI != VMap.end() && "BasicBlock clone is missing");
Devang Patel4bc2a0b2007-08-10 17:59:47 +000032 BasicBlock *NewBB = cast<BasicBlock>(BI->second);
33
34 // NewBB already got dominator info.
35 if (DT->getNode(NewBB))
36 return;
37
38 assert (DT->getNode(BB) && "BasicBlock does not have dominator info");
39 // Entry block is not expected here. Infinite loops are not to cloned.
40 assert (DT->getNode(BB)->getIDom() && "BasicBlock does not have immediate dominator");
41 BasicBlock *BBDom = DT->getNode(BB)->getIDom()->getBlock();
42
43 // NewBB's dominator is either BB's dominator or BB's dominator's clone.
44 BasicBlock *NewBBDom = BBDom;
Rafael Espindola1ed219a2010-10-13 01:36:30 +000045 ValueToValueMapTy::iterator BBDomI = VMap.find(BBDom);
Devang Patel29d3dd82010-06-23 23:55:51 +000046 if (BBDomI != VMap.end()) {
Devang Patel4bc2a0b2007-08-10 17:59:47 +000047 NewBBDom = cast<BasicBlock>(BBDomI->second);
48 if (!DT->getNode(NewBBDom))
Devang Patel29d3dd82010-06-23 23:55:51 +000049 CloneDominatorInfo(BBDom, VMap, DT, DF);
Devang Patel4bc2a0b2007-08-10 17:59:47 +000050 }
51 DT->addNewBlock(NewBB, NewBBDom);
52
53 // Copy cloned dominance frontiner set
54 if (DF) {
55 DominanceFrontier::DomSetType NewDFSet;
56 DominanceFrontier::iterator DFI = DF->find(BB);
57 if ( DFI != DF->end()) {
58 DominanceFrontier::DomSetType S = DFI->second;
59 for (DominanceFrontier::DomSetType::iterator I = S.begin(), E = S.end();
60 I != E; ++I) {
61 BasicBlock *DB = *I;
Rafael Espindola1ed219a2010-10-13 01:36:30 +000062 ValueToValueMapTy::iterator IDM = VMap.find(DB);
Devang Patel29d3dd82010-06-23 23:55:51 +000063 if (IDM != VMap.end())
Devang Patel4bc2a0b2007-08-10 17:59:47 +000064 NewDFSet.insert(cast<BasicBlock>(IDM->second));
65 else
66 NewDFSet.insert(DB);
67 }
68 }
69 DF->addBasicBlock(NewBB, NewDFSet);
70 }
71}
72
Devang Patel29d3dd82010-06-23 23:55:51 +000073/// CloneLoop - Clone Loop. Clone dominator info. Populate VMap
Devang Patel4bc2a0b2007-08-10 17:59:47 +000074/// using old blocks to new blocks mapping.
75Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
Rafael Espindola1ed219a2010-10-13 01:36:30 +000076 ValueToValueMapTy &VMap, Pass *P) {
Devang Patel4bc2a0b2007-08-10 17:59:47 +000077
78 DominatorTree *DT = NULL;
79 DominanceFrontier *DF = NULL;
80 if (P) {
Duncan Sands1465d612009-01-28 13:14:17 +000081 DT = P->getAnalysisIfAvailable<DominatorTree>();
82 DF = P->getAnalysisIfAvailable<DominanceFrontier>();
Devang Patel4bc2a0b2007-08-10 17:59:47 +000083 }
84
85 SmallVector<BasicBlock *, 16> NewBlocks;
Devang Patel4bc2a0b2007-08-10 17:59:47 +000086
Devang Patel4f5d78e2007-08-14 23:59:17 +000087 // Populate loop nest.
88 SmallVector<Loop *, 8> LoopNest;
89 LoopNest.push_back(OrigL);
90
91
92 Loop *NewParentLoop = NULL;
Dan Gohman321a8132010-01-05 16:27:25 +000093 do {
Dan Gohmane9d87f42009-05-06 17:22:41 +000094 Loop *L = LoopNest.pop_back_val();
Devang Patel4f5d78e2007-08-14 23:59:17 +000095 Loop *NewLoop = new Loop();
96
97 if (!NewParentLoop)
98 NewParentLoop = NewLoop;
99
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000100 LPM->insertLoop(NewLoop, L->getParentLoop());
101
102 // Clone Basic Blocks.
103 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
104 I != E; ++I) {
105 BasicBlock *BB = *I;
Devang Patel29d3dd82010-06-23 23:55:51 +0000106 BasicBlock *NewBB = CloneBasicBlock(BB, VMap, ".clone");
107 VMap[BB] = NewBB;
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000108 if (P)
109 LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
Owen Andersond735ee82007-11-27 03:43:35 +0000110 NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000111 NewBlocks.push_back(NewBB);
112 }
113
114 // Clone dominator info.
115 if (DT)
116 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
117 I != E; ++I) {
118 BasicBlock *BB = *I;
Devang Patel29d3dd82010-06-23 23:55:51 +0000119 CloneDominatorInfo(BB, VMap, DT, DF);
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000120 }
121
Devang Patel4f5d78e2007-08-14 23:59:17 +0000122 // Process sub loops
123 for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
124 LoopNest.push_back(*I);
Dan Gohman321a8132010-01-05 16:27:25 +0000125 } while (!LoopNest.empty());
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000126
Devang Patel29d3dd82010-06-23 23:55:51 +0000127 // Remap instructions to reference operands from VMap.
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000128 for(SmallVector<BasicBlock *, 16>::iterator NBItr = NewBlocks.begin(),
129 NBE = NewBlocks.end(); NBItr != NBE; ++NBItr) {
130 BasicBlock *NB = *NBItr;
131 for(BasicBlock::iterator BI = NB->begin(), BE = NB->end();
132 BI != BE; ++BI) {
133 Instruction *Insn = BI;
134 for (unsigned index = 0, num_ops = Insn->getNumOperands();
135 index != num_ops; ++index) {
136 Value *Op = Insn->getOperand(index);
Rafael Espindola1ed219a2010-10-13 01:36:30 +0000137 ValueToValueMapTy::iterator OpItr = VMap.find(Op);
Devang Patel29d3dd82010-06-23 23:55:51 +0000138 if (OpItr != VMap.end())
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000139 Insn->setOperand(index, OpItr->second);
140 }
141 }
142 }
143
144 BasicBlock *Latch = OrigL->getLoopLatch();
145 Function *F = Latch->getParent();
Devang Pateld24e5992007-09-04 20:46:35 +0000146 F->getBasicBlockList().insert(OrigL->getHeader(),
147 NewBlocks.begin(), NewBlocks.end());
148
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000149
Devang Patel4f5d78e2007-08-14 23:59:17 +0000150 return NewParentLoop;
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000151}