diff options
author | Hideki Saito <hideki.saito@intel.com> | 2019-08-02 06:31:50 +0000 |
---|---|---|
committer | Hideki Saito <hideki.saito@intel.com> | 2019-08-02 06:31:50 +0000 |
commit | 09fac2450b199869891fdfc321d6dc314279f1b9 (patch) | |
tree | 3c3a8c3b9c99dbdb497f4a79ac4cef585b5e206a /llvm/lib/Analysis/LoopAccessAnalysis.cpp | |
parent | d21b3d346af2f6189638d853182e389555e7ccb9 (diff) | |
download | bcm5719-llvm-09fac2450b199869891fdfc321d6dc314279f1b9.tar.gz bcm5719-llvm-09fac2450b199869891fdfc321d6dc314279f1b9.zip |
[LV] Avoid building interleaved group in presence of WAW dependency
Reviewers: hsaito, Ayal, fhahn, anna, mkazantsev
Reviewed By: hsaito
Patch by evrevnov, thanks!
Differential Revision: https://reviews.llvm.org/D63981
llvm-svn: 367654
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 31afecbaa5e..d1a9d107870 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -1654,13 +1654,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); |