@@ -638,25 +638,31 @@ void AccessConflictAndMergeAnalysis::visitBeginAccess(
638
638
}
639
639
SILAccessKind beginAccessKind = beginAccess->getAccessKind ();
640
640
// check the current in-scope accesses for conflicts:
641
- for (auto pair : info.getInScopeAccesses ()) {
642
- auto *outerBeginAccess = pair.second ;
643
- // If both are reads, keep the mapped access.
644
- if (!accessKindMayConflict (beginAccessKind,
645
- outerBeginAccess->getAccessKind ())) {
646
- continue ;
647
- }
641
+ bool changed = false ;
642
+ do {
643
+ changed = false ;
644
+ for (auto pair : info.getInScopeAccesses ()) {
645
+ auto *outerBeginAccess = pair.second ;
646
+ // If both are reads, keep the mapped access.
647
+ if (!accessKindMayConflict (beginAccessKind,
648
+ outerBeginAccess->getAccessKind ())) {
649
+ continue ;
650
+ }
648
651
649
- auto &outerAccessInfo = result.getAccessInfo (outerBeginAccess);
650
- // If there is no potential conflict, leave the outer access mapped.
651
- if (!outerAccessInfo.isDistinctFrom (beginAccessInfo))
652
- continue ;
652
+ auto &outerAccessInfo = result.getAccessInfo (outerBeginAccess);
653
+ // If there is no potential conflict, leave the outer access mapped.
654
+ if (!outerAccessInfo.isDistinctFrom (beginAccessInfo))
655
+ continue ;
653
656
654
- LLVM_DEBUG (beginAccessInfo.dump (); llvm::dbgs () << " may conflict with:\n " ;
655
- outerAccessInfo.dump ());
657
+ LLVM_DEBUG (beginAccessInfo.dump ();
658
+ llvm::dbgs () << " may conflict with:\n " ;
659
+ outerAccessInfo.dump ());
656
660
657
- recordConflict (info, outerAccessInfo);
658
- break ;
659
- }
661
+ recordConflict (info, outerAccessInfo);
662
+ changed = true ;
663
+ break ;
664
+ }
665
+ } while (changed);
660
666
661
667
// Record the current access to InScopeAccesses.
662
668
// It can potentially be folded
@@ -691,22 +697,27 @@ void AccessConflictAndMergeAnalysis::detectApplyConflicts(
691
697
const swift::FunctionAccessedStorage &callSiteAccesses,
692
698
const DenseAccessMap &conflictFreeSet,
693
699
const swift::FullApplySite &fullApply, RegionInfo &info) {
694
- for (auto pair : conflictFreeSet) {
695
- auto *outerBeginAccess = pair.second ;
696
- // If there is no potential conflict, leave the outer access mapped.
697
- SILAccessKind accessKind = outerBeginAccess->getAccessKind ();
698
- AccessInfo &outerAccessInfo = result.getAccessInfo (outerBeginAccess);
699
- if (!callSiteAccesses.mayConflictWith (accessKind, outerAccessInfo))
700
- continue ;
700
+ bool changed = false ;
701
+ do {
702
+ changed = false ;
703
+ for (auto pair : conflictFreeSet) {
704
+ auto *outerBeginAccess = pair.second ;
705
+ // If there is no potential conflict, leave the outer access mapped.
706
+ SILAccessKind accessKind = outerBeginAccess->getAccessKind ();
707
+ AccessInfo &outerAccessInfo = result.getAccessInfo (outerBeginAccess);
708
+ if (!callSiteAccesses.mayConflictWith (accessKind, outerAccessInfo))
709
+ continue ;
701
710
702
- LLVM_DEBUG (
703
- llvm::dbgs () << *fullApply.getInstruction () << " call site access: " ;
704
- callSiteAccesses.dump (); llvm::dbgs () << " may conflict with:\n " ;
705
- outerAccessInfo.dump ());
711
+ LLVM_DEBUG (
712
+ llvm::dbgs () << *fullApply.getInstruction () << " call site access: " ;
713
+ callSiteAccesses.dump (); llvm::dbgs () << " may conflict with:\n " ;
714
+ outerAccessInfo.dump ());
706
715
707
- recordConflict (info, outerAccessInfo);
708
- break ;
709
- }
716
+ recordConflict (info, outerAccessInfo);
717
+ changed = true ;
718
+ break ;
719
+ }
720
+ } while (changed);
710
721
}
711
722
712
723
void AccessConflictAndMergeAnalysis::visitFullApply (FullApplySite fullApply,
@@ -761,18 +772,25 @@ void AccessConflictAndMergeAnalysis::mergePredAccesses(
761
772
void AccessConflictAndMergeAnalysis::visitSetForConflicts (
762
773
const DenseAccessMap &accessSet, RegionInfo &info,
763
774
AccessConflictAndMergeAnalysis::AccessedStorageSet &loopStorage) {
764
- for (auto pair : accessSet) {
765
- BeginAccessInst *beginAccess = pair.second ;
766
- AccessInfo &accessInfo = result.getAccessInfo (beginAccess);
767
-
768
- for (auto loopAccess : loopStorage) {
769
- if (loopAccess.isDistinctFrom (accessInfo) && !info.unidentifiedAccess )
770
- continue ;
771
-
772
- recordConflict (info, loopAccess);
773
- break ;
775
+ bool changed = false ;
776
+ do {
777
+ changed = false ;
778
+ for (auto pair : accessSet) {
779
+ BeginAccessInst *beginAccess = pair.second ;
780
+ AccessInfo &accessInfo = result.getAccessInfo (beginAccess);
781
+
782
+ for (auto loopAccess : loopStorage) {
783
+ if (loopAccess.isDistinctFrom (accessInfo) && !info.unidentifiedAccess )
784
+ continue ;
785
+
786
+ recordConflict (info, loopAccess);
787
+ changed = true ;
788
+ break ;
789
+ }
790
+ if (changed)
791
+ break ;
774
792
}
775
- }
793
+ } while (changed);
776
794
}
777
795
778
796
void AccessConflictAndMergeAnalysis::detectConflictsInLoop (
0 commit comments