@@ -46,7 +46,7 @@ static llvm::cl::opt<bool> RotateSingleBlockLoop("looprotate-single-block-loop",
4646
4747static bool rotateLoop (SILLoop *loop, DominanceInfo *domInfo,
4848 SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
49- SILBasicBlock *upToBB);
49+ SILBasicBlock *upToBB, SILPassManager *pm );
5050
5151// / Check whether all operands are loop invariant.
5252static bool
@@ -151,7 +151,8 @@ static void mapOperands(SILInstruction *inst,
151151static void updateSSAForUseOfValue (
152152 SILSSAUpdater &updater, SmallVectorImpl<SILPhiArgument *> &insertedPhis,
153153 const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
154- SILBasicBlock *Header, SILBasicBlock *EntryCheckBlock, SILValue Res) {
154+ SILBasicBlock *Header, SILBasicBlock *EntryCheckBlock, SILValue Res,
155+ SILPassManager *pm) {
155156 // Find the mapped instruction.
156157 assert (valueMap.count (Res) && " Expected to find value in map!" );
157158 SILValue MappedValue = valueMap.find (Res)->second ;
@@ -187,23 +188,25 @@ static void updateSSAForUseOfValue(
187188 updater.rewriteUse (*use);
188189 }
189190
191+ replacePhisWithIncomingValues (pm, insertedPhis);
190192}
191193
192194static void
193195updateSSAForUseOfInst (SILSSAUpdater &updater,
194196 SmallVectorImpl<SILPhiArgument *> &insertedPhis,
195197 const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
196198 SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
197- SILInstruction *inst) {
199+ SILInstruction *inst, SILPassManager *pm ) {
198200 for (auto result : inst->getResults ())
199201 updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
200- entryCheckBlock, result);
202+ entryCheckBlock, result, pm );
201203}
202204
203205// / Rewrite the code we just created in the preheader and update SSA form.
204206static void rewriteNewLoopEntryCheckBlock (
205207 SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
206- const llvm::DenseMap<ValueBase *, SILValue> &valueMap) {
208+ const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
209+ SILPassManager *pm) {
207210 SmallVector<SILPhiArgument *, 8 > insertedPhis;
208211 SILSSAUpdater updater (&insertedPhis);
209212
@@ -212,7 +215,7 @@ static void rewriteNewLoopEntryCheckBlock(
212215 for (unsigned i : range (header->getNumArguments ())) {
213216 auto *arg = header->getArguments ()[i];
214217 updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
215- entryCheckBlock, arg);
218+ entryCheckBlock, arg, pm );
216219 }
217220
218221 auto instIter = header->begin ();
@@ -221,7 +224,7 @@ static void rewriteNewLoopEntryCheckBlock(
221224 while (instIter != header->end ()) {
222225 auto &inst = *instIter;
223226 updateSSAForUseOfInst (updater, insertedPhis, valueMap, header,
224- entryCheckBlock, &inst);
227+ entryCheckBlock, &inst, pm );
225228 ++instIter;
226229 }
227230}
@@ -243,7 +246,7 @@ static void updateDomTree(DominanceInfo *domInfo, SILBasicBlock *preheader,
243246}
244247
245248static bool rotateLoopAtMostUpToLatch (SILLoop *loop, DominanceInfo *domInfo,
246- SILLoopInfo *loopInfo) {
249+ SILLoopInfo *loopInfo, SILPassManager *pm ) {
247250 auto *latch = loop->getLoopLatch ();
248251 if (!latch) {
249252 LLVM_DEBUG (llvm::dbgs ()
@@ -253,11 +256,11 @@ static bool rotateLoopAtMostUpToLatch(SILLoop *loop, DominanceInfo *domInfo,
253256
254257 bool didRotate = rotateLoop (
255258 loop, domInfo, loopInfo,
256- RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch);
259+ RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch, pm );
257260
258261 // Keep rotating at most until we hit the original latch.
259262 if (didRotate)
260- while (rotateLoop (loop, domInfo, loopInfo, false , latch)) {
263+ while (rotateLoop (loop, domInfo, loopInfo, false , latch, pm )) {
261264 }
262265
263266 return didRotate;
@@ -306,7 +309,7 @@ static bool isSingleBlockLoop(SILLoop *L) {
306309// / loop for termination.
307310static bool rotateLoop (SILLoop *loop, DominanceInfo *domInfo,
308311 SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
309- SILBasicBlock *upToBB) {
312+ SILBasicBlock *upToBB, SILPassManager *pm ) {
310313 assert (loop != nullptr && domInfo != nullptr && loopInfo != nullptr
311314 && " Missing loop information" );
312315
@@ -432,7 +435,7 @@ static bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
432435
433436 // If there were any uses of instructions in the duplicated loop entry check
434437 // block rewrite them using the ssa updater.
435- rewriteNewLoopEntryCheckBlock (header, preheader, valueMap);
438+ rewriteNewLoopEntryCheckBlock (header, preheader, valueMap, pm );
436439
437440 loop->moveToHeader (newHeader);
438441
@@ -498,7 +501,7 @@ class LoopRotation : public SILFunctionTransform {
498501 SILLoop *loop = worklist.pop_back_val ();
499502 changed |= canonicalizeLoop (loop, domInfo, loopInfo);
500503 changed |=
501- rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo);
504+ rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo, getPassManager () );
502505 }
503506 }
504507
0 commit comments