@@ -319,7 +319,9 @@ class AccessConflictAndMergeAnalysis {
319319 void addInScopeAccess (RegionInfo &info, BeginAccessInst *beginAccess);
320320 void removeInScopeAccess (RegionInfo &info, BeginAccessInst *beginAccess);
321321 void recordConflict (RegionInfo &info, const AccessedStorage &storage);
322- void addOutOfScopeAccess (RegionInfo &info, BeginAccessInst *beginAccess);
322+ void addOutOfScopeAccessInsert (RegionInfo &info,
323+ BeginAccessInst *beginAccess);
324+ void addOutOfScopeAccessMerge (RegionInfo &info, BeginAccessInst *beginAccess);
323325 void mergeAccessStruct (RegionInfo &info,
324326 RegionInfo::AccessSummary &accessStruct,
325327 const RegionInfo::AccessSummary &RHSAccessStruct);
@@ -386,7 +388,7 @@ void AccessConflictAndMergeAnalysis::recordConflict(
386388 true /* isInScope*/ );
387389}
388390
389- void AccessConflictAndMergeAnalysis::addOutOfScopeAccess (
391+ void AccessConflictAndMergeAnalysis::addOutOfScopeAccessInsert (
390392 RegionInfo &info, BeginAccessInst *beginAccess) {
391393 auto newStorageInfo = result.getAccessInfo (beginAccess);
392394 auto pred = [&](BeginAccessInst *it) {
@@ -399,10 +401,42 @@ void AccessConflictAndMergeAnalysis::addOutOfScopeAccess(
399401 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend (), pred);
400402
401403 if (it == info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend ()) {
402- // We don't have a match in outOfScopeConflictFreeAccesses
403- // Just add it and return
404404 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .insert (
405405 beginAccess);
406+ } else {
407+ // we have a nested read case:
408+ /* %4 = begin_access [read] [dynamic] %0 : $*X
409+ %5 = load %4 : $*X
410+ %7 = begin_access [read] [dynamic] %0 : $*X
411+ %8 = load %7 : $*X
412+ end_access %7 : $*X
413+ end_access %4 : $*X*/
414+ // we should remove the current one and insert the new.
415+ auto *otherBegin = *it;
416+ auto rmIt = std::find (
417+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .begin (),
418+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end (),
419+ otherBegin);
420+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .erase (rmIt);
421+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .insert (
422+ beginAccess);
423+ }
424+ }
425+
426+ void AccessConflictAndMergeAnalysis::addOutOfScopeAccessMerge (
427+ RegionInfo &info, BeginAccessInst *beginAccess) {
428+ auto newStorageInfo = result.getAccessInfo (beginAccess);
429+ auto pred = [&](BeginAccessInst *it) {
430+ auto currStorageInfo = result.getAccessInfo (it);
431+ return currStorageInfo.hasIdenticalBase (newStorageInfo);
432+ };
433+
434+ auto it = std::find_if (
435+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rbegin (),
436+ info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend (), pred);
437+
438+ if (it == info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend ()) {
439+ // We don't have a match in outOfScopeConflictFreeAccesses - return
406440 return ;
407441 }
408442
@@ -418,29 +452,27 @@ void AccessConflictAndMergeAnalysis::addOutOfScopeAccess(
418452 return !currStorageInfo.isDistinctFrom (newStorageInfo);
419453 };
420454
421- auto itDistinct = std::find_if (
455+ auto itNotDistinct = std::find_if (
422456 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .begin (),
423457 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end (),
424458 predDistinct);
425459
426- if (itDistinct ==
460+ if (itNotDistinct ==
427461 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end ()) {
428462 LLVM_DEBUG (llvm::dbgs () << " Found mergable pair: " << *otherBegin << " , "
429463 << *beginAccess << " \n " );
430464 result.mergePairs .push_back (std::make_pair (otherBegin, beginAccess));
431465 } else {
432- while (itDistinct !=
466+ while (itNotDistinct !=
433467 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end ()) {
434468 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .erase (
435- itDistinct );
436- itDistinct = std::find_if (
469+ itNotDistinct );
470+ itNotDistinct = std::find_if (
437471 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .begin (),
438472 info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end (),
439473 predDistinct);
440474 }
441475 }
442-
443- info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .insert (beginAccess);
444476}
445477
446478void AccessConflictAndMergeAnalysis::mergeAccessStruct (
@@ -678,7 +710,7 @@ void AccessConflictAndMergeAnalysis::visitBeginAccess(
678710 // the reason for calling this method is to check for that.
679711 // logically, we only need to add an instructio to
680712 // out-of-scope conflict-free set when we visit end_access
681- addOutOfScopeAccess (info, beginAccess);
713+ addOutOfScopeAccessMerge (info, beginAccess);
682714}
683715
684716void AccessConflictAndMergeAnalysis::visitEndAccess (EndAccessInst *endAccess,
@@ -709,7 +741,7 @@ void AccessConflictAndMergeAnalysis::visitEndAccess(EndAccessInst *endAccess,
709741 LLVM_DEBUG (llvm::dbgs () << " Got out of scope from " << *beginAccess << " to "
710742 << *endAccess << " \n " );
711743
712- addOutOfScopeAccess (info, beginAccess);
744+ addOutOfScopeAccessInsert (info, beginAccess);
713745}
714746
715747void AccessConflictAndMergeAnalysis::detectApplyConflicts (
0 commit comments