@@ -319,7 +319,9 @@ class AccessConflictAndMergeAnalysis {
319
319
void addInScopeAccess (RegionInfo &info, BeginAccessInst *beginAccess);
320
320
void removeInScopeAccess (RegionInfo &info, BeginAccessInst *beginAccess);
321
321
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);
323
325
void mergeAccessStruct (RegionInfo &info,
324
326
RegionInfo::AccessSummary &accessStruct,
325
327
const RegionInfo::AccessSummary &RHSAccessStruct);
@@ -386,7 +388,7 @@ void AccessConflictAndMergeAnalysis::recordConflict(
386
388
true /* isInScope*/ );
387
389
}
388
390
389
- void AccessConflictAndMergeAnalysis::addOutOfScopeAccess (
391
+ void AccessConflictAndMergeAnalysis::addOutOfScopeAccessInsert (
390
392
RegionInfo &info, BeginAccessInst *beginAccess) {
391
393
auto newStorageInfo = result.getAccessInfo (beginAccess);
392
394
auto pred = [&](BeginAccessInst *it) {
@@ -399,10 +401,42 @@ void AccessConflictAndMergeAnalysis::addOutOfScopeAccess(
399
401
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend (), pred);
400
402
401
403
if (it == info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .rend ()) {
402
- // We don't have a match in outOfScopeConflictFreeAccesses
403
- // Just add it and return
404
404
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .insert (
405
405
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
406
440
return ;
407
441
}
408
442
@@ -418,29 +452,27 @@ void AccessConflictAndMergeAnalysis::addOutOfScopeAccess(
418
452
return !currStorageInfo.isDistinctFrom (newStorageInfo);
419
453
};
420
454
421
- auto itDistinct = std::find_if (
455
+ auto itNotDistinct = std::find_if (
422
456
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .begin (),
423
457
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end (),
424
458
predDistinct);
425
459
426
- if (itDistinct ==
460
+ if (itNotDistinct ==
427
461
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end ()) {
428
462
LLVM_DEBUG (llvm::dbgs () << " Found mergable pair: " << *otherBegin << " , "
429
463
<< *beginAccess << " \n " );
430
464
result.mergePairs .push_back (std::make_pair (otherBegin, beginAccess));
431
465
} else {
432
- while (itDistinct !=
466
+ while (itNotDistinct !=
433
467
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end ()) {
434
468
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .erase (
435
- itDistinct );
436
- itDistinct = std::find_if (
469
+ itNotDistinct );
470
+ itNotDistinct = std::find_if (
437
471
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .begin (),
438
472
info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .end (),
439
473
predDistinct);
440
474
}
441
475
}
442
-
443
- info.outOfScopeConflictFreeAccesses .conflictFreeAccesses .insert (beginAccess);
444
476
}
445
477
446
478
void AccessConflictAndMergeAnalysis::mergeAccessStruct (
@@ -678,7 +710,7 @@ void AccessConflictAndMergeAnalysis::visitBeginAccess(
678
710
// the reason for calling this method is to check for that.
679
711
// logically, we only need to add an instructio to
680
712
// out-of-scope conflict-free set when we visit end_access
681
- addOutOfScopeAccess (info, beginAccess);
713
+ addOutOfScopeAccessMerge (info, beginAccess);
682
714
}
683
715
684
716
void AccessConflictAndMergeAnalysis::visitEndAccess (EndAccessInst *endAccess,
@@ -709,7 +741,7 @@ void AccessConflictAndMergeAnalysis::visitEndAccess(EndAccessInst *endAccess,
709
741
LLVM_DEBUG (llvm::dbgs () << " Got out of scope from " << *beginAccess << " to "
710
742
<< *endAccess << " \n " );
711
743
712
- addOutOfScopeAccess (info, beginAccess);
744
+ addOutOfScopeAccessInsert (info, beginAccess);
713
745
}
714
746
715
747
void AccessConflictAndMergeAnalysis::detectApplyConflicts (
0 commit comments