blob: 87dd14153a199665f232a333366ca10035872f91 [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"
Cameron Zwarich30127872011-01-18 04:11:31 +000017#include "llvm/Analysis/Dominators.h"
Devang Patel4bc2a0b2007-08-10 17:59:47 +000018
19
20using namespace llvm;
21
Cameron Zwarich30127872011-01-18 04:11:31 +000022/// CloneDominatorInfo - Clone a basic block's dominator tree. It is expected
23/// that the basic block is already cloned.
Devang Patel4bc2a0b2007-08-10 17:59:47 +000024static void CloneDominatorInfo(BasicBlock *BB,
Rafael Espindola1ed219a2010-10-13 01:36:30 +000025 ValueToValueMapTy &VMap,
Cameron Zwarich30127872011-01-18 04:11:31 +000026 DominatorTree *DT) {
Devang Patel4bc2a0b2007-08-10 17:59:47 +000027
28 assert (DT && "DominatorTree is not available");
Rafael Espindola1ed219a2010-10-13 01:36:30 +000029 ValueToValueMapTy::iterator BI = VMap.find(BB);
Devang Patel29d3dd82010-06-23 23:55:51 +000030 assert (BI != VMap.end() && "BasicBlock clone is missing");
Devang Patel4bc2a0b2007-08-10 17:59:47 +000031 BasicBlock *NewBB = cast<BasicBlock>(BI->second);
32
33 // NewBB already got dominator info.
34 if (DT->getNode(NewBB))
35 return;
36
37 assert (DT->getNode(BB) && "BasicBlock does not have dominator info");
38 // Entry block is not expected here. Infinite loops are not to cloned.
39 assert (DT->getNode(BB)->getIDom() && "BasicBlock does not have immediate dominator");
40 BasicBlock *BBDom = DT->getNode(BB)->getIDom()->getBlock();
41
42 // NewBB's dominator is either BB's dominator or BB's dominator's clone.
43 BasicBlock *NewBBDom = BBDom;
Rafael Espindola1ed219a2010-10-13 01:36:30 +000044 ValueToValueMapTy::iterator BBDomI = VMap.find(BBDom);
Devang Patel29d3dd82010-06-23 23:55:51 +000045 if (BBDomI != VMap.end()) {
Devang Patel4bc2a0b2007-08-10 17:59:47 +000046 NewBBDom = cast<BasicBlock>(BBDomI->second);
47 if (!DT->getNode(NewBBDom))
Cameron Zwarich30127872011-01-18 04:11:31 +000048 CloneDominatorInfo(BBDom, VMap, DT);
Devang Patel4bc2a0b2007-08-10 17:59:47 +000049 }
50 DT->addNewBlock(NewBB, NewBBDom);
Devang Patel4bc2a0b2007-08-10 17:59:47 +000051}
52
Devang Patel29d3dd82010-06-23 23:55:51 +000053/// CloneLoop - Clone Loop. Clone dominator info. Populate VMap
Devang Patel4bc2a0b2007-08-10 17:59:47 +000054/// using old blocks to new blocks mapping.
55Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager *LPM, LoopInfo *LI,
Rafael Espindola1ed219a2010-10-13 01:36:30 +000056 ValueToValueMapTy &VMap, Pass *P) {
Devang Patel4bc2a0b2007-08-10 17:59:47 +000057
58 DominatorTree *DT = NULL;
Cameron Zwarich30127872011-01-18 04:11:31 +000059 if (P)
Duncan Sands1465d612009-01-28 13:14:17 +000060 DT = P->getAnalysisIfAvailable<DominatorTree>();
Devang Patel4bc2a0b2007-08-10 17:59:47 +000061
62 SmallVector<BasicBlock *, 16> NewBlocks;
Devang Patel4bc2a0b2007-08-10 17:59:47 +000063
Devang Patel4f5d78e2007-08-14 23:59:17 +000064 // Populate loop nest.
65 SmallVector<Loop *, 8> LoopNest;
66 LoopNest.push_back(OrigL);
67
68
69 Loop *NewParentLoop = NULL;
Dan Gohman321a8132010-01-05 16:27:25 +000070 do {
Dan Gohmane9d87f42009-05-06 17:22:41 +000071 Loop *L = LoopNest.pop_back_val();
Devang Patel4f5d78e2007-08-14 23:59:17 +000072 Loop *NewLoop = new Loop();
73
74 if (!NewParentLoop)
75 NewParentLoop = NewLoop;
76
Devang Patel4bc2a0b2007-08-10 17:59:47 +000077 LPM->insertLoop(NewLoop, L->getParentLoop());
78
79 // Clone Basic Blocks.
80 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
81 I != E; ++I) {
82 BasicBlock *BB = *I;
Devang Patel29d3dd82010-06-23 23:55:51 +000083 BasicBlock *NewBB = CloneBasicBlock(BB, VMap, ".clone");
84 VMap[BB] = NewBB;
Devang Patel4bc2a0b2007-08-10 17:59:47 +000085 if (P)
86 LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
Owen Andersond735ee82007-11-27 03:43:35 +000087 NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
Devang Patel4bc2a0b2007-08-10 17:59:47 +000088 NewBlocks.push_back(NewBB);
89 }
90
91 // Clone dominator info.
92 if (DT)
93 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
94 I != E; ++I) {
95 BasicBlock *BB = *I;
Cameron Zwarich30127872011-01-18 04:11:31 +000096 CloneDominatorInfo(BB, VMap, DT);
Devang Patel4bc2a0b2007-08-10 17:59:47 +000097 }
98
Devang Patel4f5d78e2007-08-14 23:59:17 +000099 // Process sub loops
100 for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
101 LoopNest.push_back(*I);
Dan Gohman321a8132010-01-05 16:27:25 +0000102 } while (!LoopNest.empty());
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000103
Devang Patel29d3dd82010-06-23 23:55:51 +0000104 // Remap instructions to reference operands from VMap.
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000105 for(SmallVector<BasicBlock *, 16>::iterator NBItr = NewBlocks.begin(),
106 NBE = NewBlocks.end(); NBItr != NBE; ++NBItr) {
107 BasicBlock *NB = *NBItr;
108 for(BasicBlock::iterator BI = NB->begin(), BE = NB->end();
109 BI != BE; ++BI) {
110 Instruction *Insn = BI;
111 for (unsigned index = 0, num_ops = Insn->getNumOperands();
112 index != num_ops; ++index) {
113 Value *Op = Insn->getOperand(index);
Rafael Espindola1ed219a2010-10-13 01:36:30 +0000114 ValueToValueMapTy::iterator OpItr = VMap.find(Op);
Devang Patel29d3dd82010-06-23 23:55:51 +0000115 if (OpItr != VMap.end())
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000116 Insn->setOperand(index, OpItr->second);
117 }
118 }
119 }
120
121 BasicBlock *Latch = OrigL->getLoopLatch();
122 Function *F = Latch->getParent();
Devang Pateld24e5992007-09-04 20:46:35 +0000123 F->getBasicBlockList().insert(OrigL->getHeader(),
124 NewBlocks.begin(), NewBlocks.end());
125
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000126
Devang Patel4f5d78e2007-08-14 23:59:17 +0000127 return NewParentLoop;
Devang Patel4bc2a0b2007-08-10 17:59:47 +0000128}