1 //===- LoopRotation.cpp - Loop Rotation Pass ------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements Loop Rotation Pass.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "loop-rotate"
15 #include "llvm/Transforms/Scalar.h"
16 #include "llvm/Function.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Analysis/LoopInfo.h"
19 #include "llvm/Analysis/LoopPass.h"
20 #include "llvm/Analysis/Dominators.h"
21 #include "llvm/Analysis/ScalarEvolution.h"
22 #include "llvm/Transforms/Utils/Local.h"
23 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
24 #include "llvm/Support/CommandLine.h"
25 #include "llvm/Support/Debug.h"
26 #include "llvm/ADT/Statistic.h"
27 #include "llvm/ADT/SmallVector.h"
30 #define MAX_HEADER_SIZE 16
32 STATISTIC(NumRotated
, "Number of loops rotated");
35 class VISIBILITY_HIDDEN RenameData
{
37 RenameData(Instruction
*O
, Value
*P
, Instruction
*H
)
38 : Original(O
), PreHeader(P
), Header(H
) { }
40 Instruction
*Original
; // Original instruction
41 Value
*PreHeader
; // Original pre-header replacement
42 Instruction
*Header
; // New header replacement
45 class VISIBILITY_HIDDEN LoopRotate
: public LoopPass
{
48 static char ID
; // Pass ID, replacement for typeid
49 LoopRotate() : LoopPass(&ID
) {}
51 // Rotate Loop L as many times as possible. Return true if
52 // loop is rotated at least once.
53 bool runOnLoop(Loop
*L
, LPPassManager
&LPM
);
55 // LCSSA form makes instruction renaming easier.
56 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
57 AU
.addRequiredID(LoopSimplifyID
);
58 AU
.addPreservedID(LoopSimplifyID
);
59 AU
.addRequiredID(LCSSAID
);
60 AU
.addPreservedID(LCSSAID
);
61 AU
.addPreserved
<ScalarEvolution
>();
62 AU
.addPreserved
<LoopInfo
>();
63 AU
.addPreserved
<DominatorTree
>();
64 AU
.addPreserved
<DominanceFrontier
>();
70 bool rotateLoop(Loop
*L
, LPPassManager
&LPM
);
72 /// Initialize local data
75 /// Make sure all Exit block PHINodes have required incoming values.
76 /// If incoming value is constant or defined outside the loop then
77 /// PHINode may not have an entry for original pre-header.
78 void updateExitBlock();
80 /// Return true if this instruction is used outside original header.
81 bool usedOutsideOriginalHeader(Instruction
*In
);
83 /// Find Replacement information for instruction. Return NULL if it is
85 const RenameData
*findReplacementData(Instruction
*I
);
87 /// After loop rotation, loop pre-header has multiple sucessors.
88 /// Insert one forwarding basic block to ensure that loop pre-header
89 /// has only one successor.
90 void preserveCanonicalLoopForm(LPPassManager
&LPM
);
95 BasicBlock
*OrigHeader
;
96 BasicBlock
*OrigPreHeader
;
97 BasicBlock
*OrigLatch
;
98 BasicBlock
*NewHeader
;
100 LPPassManager
*LPM_Ptr
;
101 SmallVector
<RenameData
, MAX_HEADER_SIZE
> LoopHeaderInfo
;
105 char LoopRotate::ID
= 0;
106 static RegisterPass
<LoopRotate
> X("loop-rotate", "Rotate Loops");
108 Pass
*llvm::createLoopRotatePass() { return new LoopRotate(); }
110 /// Rotate Loop L as many times as possible. Return true if
111 /// loop is rotated at least once.
112 bool LoopRotate::runOnLoop(Loop
*Lp
, LPPassManager
&LPM
) {
114 bool RotatedOneLoop
= false;
118 // One loop can be rotated multiple times.
119 while (rotateLoop(Lp
,LPM
)) {
120 RotatedOneLoop
= true;
124 return RotatedOneLoop
;
127 /// Rotate loop LP. Return true if the loop is rotated.
128 bool LoopRotate::rotateLoop(Loop
*Lp
, LPPassManager
&LPM
) {
131 OrigHeader
= L
->getHeader();
132 OrigPreHeader
= L
->getLoopPreheader();
133 OrigLatch
= L
->getLoopLatch();
135 // If loop has only one block then there is not much to rotate.
136 if (L
->getBlocks().size() == 1)
139 assert(OrigHeader
&& OrigLatch
&& OrigPreHeader
&&
140 "Loop is not in canonical form");
142 // If loop header is not one of the loop exit block then
143 // either this loop is already rotated or it is not
144 // suitable for loop rotation transformations.
145 if (!L
->isLoopExit(OrigHeader
))
148 BranchInst
*BI
= dyn_cast
<BranchInst
>(OrigHeader
->getTerminator());
151 assert(BI
->isConditional() && "Branch Instruction is not conditional");
153 // Updating PHInodes in loops with multiple exits adds complexity.
154 // Keep it simple, and restrict loop rotation to loops with one exit only.
155 // In future, lift this restriction and support for multiple exits if
157 SmallVector
<BasicBlock
*, 8> ExitBlocks
;
158 L
->getExitBlocks(ExitBlocks
);
159 if (ExitBlocks
.size() > 1)
162 // Check size of original header and reject
163 // loop if it is very big.
166 // FIXME: Use common api to estimate size.
167 for (BasicBlock::const_iterator OI
= OrigHeader
->begin(),
168 OE
= OrigHeader
->end(); OI
!= OE
; ++OI
) {
169 if (isa
<PHINode
>(OI
))
170 continue; // PHI nodes don't count.
171 if (isa
<DbgInfoIntrinsic
>(OI
))
172 continue; // Debug intrinsics don't count as size.
176 if (Size
> MAX_HEADER_SIZE
)
179 // Now, this loop is suitable for rotation.
181 // Find new Loop header. NewHeader is a Header's one and only successor
182 // that is inside loop. Header's other successor is outside the
183 // loop. Otherwise loop is not suitable for rotation.
184 Exit
= BI
->getSuccessor(0);
185 NewHeader
= BI
->getSuccessor(1);
186 if (L
->contains(Exit
))
187 std::swap(Exit
, NewHeader
);
188 assert(NewHeader
&& "Unable to determine new loop header");
189 assert(L
->contains(NewHeader
) && !L
->contains(Exit
) &&
190 "Unable to determine loop header and exit blocks");
192 // This code assumes that new header has exactly one predecessor. Remove any
193 // single entry PHI nodes in it.
194 assert(NewHeader
->getSinglePredecessor() &&
195 "New header doesn't have one pred!");
196 FoldSingleEntryPHINodes(NewHeader
);
198 // Copy PHI nodes and other instructions from original header
199 // into original pre-header. Unlike original header, original pre-header is
200 // not a member of loop.
202 // New loop header is one and only successor of original header that
203 // is inside the loop. All other original header successors are outside
204 // the loop. Copy PHI Nodes from original header into new loop header.
205 // Add second incoming value, from original loop pre-header into these phi
206 // nodes. If a value defined in original header is used outside original
207 // header then new loop header will need new phi nodes with two incoming
208 // values, one definition from original header and second definition is
209 // from original loop pre-header.
211 // Remove terminator from Original pre-header. Original pre-header will
212 // receive a clone of original header terminator as a new terminator.
213 OrigPreHeader
->getInstList().pop_back();
214 BasicBlock::iterator I
= OrigHeader
->begin(), E
= OrigHeader
->end();
216 for (; (PN
= dyn_cast
<PHINode
>(I
)); ++I
) {
217 // PHI nodes are not copied into original pre-header. Instead their values
218 // are directly propagated.
219 Value
*NPV
= PN
->getIncomingValueForBlock(OrigPreHeader
);
221 // Create new PHI node with two incoming values for NewHeader.
222 // One incoming value is from OrigLatch (through OrigHeader) and
223 // second incoming value is from original pre-header.
224 PHINode
*NH
= PHINode::Create(PN
->getType(), PN
->getName(),
226 NH
->addIncoming(PN
->getIncomingValueForBlock(OrigLatch
), OrigHeader
);
227 NH
->addIncoming(NPV
, OrigPreHeader
);
229 // "In" can be replaced by NH at various places.
230 LoopHeaderInfo
.push_back(RenameData(PN
, NPV
, NH
));
233 // Now, handle non-phi instructions.
234 for (; I
!= E
; ++I
) {
236 assert(!isa
<PHINode
>(In
) && "PHINode is not expected here");
238 // This is not a PHI instruction. Insert its clone into original pre-header.
239 // If this instruction is using a value from same basic block then
240 // update it to use value from cloned instruction.
241 Instruction
*C
= In
->clone();
242 C
->setName(In
->getName());
243 OrigPreHeader
->getInstList().push_back(C
);
245 for (unsigned opi
= 0, e
= In
->getNumOperands(); opi
!= e
; ++opi
) {
246 Instruction
*OpInsn
= dyn_cast
<Instruction
>(In
->getOperand(opi
));
247 if (!OpInsn
) continue; // Ignore non-instruction values.
248 if (const RenameData
*D
= findReplacementData(OpInsn
))
249 C
->setOperand(opi
, D
->PreHeader
);
252 // If this instruction is used outside this basic block then
253 // create new PHINode for this instruction.
254 Instruction
*NewHeaderReplacement
= NULL
;
255 if (usedOutsideOriginalHeader(In
)) {
256 PHINode
*PN
= PHINode::Create(In
->getType(), In
->getName(),
258 PN
->addIncoming(In
, OrigHeader
);
259 PN
->addIncoming(C
, OrigPreHeader
);
260 NewHeaderReplacement
= PN
;
262 LoopHeaderInfo
.push_back(RenameData(In
, C
, NewHeaderReplacement
));
265 // Rename uses of original header instructions to reflect their new
266 // definitions (either from original pre-header node or from newly created
267 // new header PHINodes.
269 // Original header instructions are used in
270 // 1) Original header:
272 // If instruction is used in non-phi instructions then it is using
273 // defintion from original heder iteself. Do not replace this use
274 // with definition from new header or original pre-header.
276 // If instruction is used in phi node then it is an incoming
277 // value. Rename its use to reflect new definition from new-preheader
280 // 2) Inside loop but not in original header
282 // Replace this use to reflect definition from new header.
283 for (unsigned LHI
= 0, LHI_E
= LoopHeaderInfo
.size(); LHI
!= LHI_E
; ++LHI
) {
284 const RenameData
&ILoopHeaderInfo
= LoopHeaderInfo
[LHI
];
286 if (!ILoopHeaderInfo
.Header
)
289 Instruction
*OldPhi
= ILoopHeaderInfo
.Original
;
290 Instruction
*NewPhi
= ILoopHeaderInfo
.Header
;
292 // Before replacing uses, collect them first, so that iterator is
294 SmallVector
<Instruction
*, 16> AllUses
;
295 for (Value::use_iterator UI
= OldPhi
->use_begin(), UE
= OldPhi
->use_end();
297 AllUses
.push_back(cast
<Instruction
>(UI
));
299 for (SmallVector
<Instruction
*, 16>::iterator UI
= AllUses
.begin(),
300 UE
= AllUses
.end(); UI
!= UE
; ++UI
) {
301 Instruction
*U
= *UI
;
302 BasicBlock
*Parent
= U
->getParent();
304 // Used inside original header
305 if (Parent
== OrigHeader
) {
306 // Do not rename uses inside original header non-phi instructions.
307 PHINode
*PU
= dyn_cast
<PHINode
>(U
);
311 // Do not rename uses inside original header phi nodes, if the
312 // incoming value is for new header.
313 if (PU
->getBasicBlockIndex(NewHeader
) != -1
314 && PU
->getIncomingValueForBlock(NewHeader
) == U
)
317 U
->replaceUsesOfWith(OldPhi
, NewPhi
);
321 // Used inside loop, but not in original header.
322 if (L
->contains(U
->getParent())) {
324 U
->replaceUsesOfWith(OldPhi
, NewPhi
);
328 // Used inside Exit Block. Since we are in LCSSA form, U must be PHINode.
329 if (U
->getParent() == Exit
) {
330 assert(isa
<PHINode
>(U
) && "Use in Exit Block that is not PHINode");
332 PHINode
*UPhi
= cast
<PHINode
>(U
);
333 // UPhi already has one incoming argument from original header.
334 // Add second incoming argument from new Pre header.
335 UPhi
->addIncoming(ILoopHeaderInfo
.PreHeader
, OrigPreHeader
);
337 // Used outside Exit block. Create a new PHI node from exit block
338 // to receive value from ne new header ane pre header.
339 PHINode
*PN
= PHINode::Create(U
->getType(), U
->getName(),
341 PN
->addIncoming(ILoopHeaderInfo
.PreHeader
, OrigPreHeader
);
342 PN
->addIncoming(OldPhi
, OrigHeader
);
343 U
->replaceUsesOfWith(OldPhi
, PN
);
348 /// Make sure all Exit block PHINodes have required incoming values.
353 // Removing incoming branch from loop preheader to original header.
354 // Now original header is inside the loop.
355 for (BasicBlock::iterator I
= OrigHeader
->begin(), E
= OrigHeader
->end();
357 if (PHINode
*PN
= dyn_cast
<PHINode
>(I
))
358 PN
->removeIncomingValue(OrigPreHeader
);
360 // Make NewHeader as the new header for the loop.
361 L
->moveToHeader(NewHeader
);
363 preserveCanonicalLoopForm(LPM
);
369 /// Make sure all Exit block PHINodes have required incoming values.
370 /// If incoming value is constant or defined outside the loop then
371 /// PHINode may not have an entry for original pre-header.
372 void LoopRotate::updateExitBlock() {
374 for (BasicBlock::iterator I
= Exit
->begin(), E
= Exit
->end();
377 PHINode
*PN
= dyn_cast
<PHINode
>(I
);
381 // There is already one incoming value from original pre-header block.
382 if (PN
->getBasicBlockIndex(OrigPreHeader
) != -1)
385 const RenameData
*ILoopHeaderInfo
;
386 Value
*V
= PN
->getIncomingValueForBlock(OrigHeader
);
387 if (isa
<Instruction
>(V
) &&
388 (ILoopHeaderInfo
= findReplacementData(cast
<Instruction
>(V
)))) {
389 assert(ILoopHeaderInfo
->PreHeader
&& "Missing New Preheader Instruction");
390 PN
->addIncoming(ILoopHeaderInfo
->PreHeader
, OrigPreHeader
);
392 PN
->addIncoming(V
, OrigPreHeader
);
397 /// Initialize local data
398 void LoopRotate::initialize() {
401 OrigPreHeader
= NULL
;
405 LoopHeaderInfo
.clear();
408 /// Return true if this instruction is used by any instructions in the loop that
409 /// aren't in original header.
410 bool LoopRotate::usedOutsideOriginalHeader(Instruction
*In
) {
411 for (Value::use_iterator UI
= In
->use_begin(), UE
= In
->use_end();
413 BasicBlock
*UserBB
= cast
<Instruction
>(UI
)->getParent();
414 if (UserBB
!= OrigHeader
&& L
->contains(UserBB
))
421 /// Find Replacement information for instruction. Return NULL if it is
423 const RenameData
*LoopRotate::findReplacementData(Instruction
*In
) {
425 // Since LoopHeaderInfo is small, linear walk is OK.
426 for (unsigned LHI
= 0, LHI_E
= LoopHeaderInfo
.size(); LHI
!= LHI_E
; ++LHI
) {
427 const RenameData
&ILoopHeaderInfo
= LoopHeaderInfo
[LHI
];
428 if (ILoopHeaderInfo
.Original
== In
)
429 return &ILoopHeaderInfo
;
434 /// After loop rotation, loop pre-header has multiple sucessors.
435 /// Insert one forwarding basic block to ensure that loop pre-header
436 /// has only one successor.
437 void LoopRotate::preserveCanonicalLoopForm(LPPassManager
&LPM
) {
439 // Right now original pre-header has two successors, new header and
440 // exit block. Insert new block between original pre-header and
441 // new header such that loop's new pre-header has only one successor.
442 BasicBlock
*NewPreHeader
= BasicBlock::Create("bb.nph",
443 OrigHeader
->getParent(),
445 LoopInfo
&LI
= LPM
.getAnalysis
<LoopInfo
>();
446 if (Loop
*PL
= LI
.getLoopFor(OrigPreHeader
))
447 PL
->addBasicBlockToLoop(NewPreHeader
, LI
.getBase());
448 BranchInst::Create(NewHeader
, NewPreHeader
);
450 BranchInst
*OrigPH_BI
= cast
<BranchInst
>(OrigPreHeader
->getTerminator());
451 if (OrigPH_BI
->getSuccessor(0) == NewHeader
)
452 OrigPH_BI
->setSuccessor(0, NewPreHeader
);
454 assert(OrigPH_BI
->getSuccessor(1) == NewHeader
&&
455 "Unexpected original pre-header terminator");
456 OrigPH_BI
->setSuccessor(1, NewPreHeader
);
459 for (BasicBlock::iterator I
= NewHeader
->begin(), E
= NewHeader
->end();
461 PHINode
*PN
= dyn_cast
<PHINode
>(I
);
465 int index
= PN
->getBasicBlockIndex(OrigPreHeader
);
466 assert(index
!= -1 && "Expected incoming value from Original PreHeader");
467 PN
->setIncomingBlock(index
, NewPreHeader
);
468 assert(PN
->getBasicBlockIndex(OrigPreHeader
) == -1 &&
469 "Expected only one incoming value from Original PreHeader");
472 if (DominatorTree
*DT
= getAnalysisIfAvailable
<DominatorTree
>()) {
473 DT
->addNewBlock(NewPreHeader
, OrigPreHeader
);
474 DT
->changeImmediateDominator(L
->getHeader(), NewPreHeader
);
475 DT
->changeImmediateDominator(Exit
, OrigPreHeader
);
476 for (Loop::block_iterator BI
= L
->block_begin(), BE
= L
->block_end();
479 if (L
->getHeader() != B
) {
480 DomTreeNode
*Node
= DT
->getNode(B
);
481 if (Node
&& Node
->getBlock() == OrigHeader
)
482 DT
->changeImmediateDominator(*BI
, L
->getHeader());
485 DT
->changeImmediateDominator(OrigHeader
, OrigLatch
);
488 if (DominanceFrontier
*DF
= getAnalysisIfAvailable
<DominanceFrontier
>()) {
489 // New Preheader's dominance frontier is Exit block.
490 DominanceFrontier::DomSetType NewPHSet
;
491 NewPHSet
.insert(Exit
);
492 DF
->addBasicBlock(NewPreHeader
, NewPHSet
);
494 // New Header's dominance frontier now includes itself and Exit block
495 DominanceFrontier::iterator HeadI
= DF
->find(L
->getHeader());
496 if (HeadI
!= DF
->end()) {
497 DominanceFrontier::DomSetType
& HeaderSet
= HeadI
->second
;
499 HeaderSet
.insert(L
->getHeader());
500 HeaderSet
.insert(Exit
);
502 DominanceFrontier::DomSetType HeaderSet
;
503 HeaderSet
.insert(L
->getHeader());
504 HeaderSet
.insert(Exit
);
505 DF
->addBasicBlock(L
->getHeader(), HeaderSet
);
508 // Original header (new Loop Latch)'s dominance frontier is Exit.
509 DominanceFrontier::iterator LatchI
= DF
->find(L
->getLoopLatch());
510 if (LatchI
!= DF
->end()) {
511 DominanceFrontier::DomSetType
&LatchSet
= LatchI
->second
;
512 LatchSet
= LatchI
->second
;
514 LatchSet
.insert(Exit
);
516 DominanceFrontier::DomSetType LatchSet
;
517 LatchSet
.insert(Exit
);
518 DF
->addBasicBlock(L
->getHeader(), LatchSet
);
521 // If a loop block dominates new loop latch then its frontier is
522 // new header and Exit.
523 BasicBlock
*NewLatch
= L
->getLoopLatch();
524 DominatorTree
*DT
= getAnalysisIfAvailable
<DominatorTree
>();
525 for (Loop::block_iterator BI
= L
->block_begin(), BE
= L
->block_end();
528 if (DT
->dominates(B
, NewLatch
)) {
529 DominanceFrontier::iterator BDFI
= DF
->find(B
);
530 if (BDFI
!= DF
->end()) {
531 DominanceFrontier::DomSetType
&BSet
= BDFI
->second
;
534 BSet
.insert(L
->getHeader());
537 DominanceFrontier::DomSetType BSet
;
538 BSet
.insert(L
->getHeader());
540 DF
->addBasicBlock(B
, BSet
);
546 // Preserve canonical loop form, which means Exit block should
547 // have only one predecessor.
548 BasicBlock
*NExit
= SplitEdge(L
->getLoopLatch(), Exit
, this);
551 BasicBlock::iterator I
= Exit
->begin(), E
= Exit
->end();
553 for (; (PN
= dyn_cast
<PHINode
>(I
)); ++I
) {
554 unsigned N
= PN
->getNumIncomingValues();
555 for (unsigned index
= 0; index
< N
; ++index
)
556 if (PN
->getIncomingBlock(index
) == NExit
) {
557 PHINode
*NewPN
= PHINode::Create(PN
->getType(), PN
->getName(),
559 NewPN
->addIncoming(PN
->getIncomingValue(index
), L
->getLoopLatch());
560 PN
->setIncomingValue(index
, NewPN
);
561 PN
->setIncomingBlock(index
, NExit
);
566 assert(NewHeader
&& L
->getHeader() == NewHeader
&&
567 "Invalid loop header after loop rotation");
568 assert(NewPreHeader
&& L
->getLoopPreheader() == NewPreHeader
&&
569 "Invalid loop preheader after loop rotation");
570 assert(L
->getLoopLatch() &&
571 "Invalid loop latch after loop rotation");