@@ -319,7 +319,7 @@ class AccessConflictAndMergeAnalysis {
319
319
private:
320
320
void addInScopeAccess (RegionState &state, BeginAccessInst *beginAccess);
321
321
void removeInScopeAccess (RegionState &state, BeginAccessInst *beginAccess);
322
- void recordConflict (RegionState &state, const AccessedStorage &storage );
322
+ void recordConflicts (RegionState &state, const AccessedStorage &currStorage );
323
323
void addOutOfScopeAccessInsert (RegionState &state,
324
324
BeginAccessInst *beginAccess);
325
325
void addOutOfScopeAccessMerge (RegionState &state, BeginAccessInst *beginAccess);
@@ -360,32 +360,32 @@ void AccessConflictAndMergeAnalysis::removeInScopeAccess(
360
360
state.inScopeConflictFreeAccesses .conflictFreeAccesses .erase (it);
361
361
}
362
362
363
- void AccessConflictAndMergeAnalysis::removeConflictFromStruct (
364
- RegionState &state, RegionState::AccessSummary &accessStruct,
365
- const AccessedStorage &storage, bool isInScope) {
366
- auto pred = [&](BeginAccessInst *it) {
367
- auto &currStorage = result. getAccessInfo (it);
368
- return !currStorage. isDistinctFrom (storage);
369
- };
370
- auto it = std::find_if (accessStruct. conflictFreeAccesses . begin (),
371
- accessStruct. conflictFreeAccesses . end (), pred );
372
- while (it != accessStruct. conflictFreeAccesses . end ()) {
373
- if (isInScope) {
374
- auto &ai = result. getAccessInfo (*it);
375
- ai. setSeenNestedConflict ();
376
- }
377
- accessStruct. conflictFreeAccesses . erase (it);
378
- it = std::find_if (accessStruct. conflictFreeAccesses . begin (),
379
- accessStruct. conflictFreeAccesses . end (), pred );
380
- }
381
- }
382
-
383
- void AccessConflictAndMergeAnalysis::recordConflict (
384
- RegionState & state, const AccessedStorage &storage) {
385
- removeConflictFromStruct (state, state. outOfScopeConflictFreeAccesses , storage,
386
- false /* isInScope */ );
387
- removeConflictFromStruct (state, state. inScopeConflictFreeAccesses , storage,
388
- true /* isInScope */ );
363
+ // Update data flow `state` by removing accesses that conflict with the
364
+ // currently accessed `storage`. For in-scope accesses, also mark conflicting
365
+ // scopes with SeenNestedConflict.
366
+ void AccessConflictAndMergeAnalysis::recordConflicts (
367
+ RegionState &state, const AccessedStorage &currStorage) {
368
+ // Remove any out-of-scope conflicts.
369
+ state. outOfScopeConflictFreeAccesses . conflictFreeAccesses . remove_if (
370
+ [&](BeginAccessInst *bai) {
371
+ auto &storage = result. getAccessInfo (bai );
372
+ return !storage. isDistinctFrom (currStorage);
373
+ });
374
+
375
+ // Since SetVector does not support `llvm::erase_if`, we use two loops. One to
376
+ // mark conflicts and another to remove them all via `remove_if`.
377
+ llvm::for_each (state. inScopeConflictFreeAccesses . conflictFreeAccesses ,
378
+ [&](BeginAccessInst *bai) {
379
+ auto &ai = result. getAccessInfo (bai );
380
+ if (!ai. isDistinctFrom (currStorage))
381
+ ai. setSeenNestedConflict ();
382
+ });
383
+
384
+ state. inScopeConflictFreeAccesses . conflictFreeAccesses . remove_if (
385
+ [&](BeginAccessInst *bai) {
386
+ auto &storage = result. getAccessInfo (bai );
387
+ return ! storage. isDistinctFrom (currStorage);
388
+ } );
389
389
}
390
390
391
391
void AccessConflictAndMergeAnalysis::addOutOfScopeAccessInsert (
@@ -681,7 +681,7 @@ void AccessConflictAndMergeAnalysis::visitBeginAccess(
681
681
llvm::dbgs () << " may conflict with:\n " ;
682
682
outerAccessInfo.dump ());
683
683
684
- recordConflict (state, outerAccessInfo);
684
+ recordConflicts (state, outerAccessInfo);
685
685
changed = true ;
686
686
break ;
687
687
}
@@ -763,7 +763,7 @@ void AccessConflictAndMergeAnalysis::detectApplyConflicts(
763
763
callSiteAccesses.dump (); llvm::dbgs () << " may conflict with:\n " ;
764
764
outerAccessInfo.dump ());
765
765
766
- recordConflict (state, outerAccessInfo);
766
+ recordConflicts (state, outerAccessInfo);
767
767
changed = true ;
768
768
break ;
769
769
}
@@ -803,7 +803,7 @@ void AccessConflictAndMergeAnalysis::detectMayReleaseConflicts(
803
803
LLVM_DEBUG (llvm::dbgs () << " MayRelease Instruction: " << *instr
804
804
<< " may conflict with:\n " ;
805
805
outerAccessInfo.dump ());
806
- recordConflict (state, outerAccessInfo);
806
+ recordConflicts (state, outerAccessInfo);
807
807
changed = true ;
808
808
break ;
809
809
}
@@ -867,7 +867,7 @@ void AccessConflictAndMergeAnalysis::visitSetForConflicts(
867
867
if (loopAccess.isDistinctFrom (accessInfo) && !state.unidentifiedAccess )
868
868
continue ;
869
869
870
- recordConflict (state, loopAccess);
870
+ recordConflicts (state, loopAccess);
871
871
changed = true ;
872
872
break ;
873
873
}
0 commit comments