File tree Expand file tree Collapse file tree 2 files changed +43
-0
lines changed
include/swift/SILOptimizer/Utils Expand file tree Collapse file tree 2 files changed +43
-0
lines changed Original file line number Diff line number Diff line change @@ -125,6 +125,16 @@ bool hasCriticalEdges(SILFunction &F, bool OnlyNonCondBr);
125
125
bool splitAllCriticalEdges (SILFunction &F, bool OnlyNonCondBr,
126
126
DominanceInfo *DT, SILLoopInfo *LI);
127
127
128
+ // / \brief Split all cond_br critical edges with non-trivial arguments in the
129
+ // / function updating the dominator tree and loop information (if they are not
130
+ // / set to null).
131
+ // /
132
+ // / A current invariant of Ownership SIL is that cond_br can only have critical
133
+ // / edges with non-trivial arguments. This simplifies computation.
134
+ bool splitAllCondBrCriticalEdgesWithNonTrivialArgs (SILFunction &F,
135
+ DominanceInfo *DT,
136
+ SILLoopInfo *LI);
137
+
128
138
// / \brief Merge a basic block ending in a branch with its successor
129
139
// / if possible. If dominance information or loop info is non null update it.
130
140
// / Return true if block was merged.
Original file line number Diff line number Diff line change @@ -930,3 +930,36 @@ void swift::completeJointPostDominanceSet(
930
930
// list. These are the remaining parts of our joint post-dominance closure.
931
931
copy (MustVisitSuccessorBlocks, std::back_inserter (Result));
932
932
}
933
+
934
+ bool swift::splitAllCondBrCriticalEdgesWithNonTrivialArgs (SILFunction &Fn,
935
+ DominanceInfo *DT,
936
+ SILLoopInfo *LI) {
937
+ // Find our targets.
938
+ llvm::SmallVector<std::pair<SILBasicBlock *, unsigned >, 8 > Targets;
939
+ for (auto &Block : Fn) {
940
+ auto *CBI = dyn_cast<CondBranchInst>(Block.getTerminator ());
941
+ if (!CBI)
942
+ continue ;
943
+
944
+ // See if our true index is a critical edge. If so, add block to the list
945
+ // and continue. If the false edge is also critical, we will handle it at
946
+ // the same time.
947
+ if (isCriticalEdge (CBI, CondBranchInst::TrueIdx)) {
948
+ Targets.emplace_back (&Block, CondBranchInst::TrueIdx);
949
+ }
950
+
951
+ if (!isCriticalEdge (CBI, CondBranchInst::FalseIdx)) {
952
+ continue ;
953
+ }
954
+
955
+ Targets.emplace_back (&Block, CondBranchInst::FalseIdx);
956
+ }
957
+
958
+ for (auto P : Targets) {
959
+ SILBasicBlock *Block = P.first ;
960
+ unsigned Index = P.second ;
961
+ auto *Result = splitCriticalEdge (Block->getTerminator (), Index, DT, LI);
962
+ (void )Result;
963
+ assert (Result);
964
+ }
965
+ }
You can’t perform that action at this time.
0 commit comments