@@ -514,24 +514,38 @@ class BasicBlockCloner : public SILClonerWithScopes<BasicBlockCloner> {
514
514
515
515
// A helper class to transform a loop to have a single exit from the header.
516
516
class SingleExitLoopTransformer {
517
- public:
518
- SingleExitLoopTransformer (GraphFunctionDeviceInfo *deviceInfo,
519
- SILLoopInfo *LI, DominanceInfo *DI, SILLoop *loop,
520
- PostDominanceInfo *PDI)
521
- : deviceInfo(deviceInfo), DI(DI), PDI(PDI), LI(LI), loop(loop),
522
- header (loop->getHeader ()), preheader(loop->getLoopPreheader ()),
523
- latch(loop->getLoopLatch ()), currentFn(header->getParent ()),
524
- oldHeaderNumArgs(header->getNumArguments ()), hasUndefsAtPreheader(false ) {
525
- assert (preheader && " Canonicalization should have given us one preheader" );
526
- assert (latch && " Canonicalization should have given us one latch block" );
527
- initialize ();
517
+ public:
518
+ static bool doIt (GraphFunctionDeviceInfo *deviceInfo, SILLoopInfo *LI,
519
+ DominanceInfo *DI, SILLoop *loop, PostDominanceInfo *PDI) {
520
+ SingleExitLoopTransformer transformer (deviceInfo, LI, DI, loop, PDI);
521
+ bool loopChanged = transformer.transform ();
522
+ if (loopChanged) {
523
+ // Recalculate dominator information as it is stale now.
524
+ DI->recalculate (*transformer.currentFn );
525
+ PDI->recalculate (*transformer.currentFn );
526
+ }
527
+ return loopChanged;
528
+ }
529
+
530
+ private:
531
+ SingleExitLoopTransformer (GraphFunctionDeviceInfo *deviceInfo,
532
+ SILLoopInfo *LI, DominanceInfo *DI, SILLoop *loop,
533
+ PostDominanceInfo *PDI)
534
+ : deviceInfo(deviceInfo), DI(DI), PDI(PDI), LI(LI), loop(loop),
535
+ header (loop->getHeader ()), preheader(loop->getLoopPreheader ()),
536
+ latch(loop->getLoopLatch ()), currentFn(header->getParent ()),
537
+ oldHeaderNumArgs(header->getNumArguments ()),
538
+ hasUndefsAtPreheader(false ) {
539
+ assert (preheader &&
540
+ " Canonicalization should have given us one preheader" );
541
+ assert (latch && " Canonicalization should have given us one latch block" );
542
+ initialize ();
528
543
}
529
544
530
545
// / Transforms the loop to ensure it has a single exit from the header.
531
546
// / Returns true if the CFG was changed.
532
547
bool transform ();
533
548
534
- private:
535
549
// Helper functions
536
550
537
551
void initialize ();
@@ -1283,13 +1297,8 @@ void SESERegionBuilder::ensureSingleExitFromLoops() {
1283
1297
}
1284
1298
continue ;
1285
1299
}
1286
- SingleExitLoopTransformer transformer (&deviceInfo, &LI, &DI, loop, &PDI);
1287
- bool loopChanged = transformer.transform ();
1288
- if (loopChanged) {
1289
- // Recalculate dominator information as it is stale now.
1290
- DI.recalculate (*F);
1291
- PDI.recalculate (*F);
1292
- }
1300
+ bool loopChanged =
1301
+ SingleExitLoopTransformer::doIt (&deviceInfo, &LI, &DI, loop, &PDI);
1293
1302
changed |= loopChanged;
1294
1303
}
1295
1304
if (changed) {
0 commit comments