Skip to content

Commit 1d77d8b

Browse files
committed
Minor refactoring of the SingleExitLoopTransformer code for reuse.
1 parent 339bc84 commit 1d77d8b

File tree

1 file changed

+28
-19
lines changed

1 file changed

+28
-19
lines changed

lib/SILOptimizer/Mandatory/TFCanonicalizeCFG.cpp

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -514,24 +514,38 @@ class BasicBlockCloner : public SILClonerWithScopes<BasicBlockCloner> {
514514

515515
// A helper class to transform a loop to have a single exit from the header.
516516
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();
528543
}
529544

530545
/// Transforms the loop to ensure it has a single exit from the header.
531546
/// Returns true if the CFG was changed.
532547
bool transform();
533548

534-
private:
535549
// Helper functions
536550

537551
void initialize();
@@ -1283,13 +1297,8 @@ void SESERegionBuilder::ensureSingleExitFromLoops() {
12831297
}
12841298
continue;
12851299
}
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);
12931302
changed |= loopChanged;
12941303
}
12951304
if (changed) {

0 commit comments

Comments
 (0)