[llvm] [MemDep] Optimize SortNonLocalDepInfoCache sorting strategy for large caches with few unsorted entries (PR #143107)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 13 01:22:28 PDT 2025


https://github.com/DingdWang updated https://github.com/llvm/llvm-project/pull/143107

>From d6e4042439cd525a4eb177695b1aba43cd4e15de Mon Sep 17 00:00:00 2001
From: Dingding <wangdingding at bytedance.com>
Date: Fri, 6 Jun 2025 16:41:50 +0800
Subject: [PATCH 1/3] [MemDep] speed up SortNonLocalDepInfoCache with a big
 cache size

---
 .../lib/Analysis/MemoryDependenceAnalysis.cpp | 33 +++++++------------
 1 file changed, 12 insertions(+), 21 deletions(-)

diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index f062189bac6a0..8dffb3e422ed3 100644
--- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -51,6 +51,7 @@
 #include <cassert>
 #include <iterator>
 #include <utility>
+#include <cmath>
 
 using namespace llvm;
 
@@ -83,6 +84,9 @@ static cl::opt<unsigned>
 // Limit on the number of memdep results to process.
 static const unsigned int NumResultsLimit = 100;
 
+// for quickly calculating log
+const float ln2 = 0.69314718f;
+
 /// This is a helper function that removes Val from 'Inst's set in ReverseMap.
 ///
 /// If the set becomes empty, remove Inst's entry.
@@ -991,33 +995,20 @@ MemDepResult MemoryDependenceResults::getNonLocalInfoForBlock(
 static void
 SortNonLocalDepInfoCache(MemoryDependenceResults::NonLocalDepInfo &Cache,
                          unsigned NumSortedEntries) {
-  switch (Cache.size() - NumSortedEntries) {
-  case 0:
-    // done, no new entries.
-    break;
-  case 2: {
-    // Two new entries, insert the last one into place.
-    NonLocalDepEntry Val = Cache.back();
-    Cache.pop_back();
-    MemoryDependenceResults::NonLocalDepInfo::iterator Entry =
-        std::upper_bound(Cache.begin(), Cache.end() - 1, Val);
-    Cache.insert(Entry, Val);
-    [[fallthrough]];
-  }
-  case 1:
-    // One new entry, Just insert the new value at the appropriate position.
-    if (Cache.size() != 1) {
+
+  auto s = Cache.size() - NumSortedEntries;
+  if (s < log2(Cache.size()) * ln2) {
+    while (s>0) {
       NonLocalDepEntry Val = Cache.back();
       Cache.pop_back();
       MemoryDependenceResults::NonLocalDepInfo::iterator Entry =
-          llvm::upper_bound(Cache, Val);
+        std::upper_bound(Cache.begin(), Cache.end() - 1, Val);
       Cache.insert(Entry, Val);
+      s--;
     }
-    break;
-  default:
-    // Added many values, do a full scale sort.
+  }
+  else {
     llvm::sort(Cache);
-    break;
   }
 }
 

>From 820f3c9d17e41db5d6f2edd45440a83e1cf3c4ff Mon Sep 17 00:00:00 2001
From: Dingding <wangdingding at bytedance.com>
Date: Thu, 12 Jun 2025 19:37:15 +0800
Subject: [PATCH 2/3] format & handle cases where cache size is 1

---
 llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index 8dffb3e422ed3..6206bd00ee698 100644
--- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -51,7 +51,6 @@
 #include <cassert>
 #include <iterator>
 #include <utility>
-#include <cmath>
 
 using namespace llvm;
 
@@ -84,9 +83,6 @@ static cl::opt<unsigned>
 // Limit on the number of memdep results to process.
 static const unsigned int NumResultsLimit = 100;
 
-// for quickly calculating log
-const float ln2 = 0.69314718f;
-
 /// This is a helper function that removes Val from 'Inst's set in ReverseMap.
 ///
 /// If the set becomes empty, remove Inst's entry.
@@ -995,19 +991,19 @@ MemDepResult MemoryDependenceResults::getNonLocalInfoForBlock(
 static void
 SortNonLocalDepInfoCache(MemoryDependenceResults::NonLocalDepInfo &Cache,
                          unsigned NumSortedEntries) {
-
+  if (Cache.size() == 1)
+    return;
   auto s = Cache.size() - NumSortedEntries;
-  if (s < log2(Cache.size()) * ln2) {
-    while (s>0) {
+  if (s < Log2_32(Cache.size()) * llvm::numbers::ln2) {
+    while (s > 0) {
       NonLocalDepEntry Val = Cache.back();
       Cache.pop_back();
       MemoryDependenceResults::NonLocalDepInfo::iterator Entry =
-        std::upper_bound(Cache.begin(), Cache.end() - 1, Val);
+          llvm::upper_bound(Cache, Val);
       Cache.insert(Entry, Val);
       s--;
     }
-  }
-  else {
+  } else {
     llvm::sort(Cache);
   }
 }

>From b4d27bae2fdee4419ae843cd252042c356623652 Mon Sep 17 00:00:00 2001
From: Dingding <wangdingding at bytedance.com>
Date: Fri, 13 Jun 2025 16:22:09 +0800
Subject: [PATCH 3/3] fix bug in insertSort

---
 llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index 6206bd00ee698..9de48c40f0952 100644
--- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -999,7 +999,7 @@ SortNonLocalDepInfoCache(MemoryDependenceResults::NonLocalDepInfo &Cache,
       NonLocalDepEntry Val = Cache.back();
       Cache.pop_back();
       MemoryDependenceResults::NonLocalDepInfo::iterator Entry =
-          llvm::upper_bound(Cache, Val);
+          std::upper_bound(Cache.begin(), Cache.end() - s + 1, Val);
       Cache.insert(Entry, Val);
       s--;
     }



More information about the llvm-commits mailing list