@@ -59,25 +59,18 @@ namespace {
59
59
// Helper functions
60
60
61
61
// / Do actual work
62
- bool rotateLoop (Loop *L, LPPassManager &LPM );
62
+ bool rotateLoop (Loop *L);
63
63
64
- // / Initialize local data
65
- void initialize ();
66
-
67
64
// / After loop rotation, loop pre-header has multiple sucessors.
68
65
// / Insert one forwarding basic block to ensure that loop pre-header
69
66
// / has only one successor.
70
- void preserveCanonicalLoopForm (LPPassManager &LPM);
67
+ void preserveCanonicalLoopForm (Loop *L, BasicBlock *OrigHeader,
68
+ BasicBlock *OrigPreHeader,
69
+ BasicBlock *OrigLatch, BasicBlock *NewHeader,
70
+ BasicBlock *Exit);
71
71
72
72
private:
73
73
LoopInfo *LI;
74
- Loop *L;
75
- BasicBlock *OrigHeader;
76
- BasicBlock *OrigPreHeader;
77
- BasicBlock *OrigLatch;
78
- BasicBlock *NewHeader;
79
- BasicBlock *Exit;
80
- LPPassManager *LPM_Ptr;
81
74
};
82
75
}
83
76
@@ -90,44 +83,28 @@ INITIALIZE_PASS_END(LoopRotate, "loop-rotate", "Rotate Loops", false, false)
90
83
91
84
Pass *llvm::createLoopRotatePass() { return new LoopRotate (); }
92
85
93
- // / Initialize local data
94
- void LoopRotate::initialize () {
95
- L = NULL ;
96
- OrigHeader = NULL ;
97
- OrigPreHeader = NULL ;
98
- NewHeader = NULL ;
99
- Exit = NULL ;
100
- }
101
-
102
86
// / Rotate Loop L as many times as possible. Return true if
103
87
// / the loop is rotated at least once.
104
- bool LoopRotate::runOnLoop (Loop *Lp , LPPassManager &LPM) {
88
+ bool LoopRotate::runOnLoop (Loop *L , LPPassManager &LPM) {
105
89
LI = &getAnalysis<LoopInfo>();
106
90
107
- initialize ();
108
- LPM_Ptr = &LPM;
109
-
110
91
// One loop can be rotated multiple times.
111
92
bool MadeChange = false ;
112
- while (rotateLoop (Lp,LPM)) {
93
+ while (rotateLoop (L))
113
94
MadeChange = true ;
114
- initialize ();
115
- }
116
95
117
96
return MadeChange;
118
97
}
119
98
120
99
// / Rotate loop LP. Return true if the loop is rotated.
121
- bool LoopRotate::rotateLoop (Loop *Lp, LPPassManager &LPM) {
122
- L = Lp;
123
-
124
- OrigPreHeader = L->getLoopPreheader ();
100
+ bool LoopRotate::rotateLoop (Loop *L) {
101
+ BasicBlock *OrigPreHeader = L->getLoopPreheader ();
125
102
if (!OrigPreHeader) return false ;
126
103
127
- OrigLatch = L->getLoopLatch ();
104
+ BasicBlock * OrigLatch = L->getLoopLatch ();
128
105
if (!OrigLatch) return false ;
129
106
130
- OrigHeader = L->getHeader ();
107
+ BasicBlock * OrigHeader = L->getHeader ();
131
108
132
109
// If the loop has only one block then there is not much to rotate.
133
110
if (L->getBlocks ().size () == 1 )
@@ -171,8 +148,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
171
148
// Find new Loop header. NewHeader is a Header's one and only successor
172
149
// that is inside loop. Header's other successor is outside the
173
150
// loop. Otherwise loop is not suitable for rotation.
174
- Exit = BI->getSuccessor (0 );
175
- NewHeader = BI->getSuccessor (1 );
151
+ BasicBlock * Exit = BI->getSuccessor (0 );
152
+ BasicBlock * NewHeader = BI->getSuccessor (1 );
176
153
if (L->contains (Exit))
177
154
std::swap (Exit, NewHeader);
178
155
assert (NewHeader && " Unable to determine new loop header" );
@@ -328,7 +305,8 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
328
305
// at this point, if we don't mind updating dominator info.
329
306
330
307
// Establish a new preheader, update dominators, etc.
331
- preserveCanonicalLoopForm (LPM);
308
+ preserveCanonicalLoopForm (L, OrigHeader, OrigPreHeader, OrigLatch,
309
+ NewHeader, Exit);
332
310
333
311
++NumRotated;
334
312
return true ;
@@ -338,15 +316,18 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
338
316
// / After loop rotation, loop pre-header has multiple sucessors.
339
317
// / Insert one forwarding basic block to ensure that loop pre-header
340
318
// / has only one successor.
341
- void LoopRotate::preserveCanonicalLoopForm (LPPassManager &LPM) {
319
+ void LoopRotate::preserveCanonicalLoopForm (Loop *L, BasicBlock *OrigHeader,
320
+ BasicBlock *OrigPreHeader,
321
+ BasicBlock *OrigLatch,
322
+ BasicBlock *NewHeader,
323
+ BasicBlock *Exit) {
342
324
343
325
// Right now original pre-header has two successors, new header and
344
326
// exit block. Insert new block between original pre-header and
345
327
// new header such that loop's new pre-header has only one successor.
346
- BasicBlock *NewPreHeader = BasicBlock::Create (OrigHeader->getContext (),
347
- " bb.nph" ,
348
- OrigHeader->getParent (),
349
- NewHeader);
328
+ BasicBlock *NewPreHeader =
329
+ BasicBlock::Create (OrigHeader->getContext (), " bb.nph" ,
330
+ OrigHeader->getParent (), NewHeader);
350
331
LoopInfo &LI = getAnalysis<LoopInfo>();
351
332
if (Loop *PL = LI.getLoopFor (OrigPreHeader))
352
333
PL->addBasicBlockToLoop (NewPreHeader, LI.getBase ());
@@ -431,19 +412,19 @@ void LoopRotate::preserveCanonicalLoopForm(LPPassManager &LPM) {
431
412
for (Loop::block_iterator BI = L->block_begin (), BE = L->block_end ();
432
413
BI != BE; ++BI) {
433
414
BasicBlock *B = *BI;
434
- if (DT->dominates (B, NewLatch)) {
435
- DominanceFrontier::iterator BDFI = DF-> find (B);
436
- if ( BDFI ! = DF->end ()) {
437
- DominanceFrontier::DomSetType &BSet = BDFI-> second ;
438
- BSet. erase (NewLatch) ;
439
- BSet.insert (L-> getHeader () );
440
- BSet.insert (Exit );
441
- } else {
442
- DominanceFrontier::DomSetType BSet;
443
- BSet. insert (L-> getHeader ()) ;
444
- BSet.insert (Exit );
445
- DF-> addBasicBlock (B, BSet);
446
- }
415
+ if (! DT->dominates (B, NewLatch)) continue ;
416
+
417
+ DominanceFrontier::iterator BDFI = DF->find (B);
418
+ if (BDFI != DF-> end ()) {
419
+ DominanceFrontier::DomSetType & BSet = BDFI-> second ;
420
+ BSet.erase (NewLatch );
421
+ BSet.insert (L-> getHeader () );
422
+ BSet. insert (Exit);
423
+ } else {
424
+ DominanceFrontier::DomSetType BSet;
425
+ BSet.insert (L-> getHeader () );
426
+ BSet. insert (Exit );
427
+ DF-> addBasicBlock (B, BSet);
447
428
}
448
429
}
449
430
}
0 commit comments