Merge pull request #18890 from shajrawi/iter_bugfix

diff --git a/lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp b/lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp
index f16f0b7..e59883f 100644
--- a/lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp
+++ b/lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp
@@ -638,25 +638,31 @@
   }
   SILAccessKind beginAccessKind = beginAccess->getAccessKind();
   // check the current in-scope accesses for conflicts:
-  for (auto pair : info.getInScopeAccesses()) {
-    auto *outerBeginAccess = pair.second;
-    // If both are reads, keep the mapped access.
-    if (!accessKindMayConflict(beginAccessKind,
-                               outerBeginAccess->getAccessKind())) {
-      continue;
+  bool changed = false;
+  do {
+    changed = false;
+    for (auto pair : info.getInScopeAccesses()) {
+      auto *outerBeginAccess = pair.second;
+      // If both are reads, keep the mapped access.
+      if (!accessKindMayConflict(beginAccessKind,
+                                 outerBeginAccess->getAccessKind())) {
+        continue;
+      }
+
+      auto &outerAccessInfo = result.getAccessInfo(outerBeginAccess);
+      // If there is no potential conflict, leave the outer access mapped.
+      if (!outerAccessInfo.isDistinctFrom(beginAccessInfo))
+        continue;
+
+      LLVM_DEBUG(beginAccessInfo.dump();
+                 llvm::dbgs() << "  may conflict with:\n";
+                 outerAccessInfo.dump());
+
+      recordConflict(info, outerAccessInfo);
+      changed = true;
+      break;
     }
-
-    auto &outerAccessInfo = result.getAccessInfo(outerBeginAccess);
-    // If there is no potential conflict, leave the outer access mapped.
-    if (!outerAccessInfo.isDistinctFrom(beginAccessInfo))
-      continue;
-
-    LLVM_DEBUG(beginAccessInfo.dump(); llvm::dbgs() << "  may conflict with:\n";
-               outerAccessInfo.dump());
-
-    recordConflict(info, outerAccessInfo);
-    break;
-  }
+  } while (changed);
 
   // Record the current access to InScopeAccesses.
   // It can potentially be folded
@@ -691,22 +697,27 @@
     const swift::FunctionAccessedStorage &callSiteAccesses,
     const DenseAccessMap &conflictFreeSet,
     const swift::FullApplySite &fullApply, RegionInfo &info) {
-  for (auto pair : conflictFreeSet) {
-    auto *outerBeginAccess = pair.second;
-    // If there is no potential conflict, leave the outer access mapped.
-    SILAccessKind accessKind = outerBeginAccess->getAccessKind();
-    AccessInfo &outerAccessInfo = result.getAccessInfo(outerBeginAccess);
-    if (!callSiteAccesses.mayConflictWith(accessKind, outerAccessInfo))
-      continue;
+  bool changed = false;
+  do {
+    changed = false;
+    for (auto pair : conflictFreeSet) {
+      auto *outerBeginAccess = pair.second;
+      // If there is no potential conflict, leave the outer access mapped.
+      SILAccessKind accessKind = outerBeginAccess->getAccessKind();
+      AccessInfo &outerAccessInfo = result.getAccessInfo(outerBeginAccess);
+      if (!callSiteAccesses.mayConflictWith(accessKind, outerAccessInfo))
+        continue;
 
-    LLVM_DEBUG(
-        llvm::dbgs() << *fullApply.getInstruction() << "  call site access: ";
-        callSiteAccesses.dump(); llvm::dbgs() << "  may conflict with:\n";
-        outerAccessInfo.dump());
+      LLVM_DEBUG(
+          llvm::dbgs() << *fullApply.getInstruction() << "  call site access: ";
+          callSiteAccesses.dump(); llvm::dbgs() << "  may conflict with:\n";
+          outerAccessInfo.dump());
 
-    recordConflict(info, outerAccessInfo);
-    break;
-  }
+      recordConflict(info, outerAccessInfo);
+      changed = true;
+      break;
+    }
+  } while (changed);
 }
 
 void AccessConflictAndMergeAnalysis::visitFullApply(FullApplySite fullApply,
@@ -761,18 +772,25 @@
 void AccessConflictAndMergeAnalysis::visitSetForConflicts(
     const DenseAccessMap &accessSet, RegionInfo &info,
     AccessConflictAndMergeAnalysis::AccessedStorageSet &loopStorage) {
-  for (auto pair : accessSet) {
-    BeginAccessInst *beginAccess = pair.second;
-    AccessInfo &accessInfo = result.getAccessInfo(beginAccess);
+  bool changed = false;
+  do {
+    changed = false;
+    for (auto pair : accessSet) {
+      BeginAccessInst *beginAccess = pair.second;
+      AccessInfo &accessInfo = result.getAccessInfo(beginAccess);
 
-    for (auto loopAccess : loopStorage) {
-      if (loopAccess.isDistinctFrom(accessInfo) && !info.unidentifiedAccess)
-        continue;
+      for (auto loopAccess : loopStorage) {
+        if (loopAccess.isDistinctFrom(accessInfo) && !info.unidentifiedAccess)
+          continue;
 
-      recordConflict(info, loopAccess);
-      break;
+        recordConflict(info, loopAccess);
+        changed = true;
+        break;
+      }
+      if (changed)
+        break;
     }
-  }
+  } while (changed);
 }
 
 void AccessConflictAndMergeAnalysis::detectConflictsInLoop(