@@ -46,7 +46,7 @@ static llvm::cl::opt<bool> RotateSingleBlockLoop("looprotate-single-block-loop",
46
46
47
47
static bool rotateLoop (SILLoop *loop, DominanceInfo *domInfo,
48
48
SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
49
- SILBasicBlock *upToBB);
49
+ SILBasicBlock *upToBB, SILPassManager *pm );
50
50
51
51
// / Check whether all operands are loop invariant.
52
52
static bool
@@ -151,7 +151,8 @@ static void mapOperands(SILInstruction *inst,
151
151
static void updateSSAForUseOfValue (
152
152
SILSSAUpdater &updater, SmallVectorImpl<SILPhiArgument *> &insertedPhis,
153
153
const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
154
- SILBasicBlock *Header, SILBasicBlock *EntryCheckBlock, SILValue Res) {
154
+ SILBasicBlock *Header, SILBasicBlock *EntryCheckBlock, SILValue Res,
155
+ SILPassManager *pm) {
155
156
// Find the mapped instruction.
156
157
assert (valueMap.count (Res) && " Expected to find value in map!" );
157
158
SILValue MappedValue = valueMap.find (Res)->second ;
@@ -187,23 +188,25 @@ static void updateSSAForUseOfValue(
187
188
updater.rewriteUse (*use);
188
189
}
189
190
191
+ replacePhisWithIncomingValues (pm, insertedPhis);
190
192
}
191
193
192
194
static void
193
195
updateSSAForUseOfInst (SILSSAUpdater &updater,
194
196
SmallVectorImpl<SILPhiArgument *> &insertedPhis,
195
197
const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
196
198
SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
197
- SILInstruction *inst) {
199
+ SILInstruction *inst, SILPassManager *pm ) {
198
200
for (auto result : inst->getResults ())
199
201
updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
200
- entryCheckBlock, result);
202
+ entryCheckBlock, result, pm );
201
203
}
202
204
203
205
// / Rewrite the code we just created in the preheader and update SSA form.
204
206
static void rewriteNewLoopEntryCheckBlock (
205
207
SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
206
- const llvm::DenseMap<ValueBase *, SILValue> &valueMap) {
208
+ const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
209
+ SILPassManager *pm) {
207
210
SmallVector<SILPhiArgument *, 8 > insertedPhis;
208
211
SILSSAUpdater updater (&insertedPhis);
209
212
@@ -212,7 +215,7 @@ static void rewriteNewLoopEntryCheckBlock(
212
215
for (unsigned i : range (header->getNumArguments ())) {
213
216
auto *arg = header->getArguments ()[i];
214
217
updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
215
- entryCheckBlock, arg);
218
+ entryCheckBlock, arg, pm );
216
219
}
217
220
218
221
auto instIter = header->begin ();
@@ -221,7 +224,7 @@ static void rewriteNewLoopEntryCheckBlock(
221
224
while (instIter != header->end ()) {
222
225
auto &inst = *instIter;
223
226
updateSSAForUseOfInst (updater, insertedPhis, valueMap, header,
224
- entryCheckBlock, &inst);
227
+ entryCheckBlock, &inst, pm );
225
228
++instIter;
226
229
}
227
230
}
@@ -243,7 +246,7 @@ static void updateDomTree(DominanceInfo *domInfo, SILBasicBlock *preheader,
243
246
}
244
247
245
248
static bool rotateLoopAtMostUpToLatch (SILLoop *loop, DominanceInfo *domInfo,
246
- SILLoopInfo *loopInfo) {
249
+ SILLoopInfo *loopInfo, SILPassManager *pm ) {
247
250
auto *latch = loop->getLoopLatch ();
248
251
if (!latch) {
249
252
LLVM_DEBUG (llvm::dbgs ()
@@ -253,11 +256,11 @@ static bool rotateLoopAtMostUpToLatch(SILLoop *loop, DominanceInfo *domInfo,
253
256
254
257
bool didRotate = rotateLoop (
255
258
loop, domInfo, loopInfo,
256
- RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch);
259
+ RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch, pm );
257
260
258
261
// Keep rotating at most until we hit the original latch.
259
262
if (didRotate)
260
- while (rotateLoop (loop, domInfo, loopInfo, false , latch)) {
263
+ while (rotateLoop (loop, domInfo, loopInfo, false , latch, pm )) {
261
264
}
262
265
263
266
return didRotate;
@@ -306,7 +309,7 @@ static bool isSingleBlockLoop(SILLoop *L) {
306
309
// / loop for termination.
307
310
static bool rotateLoop (SILLoop *loop, DominanceInfo *domInfo,
308
311
SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
309
- SILBasicBlock *upToBB) {
312
+ SILBasicBlock *upToBB, SILPassManager *pm ) {
310
313
assert (loop != nullptr && domInfo != nullptr && loopInfo != nullptr
311
314
&& " Missing loop information" );
312
315
@@ -432,7 +435,7 @@ static bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
432
435
433
436
// If there were any uses of instructions in the duplicated loop entry check
434
437
// block rewrite them using the ssa updater.
435
- rewriteNewLoopEntryCheckBlock (header, preheader, valueMap);
438
+ rewriteNewLoopEntryCheckBlock (header, preheader, valueMap, pm );
436
439
437
440
loop->moveToHeader (newHeader);
438
441
@@ -498,7 +501,7 @@ class LoopRotation : public SILFunctionTransform {
498
501
SILLoop *loop = worklist.pop_back_val ();
499
502
changed |= canonicalizeLoop (loop, domInfo, loopInfo);
500
503
changed |=
501
- rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo);
504
+ rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo, getPassManager () );
502
505
}
503
506
}
504
507
0 commit comments