@@ -673,6 +673,18 @@ struct SemanticARCOptVisitor
673
673
eraseInstruction (i);
674
674
}
675
675
676
+ // / Pop values off of visitedSinceLastMutation, adding .some values to the
677
+ // / worklist.
678
+ void drainVisitedSinceLastMutationIntoWorklist () {
679
+ while (!visitedSinceLastMutation.empty ()) {
680
+ Optional<SILValue> nextValue = visitedSinceLastMutation.pop_back_val ();
681
+ if (!nextValue.hasValue ()) {
682
+ continue ;
683
+ }
684
+ worklist.insert (*nextValue);
685
+ }
686
+ }
687
+
676
688
// / Remove all results of the given instruction from the worklist and then
677
689
// / erase the instruction. Assumes that the instruction does not have any
678
690
// / users left.
@@ -686,13 +698,7 @@ struct SemanticARCOptVisitor
686
698
i->eraseFromParent ();
687
699
688
700
// Add everything else from visitedSinceLastMutation to the worklist.
689
- for (auto opt : visitedSinceLastMutation) {
690
- if (!opt.hasValue ()) {
691
- continue ;
692
- }
693
- worklist.insert (*opt);
694
- }
695
- visitedSinceLastMutation.clear ();
701
+ drainVisitedSinceLastMutationIntoWorklist ();
696
702
}
697
703
698
704
InstModCallbacks getCallbacks () {
@@ -999,14 +1005,9 @@ bool SemanticARCOptVisitor::optimize() {
999
1005
assumingAtFixedPoint = true ;
1000
1006
SWIFT_DEFER { assumingAtFixedPoint = false ; };
1001
1007
1002
- // Add everything in visitedSinceLastMutation to the worklist.
1003
- for (auto opt : visitedSinceLastMutation) {
1004
- if (!opt.hasValue ()) {
1005
- continue ;
1006
- }
1007
- worklist.insert (*opt);
1008
- }
1009
- visitedSinceLastMutation.clear ();
1008
+ // Add everything in visitedSinceLastMutation to the worklist so we
1009
+ // recompute our fixed point.
1010
+ drainVisitedSinceLastMutationIntoWorklist ();
1010
1011
1011
1012
// Then re-run the worklist. We shouldn't modify anything since we are at a
1012
1013
// fixed point and are just using this to seed the
0 commit comments