Skip to content

Commit 25f24da

Browse files
committed
Cleanup the recordConflict API.
And remove cubic behavior.
1 parent 5183929 commit 25f24da

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ class AccessConflictAndMergeAnalysis {
319319
private:
320320
void addInScopeAccess(RegionState &state, BeginAccessInst *beginAccess);
321321
void removeInScopeAccess(RegionState &state, BeginAccessInst *beginAccess);
322-
void recordConflict(RegionState &state, const AccessedStorage &storage);
322+
void recordConflicts(RegionState &state, const AccessedStorage &currStorage);
323323
void addOutOfScopeAccessInsert(RegionState &state,
324324
BeginAccessInst *beginAccess);
325325
void addOutOfScopeAccessMerge(RegionState &state, BeginAccessInst *beginAccess);
@@ -360,32 +360,32 @@ void AccessConflictAndMergeAnalysis::removeInScopeAccess(
360360
state.inScopeConflictFreeAccesses.conflictFreeAccesses.erase(it);
361361
}
362362

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+
});
389389
}
390390

391391
void AccessConflictAndMergeAnalysis::addOutOfScopeAccessInsert(
@@ -681,7 +681,7 @@ void AccessConflictAndMergeAnalysis::visitBeginAccess(
681681
llvm::dbgs() << " may conflict with:\n";
682682
outerAccessInfo.dump());
683683

684-
recordConflict(state, outerAccessInfo);
684+
recordConflicts(state, outerAccessInfo);
685685
changed = true;
686686
break;
687687
}
@@ -763,7 +763,7 @@ void AccessConflictAndMergeAnalysis::detectApplyConflicts(
763763
callSiteAccesses.dump(); llvm::dbgs() << " may conflict with:\n";
764764
outerAccessInfo.dump());
765765

766-
recordConflict(state, outerAccessInfo);
766+
recordConflicts(state, outerAccessInfo);
767767
changed = true;
768768
break;
769769
}
@@ -803,7 +803,7 @@ void AccessConflictAndMergeAnalysis::detectMayReleaseConflicts(
803803
LLVM_DEBUG(llvm::dbgs() << "MayRelease Instruction: " << *instr
804804
<< " may conflict with:\n";
805805
outerAccessInfo.dump());
806-
recordConflict(state, outerAccessInfo);
806+
recordConflicts(state, outerAccessInfo);
807807
changed = true;
808808
break;
809809
}
@@ -867,7 +867,7 @@ void AccessConflictAndMergeAnalysis::visitSetForConflicts(
867867
if (loopAccess.isDistinctFrom(accessInfo) && !state.unidentifiedAccess)
868868
continue;
869869

870-
recordConflict(state, loopAccess);
870+
recordConflicts(state, loopAccess);
871871
changed = true;
872872
break;
873873
}

0 commit comments

Comments
 (0)