[PATCH] D63981: [LV] Avoid building interleaved group in presence of WAW dependency

Evgeniy via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 11 04:45:45 PDT 2019


ebrevnov added a comment.

In D63981#1579704 <https://reviews.llvm.org/D63981#1579704>, @Ayal wrote:

> From the SUMMARY above:
>
> > I don't think we actually need to do any additional book keeping (as suggested in D57180 <https://reviews.llvm.org/D57180>). Current algorithm already examines all pairs and in case of dependence will invalidate interleaving group. I think the real issue is WAW dependence (on the same iteration) is not collected by LoopAccessInfo in the first place and as a result canReorderMemAccessesForInterleavedGroups returns wrong answer. The fix is to explicitly check for WAW dependence in canReorderMemAccessesForInterleavedGroups.
>
> Nice catch! Agree about the real issue being a deficiency of LoopAccessInfo, and that it's better to treat all interleave-group-preventing dependencies the same, w/o dedicating special treatment for same-iteration WAW dependences. Suggest to fix this real issue at its core.
>
> LoopAccessInfo does collect the 6 same-iteration WAR Forward dependences between each of the 3 loads and their 2 subsequent same-address stores, in the testcase below, but these do not interfere with interleave-grouping the stores. So it's perfectly capable of collecting same-iteration WAW Forward dependences as well. (LoopAccessInfo should also already collect any same-iteration RAW dependences, although such cases would hopefully be optimized away.)
>
> The reason why LoopAccessInfo does not collect same-iteration WAW dependences is due to the way areDepsSafe() traverses pairs of DependentAccesses, held in EquivalenceClasses<MemAccessInfo> which clusters stores-to-same-address together (and load-to-same-address together, but separately from the stores). One way of fixing this may be:
>
>   diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
>   index 36bd9a8b7ea..a3f40826861 100644
>   --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
>   +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
>   @@ -1641,13 +1641,21 @@ bool MemoryDepChecker::areDepsSafe(DepCandidates &AccessSets,
>        // Check every access pair.
>        while (AI != AE) {
>          Visited.insert(*AI);
>   -      EquivalenceClasses<MemAccessInfo>::member_iterator OI = std::next(AI);
>   +      bool AIIsWrite = AI->getInt();
>   +      // Check loads only against next equivalent class, but stores also against
>   +      // other stores in the same equivalence class - to the same address.
>   +      EquivalenceClasses<MemAccessInfo>::member_iterator OI =
>   +          (AIIsWrite ? AI : std::next(AI));
>          while (OI != AE) {
>            // Check every accessing instruction pair in program order.
>            for (std::vector<unsigned>::iterator I1 = Accesses[*AI].begin(),
>                 I1E = Accesses[*AI].end(); I1 != I1E; ++I1)
>   -          for (std::vector<unsigned>::iterator I2 = Accesses[*OI].begin(),
>   -               I2E = Accesses[*OI].end(); I2 != I2E; ++I2) {
>   +          // Scan all accesses of another equivalence class, but only the next
>   +          // accesses of the same equivalent class.
>   +          for (std::vector<unsigned>::iterator
>   +                   I2 = (OI == AI ? std::next(I1) : Accesses[*OI].begin()),
>   +                   I2E = (OI == AI ? I1E : Accesses[*OI].end());
>   +               I2 != I2E; ++I2) {
>                auto A = std::make_pair(&*AI, *I1);
>                auto B = std::make_pair(&*OI, *I2);
>
>
> (could possibly save dependences by recording only those between pairs of adjacent stores to same address, relying on transitivity)


Ayal, thanks for paying attention to this :-). Solution your are proposing looks more solid to me. But I'm a bit worry if reporting such WAW dependencies by LoopAccessInfo will affect many other places...and possibly compile time. What do you think?


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63981/new/

https://reviews.llvm.org/D63981





More information about the llvm-commits mailing list