@@ -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,34 +188,25 @@ static void updateSSAForUseOfValue(
187188 updater.rewriteUse (*use);
188189 }
189190
190- // Canonicalize inserted phis to avoid extra BB Args and if we find an address
191- // phi, stash it so we can handle it after we are done rewriting.
192- for (SILPhiArgument *arg : insertedPhis) {
193- if (SILValue inst = replaceBBArgWithCast (arg)) {
194- arg->replaceAllUsesWith (inst);
195- // DCE+SimplifyCFG runs as a post-pass cleanup.
196- // DCE replaces dead arg values with undef.
197- // SimplifyCFG deletes the dead BB arg.
198- continue ;
199- }
200- }
191+ replacePhisWithIncomingValues (pm, insertedPhis);
201192}
202193
203194static void
204195updateSSAForUseOfInst (SILSSAUpdater &updater,
205196 SmallVectorImpl<SILPhiArgument *> &insertedPhis,
206197 const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
207198 SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
208- SILInstruction *inst) {
199+ SILInstruction *inst, SILPassManager *pm ) {
209200 for (auto result : inst->getResults ())
210201 updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
211- entryCheckBlock, result);
202+ entryCheckBlock, result, pm );
212203}
213204
214205// / Rewrite the code we just created in the preheader and update SSA form.
215206static void rewriteNewLoopEntryCheckBlock (
216207 SILBasicBlock *header, SILBasicBlock *entryCheckBlock,
217- const llvm::DenseMap<ValueBase *, SILValue> &valueMap) {
208+ const llvm::DenseMap<ValueBase *, SILValue> &valueMap,
209+ SILPassManager *pm) {
218210 SmallVector<SILPhiArgument *, 8 > insertedPhis;
219211 SILSSAUpdater updater (&insertedPhis);
220212
@@ -223,7 +215,7 @@ static void rewriteNewLoopEntryCheckBlock(
223215 for (unsigned i : range (header->getNumArguments ())) {
224216 auto *arg = header->getArguments ()[i];
225217 updateSSAForUseOfValue (updater, insertedPhis, valueMap, header,
226- entryCheckBlock, arg);
218+ entryCheckBlock, arg, pm );
227219 }
228220
229221 auto instIter = header->begin ();
@@ -232,7 +224,7 @@ static void rewriteNewLoopEntryCheckBlock(
232224 while (instIter != header->end ()) {
233225 auto &inst = *instIter;
234226 updateSSAForUseOfInst (updater, insertedPhis, valueMap, header,
235- entryCheckBlock, &inst);
227+ entryCheckBlock, &inst, pm );
236228 ++instIter;
237229 }
238230}
@@ -254,7 +246,7 @@ static void updateDomTree(DominanceInfo *domInfo, SILBasicBlock *preheader,
254246}
255247
256248static bool rotateLoopAtMostUpToLatch (SILLoop *loop, DominanceInfo *domInfo,
257- SILLoopInfo *loopInfo) {
249+ SILLoopInfo *loopInfo, SILPassManager *pm ) {
258250 auto *latch = loop->getLoopLatch ();
259251 if (!latch) {
260252 LLVM_DEBUG (llvm::dbgs ()
@@ -264,11 +256,11 @@ static bool rotateLoopAtMostUpToLatch(SILLoop *loop, DominanceInfo *domInfo,
264256
265257 bool didRotate = rotateLoop (
266258 loop, domInfo, loopInfo,
267- RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch);
259+ RotateSingleBlockLoop /* rotateSingleBlockLoops */ , latch, pm );
268260
269261 // Keep rotating at most until we hit the original latch.
270262 if (didRotate)
271- while (rotateLoop (loop, domInfo, loopInfo, false , latch)) {
263+ while (rotateLoop (loop, domInfo, loopInfo, false , latch, pm )) {
272264 }
273265
274266 return didRotate;
@@ -317,7 +309,7 @@ static bool isSingleBlockLoop(SILLoop *L) {
317309// / loop for termination.
318310static bool rotateLoop (SILLoop *loop, DominanceInfo *domInfo,
319311 SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
320- SILBasicBlock *upToBB) {
312+ SILBasicBlock *upToBB, SILPassManager *pm ) {
321313 assert (loop != nullptr && domInfo != nullptr && loopInfo != nullptr
322314 && " Missing loop information" );
323315
@@ -443,7 +435,7 @@ static bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
443435
444436 // If there were any uses of instructions in the duplicated loop entry check
445437 // block rewrite them using the ssa updater.
446- rewriteNewLoopEntryCheckBlock (header, preheader, valueMap);
438+ rewriteNewLoopEntryCheckBlock (header, preheader, valueMap, pm );
447439
448440 loop->moveToHeader (newHeader);
449441
@@ -509,7 +501,7 @@ class LoopRotation : public SILFunctionTransform {
509501 SILLoop *loop = worklist.pop_back_val ();
510502 changed |= canonicalizeLoop (loop, domInfo, loopInfo);
511503 changed |=
512- rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo);
504+ rotateLoopAtMostUpToLatch (loop, domInfo, loopInfo, getPassManager () );
513505 }
514506 }
515507
0 commit comments