Skip to content

Commit c1164c0

Browse files
committed
Add splitCriticalEdgesFrom API.
1 parent 12bb49f commit c1164c0

File tree

2 files changed

+14
-0
lines changed
  • include/swift/SILOptimizer/Utils
  • lib/SILOptimizer/Utils

2 files changed

+14
-0
lines changed

include/swift/SILOptimizer/Utils/CFG.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ SILBasicBlock *splitIfCriticalEdge(SILBasicBlock *From, SILBasicBlock *To,
7676
DominanceInfo *DT = nullptr,
7777
SILLoopInfo *LI = nullptr);
7878

79+
/// Splits all critical edges originating from `fromBB`.
80+
bool splitCriticalEdgesFrom(SILBasicBlock *fromBB, DominanceInfo *DT = nullptr,
81+
SILLoopInfo *LI = nullptr);
82+
7983
/// \brief Splits the edges between two basic blocks.
8084
///
8185
/// Updates dominance information and loop information if not null.

lib/SILOptimizer/Utils/CFG.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,16 @@ SILBasicBlock *swift::splitCriticalEdge(TermInst *T, unsigned EdgeIdx,
411411
return splitEdge(T, EdgeIdx, DT, LI);
412412
}
413413

414+
bool swift::splitCriticalEdgesFrom(SILBasicBlock *fromBB, DominanceInfo *DT,
415+
SILLoopInfo *LI) {
416+
bool Changed = false;
417+
for (unsigned idx = 0, e = fromBB->getSuccessors().size(); idx != e; ++idx) {
418+
auto *NewBB = splitCriticalEdge(fromBB->getTerminator(), idx, DT, LI);
419+
Changed |= (NewBB != nullptr);
420+
}
421+
return Changed;
422+
}
423+
414424
bool swift::hasCriticalEdges(SILFunction &F, bool OnlyNonCondBr) {
415425
for (SILBasicBlock &BB : F) {
416426
// Only consider critical edges for terminators that don't support block

0 commit comments

Comments
 (0)